end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

問合せフォーム用 ajax web api server side php code

手習い。

<?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)," ");
}