手習い。
<?php init(); main(); function init(){ // php.ini 代替設定 // error_log() method により、apache error_log へ出力する為 ini_set('display_errors', 1); ini_set("error_reporting",E_ALL); ini_set("log_errors","on"); ini_set('error_log', 'php://stderr'); // ini_set('error_log', '/path/to/logs/php.log'); ini_set("date.timezone", "Asia/Tokyo"); // session有効期間 ini_set( 'session.gc_divisor', 1); ini_set( 'session.gc_maxlifetime', 60*30 ); //sec } function main(){ foreach($_GET as $get_param_key => $get_param_val){ //入力画面→確認画面 遷移時 if(strcmp($get_param_key,"callback_input_to_confirm")==0){ return main_input_to_confirm($get_param_key); } //確認画面 表示時 if(strcmp($get_param_key,"callback_init_confirm_page")==0){ return main_init_confirm_page($get_param_key); } //確認画面→完了画面 遷移時 if(strcmp($get_param_key,"callback_confirm_to_complete")==0){ return main_confirm_to_complete($get_param_key); } } } //入力画面→確認画面 遷移時 function main_input_to_confirm($callback_method){ // session id設定とsession開始 session_id(sha1(uniqid(microtime()))); if( session_start() ){ $session_id = session_id(); } // TODO フォームIDの考え方は、現行担当に要確認 $form_id = "1"; // フォーム定義(設定)のload $form_defs = load_form_defs($form_id); $params_defs = $form_defs["definition"]; // request parameterの取得とvalidation $req_params_tmp = load_req_params($params_defs); $req_params = $req_params_tmp[0]; $errors = $req_params_tmp[1]; $req_params_json = json_encode($req_params,JSON_UNESCAPED_UNICODE); $_SESSION['req_params'] = $req_params_json; $req_result = array(); if( count($errors)==0 ){ $req_result["result"] = "OK"; $req_result["session_id"] = $session_id; $req_result_json = json_encode($req_result, JSON_UNESCAPED_UNICODE); echo $callback_method ."(".$req_result_json .");"; return; } $req_result["result"] = "NG"; $req_result["errors"] = $errors; $req_result_json = json_encode($req_result, JSON_UNESCAPED_UNICODE); echo $callback_method ."(".$req_result_json .");"; // セッション情報は気 $_SESSION = array(); session_destroy(); return; } //確認画面 表示時 function main_init_confirm_page($callback_method){ // session情報を入力画面から引継ぎ $session_id = $_POST["session_id"]; session_id($session_id); session_start(); $req_params_json = $_SESSION['req_params']; try{ $req_params = json_decode($req_params_json,true,512,JSON_THROW_ON_ERROR); }catch(JsonException $e){ $tmp_msg = implode(" ",["json_decode()",$e->getMessage(),$req_params_json]); error_log($tmp_msg); echo $callback_method .'({"result":"NG","sys_msg":"bad session or bad json"});'; return; } $req_result = array(); $req_result["result"] = "OK"; $req_result["req_params"] = $req_params; $req_result_json = json_encode($req_result, JSON_UNESCAPED_UNICODE); echo $callback_method ."(".$req_result_json .");"; } //確認画面→完了画面 遷移時 function main_confirm_to_complete($callback_method){ $session_id = $_POST["session_id"]; session_id($session_id); session_start(); $req_params_json = $_SESSION['req_params']; // TODO 送信処理として、DB登録やメール送信?があるが、 // 既存のphp srcが、そのまま動作するらしい為、後日 $req_result = array(); $req_result["result"] = "OK"; $req_result_json = json_encode($req_result, JSON_UNESCAPED_UNICODE); echo $callback_method ."(".$req_result_json .");"; $_SESSION = array(); session_destroy(); } function load_req_params($params_defs){ $req_params = array(); $errors = array(); foreach($params_defs as $atri_key => $param_defs){ if(! array_key_exists($atri_key, $_POST)){ //必須項目の場合、error情報を設定 if(array_key_exists("requires", $param_defs) && $param_defs["requires"] ){ if(! array_key_exists($atri_key, $errors)){ $errors[$atri_key] = []; } array_push($errors[$atri_key],$param_defs["e_require"]); } continue; } // 送信dataがtextの場合 if(! is_array($_POST[$atri_key]) ){ //validate $checked_info = validate_param($param_defs,$_POST[$atri_key]); $atri_val = $checked_info[0]; $err_tmp = $checked_info[1]; if(mb_strlen($atri_val)){ $req_params[$atri_key] = $atri_val; } // validataionによるerror情報がある場合 if(count($err_tmp)){ if(! array_key_exists($atri_key, $errors)){ $errors[$atri_key] = []; } array_push($errors[$atri_key],$err_tmp); } continue; } // 送信dataが配列の場合 foreach($_POST[$atri_key] as $idx => $atri_val){ //validate $checked_info = validate_param($param_defs,$atri_val); $atri_val = $checked_info[0]; $err_tmp = $checked_info[1]; if(mb_strlen($atri_val)){ if(! array_key_exists($atri_key, $req_params)){ $req_params[$atri_key] = []; } array_push($req_params[$atri_key],$atri_val); } // validataionによるerror情報がある場合 if(count($err_tmp)){ if(! array_key_exists($atri_key, $errors)){ $errors[$atri_key] = []; } array_push($errors[$atri_key],$err_tmp); } } } return array($req_params,$errors); } function validate_param($param_defs,$atri_val){ $errors = array(); $atri_val = my_trim($atri_val); //最大文字数 if(array_key_exists("max", $param_defs)){ if($param_defs["max"] < mb_strlen($atri_val)){ array_push($errors,$param_defs["e_length"]); } } //その他rule if(array_key_exists("rule", $param_defs)){ if(strcmp($param_defs["rule"],"ZENKAKU")==0){ //全角 $atri_val = mb_convert_kana($atri_val, "AKV"); //半角->全角変換 }elseif(strcmp($param_defs["rule"],"KKANA")==0){ //全角カナ $atri_val = mb_convert_kana($atri_val, "KC"); //半角->全角変換 // 名前によっては、数字等を含む場合も考えられる為、厳密なカナチェックは行わない // array_push($errors,$param_defs["e_rule"]); }elseif(strcmp($param_defs["rule"],"EMAIL")==0 || strcmp($param_defs["rule"],"POST" )==0 || strcmp($param_defs["rule"],"TEL" )==0 ){ $atri_val = mb_convert_kana($atri_val, "as"); //全角->半角変換 if(! preg_match("/^[[:graph:]|[:space:]]+$/i", $atri_val)) { array_push($errors,$param_defs["e_rule"]); } } } return array($atri_val,$errors); } function load_form_defs($form_id){ $form_def_file = "etc/form_def_$form_id.json"; $file_obj = new SplFileObject($form_def_file,"rb"); $file_data = $file_obj->fread($file_obj->getSize()); $form_defs = array(); try{ $form_defs = json_decode($file_data,true,512,JSON_THROW_ON_ERROR); }catch(JsonException $e){ $tmp_msg = implode(" ",["json_decode()",$e->getMessage(),$form_def_file]); error_log($tmp_msg); return array(); } return $form_defs; } function my_trim($org_str){ return trim(trim($org_str)," "); }