前提・実現したいこと
ユーザー登録を実装しているところなんですが、クエリ実行するとクエリ失敗のデバックが返されます。 何が原因でしょうか。お手数ですがご回答よろしくお願い致します。
発生している問題・エラーメッセージ
[01-Mar-2020 07:01:50 UTC] デバック:「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「 [01-Mar-2020 07:01:50 UTC] デバック:ユーザー登録ページ [01-Mar-2020 07:01:50 UTC] デバック:「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「 [01-Mar-2020 07:01:50 UTC] デバック:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 画面表示処理開始 [01-Mar-2020 07:01:50 UTC] デバック:セッションID:karc8j20jtmehqg2200gdi9d80 [01-Mar-2020 07:01:50 UTC] デバック:セッション変数の中身:Array ( ) [01-Mar-2020 07:01:50 UTC] デバック:現在の日時タイムスタンプ:1583046110 [01-Mar-2020 07:01:50 UTC] デバック:クエリ成功。 [01-Mar-2020 07:01:50 UTC] PHP Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in /Applications/MAMP/htdocs/webservice/function.php on line 264 [01-Mar-2020 07:01:50 UTC] デバック:クエリ失敗しました。 [01-Mar-2020 07:01:50 UTC] デバック:失敗したSQL:PDOStatement Object ( [queryString] => INSERT INTO users (email,password,login_time,create_date) VALUES(:email,:password,:login_time,:create_date) )
該当のソースコード
<?php //共通変数・関数ファイルを読込み require('function.php'); debug('「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「'); debug('ユーザー登録ページ'); debug('「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「'); debugLogStart(); //post送信されていた場合 if(!empty($_POST)){ //変数にユーザー情報を代入 $email = $_POST['email']; $pass = $_POST['pass']; $pass_re = $_POST['pass_re']; //未入力チェック validRequired($email, 'email'); validRequired($pass, 'pass'); validRequired($pass_re, 'pass_re'); if(empty($err_msg)){ //emailの形式チェック validEmail($email, 'email'); //emailの最大文字数チェック validMaxLen($email, 'email'); //email重複チェック validEmailDup($email); //パスワードの半角英数字チェック validHalf($pass, 'pass'); //パスワードの最大文字数チェック validMaxLen($pass, 'pass'); //パスワードの最小文字数チェック validMinLen($pass, 'pass'); //パスワード(再入力)の最大文字数チェック validMaxLen($pass_re, 'pass_re'); //パスワード(再入力)の最小文字数チェック validMinLen($pass_re, 'pass_re'); if(empty($err_msg)){ //パスワードとパスワード再入力が合っているかチェック validMatch($pass, $pass_re, 'pass_re'); if(empty($err_msg)){ //例外処理 try { // DBへ接続 $dbh = dbConnect(); // SQL文作成 $sql = 'INSERT INTO users (email,password,login_time,create_date) VALUES(:email,:password,:login_time,:create_date)'; $data = array(':email' => $email, ':pass' => password_hash($pass, PASSWORD_DEFAULT), ':login_time' => date('Y-m-d H:i:s'), ':create_date' => date('Y-m-d H:i:s')); // クエリ実行 $stmt = queryPost($dbh, $sql, $data); // クエリ成功の場合 if($stmt){ //ログイン有効期限(デフォルトを1時間とする) $sesLimit = 60*60; // 最終ログイン日時を現在日時に $_SESSION['login_date'] = time(); $_SESSION['login_limit'] = $sesLimit; // ユーザーIDを格納 $_SESSION['user_id'] = $dbh->lastInsertId(); debug('セッション変数の中身:'.print_r($_SESSION,true)); header("Location:mypage.php"); //マイページへ } } catch (Exception $e) { error_log('エラー発生:' . $e->getMessage()); $err_msg['common'] = MSG07; } } } } } ?>
<?php //================================ // ログ //================================ //ログを取るか ini_set('log_errors','on'); //ログの出力ファイルを指定 ini_set('error_log','php.log'); //================================ // デバッグ //================================ //デバッグフラグ $debug_flg = true; //デバッグログ関数 function debug($str){ global $debug_flg; if(!empty($debug_flg)){ error_log('デバッグ:'.$str); } } //================================ // セッション準備・セッション有効期限を延ばす //================================ //セッションファイルの置き場を変更する(/var/tmp/以下に置くと30日は削除されない) session_save_path("/var/tmp/"); //ガーベージコレクションが削除するセッションの有効期限を設定(30日以上経っているものに対してだけ100分の1の確率で削除) ini_set('session.gc_maxlifetime', 60*60*24*30); //ブラウザを閉じても削除されないようにクッキー自体の有効期限を延ばす ini_set('session.cookie_lifetime ', 60*60*24*30); //セッションを使う session_start(); //現在のセッションIDを新しく生成したものと置き換える(なりすましのセキュリティ対策) session_regenerate_id(); //================================ // 画面表示処理開始ログ吐き出し関数 //================================ function debugLogStart(){ debug('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 画面表示処理開始'); debug('セッションID:'.session_id()); debug('セッション変数の中身:'.print_r($_SESSION,true)); debug('現在日時タイムスタンプ:'.time()); if(!empty($_SESSION['login_date']) && !empty($_SESSION['login_limit'])){ debug( 'ログイン期限日時タイムスタンプ:'.( $_SESSION['login_date'] + $_SESSION['login_limit'] ) ); } } //================================ // グローバル変数 //================================ //エラーメッセージ格納用の配列 $err_msg = array(); //================================ // バリデーション関数 //================================ //バリデーション関数(未入力チェック) function validRequired($str, $key){ if($str === ''){ //金額フォームなどを考えると数値の0はOKにし、空文字はダメにする global $err_msg; $err_msg[$key] = MSG01; } } //バリデーション関数(Email形式チェック) function validEmail($str, $key){ if(!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $str)){ global $err_msg; $err_msg[$key] = MSG02; } } //バリデーション関数(Email重複チェック) function validEmailDup($email){ global $err_msg; //例外処理 try { // DBへ接続 $dbh = dbConnect(); // SQL文作成 $sql = 'SELECT count(*) FROM users WHERE email = :email AND delete_flg = 0'; $data = array(':email' => $email); // クエリ実行 $stmt = queryPost($dbh, $sql, $data); // クエリ結果の値を取得 $result = $stmt->fetch(PDO::FETCH_ASSOC); //array_shift関数は配列の先頭を取り出す関数です。クエリ結果は配列形式で入っているので、array_shiftで1つ目だけ取り出して判定します if(!empty(array_shift($result))){ $err_msg['email'] = MSG08; } } catch (Exception $e) { error_log('エラー発生:' . $e->getMessage()); $err_msg['common'] = MSG07; } } //バリデーション関数(同値チェック) function validMatch($str1, $str2, $key){ if($str1 !== $str2){ global $err_msg; $err_msg[$key] = MSG03; } } //バリデーション関数(最小文字数チェック) function validMinLen($str, $key, $min = 6){ if(mb_strlen($str) < $min){ global $err_msg; $err_msg[$key] = MSG05; } } //バリデーション関数(最大文字数チェック) function validMaxLen($str, $key, $max = 256){ if(mb_strlen($str) > $max){ global $err_msg; $err_msg[$key] = MSG06; } } //バリデーション関数(半角チェック) function validHalf($str, $key){ if(!preg_match("/^[a-zA-Z0-9]+$/", $str)){ global $err_msg; $err_msg[$key] = MSG04; } } //電話番号形式チェック function validTel($str, $key){ if(!preg_match("/0\d{1,4}\d{1,4}\d{4}/", $str)){ global $err_msg; $err_msg[$key] = MSG10; } } //郵便番号形式チェック function validZip($str, $key){ if(!preg_match("/^\d{7}$/", $str)){ global $err_msg; $err_msg[$key] = MSG11; } } //半角数字チェック function validNumber($str, $key){ if(!preg_match("/^[0-9]+$/", $str)){ global $err_msg; $err_msg[$key] = MSG17; } } //固定長チェック function validLength($str, $key, $len = 8){ if( mb_strlen($str) !== $len ){ global $err_msg; $err_msg[$key] = $len . MSG14; } } //パスワードチェック function validPass($str, $key){ //半角英数字チェック validHalf($str, $key); //最大文字数チェック validMaxLen($str, $key); //最小文字数チェック validMinLen($str, $key); } //selectboxチェック function validSelect($str, $key){ if(!preg_match("/^[0-9]+$/", $str)){ global $err_msg; $err_msg[$key] = MSG15; } } //エラーメッセージ表示 function getErrMsg($key){ global $err_msg; if(!empty($err_msg[$key])){ return $err_msg[$key]; } } //================================ // データベース //================================ //DB接続関数 function dbConnect(){ //DBへの接続準備 $dsn = 'mysql:dbname=freemarket;host=localhost;charset=utf8'; $user = 'root'; $password = 'root'; $options = array( // SQL実行失敗時にはエラーコードのみ設定 PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT, // デフォルトフェッチモードを連想配列形式に設定 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // バッファードクエリを使う(一度に結果セットをすべて取得し、サーバー負荷を軽減) // SELECTで得た結果に対してもrowCountメソッドを使えるようにする PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true, ); // PDOオブジェクト生成(DBへ接続) $dbh = new PDO($dsn, $user, $password, $options); return $dbh; } //SQL実行関数 //function queryPost($dbh, $sql, $data){ // //クエリー作成 // $stmt = $dbh->prepare($sql); // //プレースホルダに値をセットし、SQL文を実行 // $stmt->execute($data); // return $stmt; //} function queryPost($dbh, $sql, $data){ //クエリー作成 $stmt = $dbh->prepare($sql); //プレースホルダに値をセットし、SQL文を実行 if(!$stmt->execute($data)){ debug('クエリに失敗しました。'); debug('失敗したSQL:'.print_r($stmt,true)); $err_msg['common'] = MSG07; return 0; } debug('クエリ成功。'); return $stmt; } function getUser($u_id){ debug('ユーザー情報を取得します。'); //例外処理 try { // DBへ接続 $dbh = dbConnect(); // SQL文作成 $sql = 'SELECT * FROM users WHERE id = :u_id AND delete_flg = 0'; $data = array(':u_id' => $u_id); // クエリ実行 $stmt = queryPost($dbh, $sql, $data); // クエリ結果のデータを1レコード返却 if($stmt){ return $stmt->fetch(PDO::FETCH_ASSOC); }else{ return false; } } catch (Exception $e) { error_log('エラー発生:' . $e->getMessage()); } // return $stmt->fetch(PDO::FETCH_ASSOC); }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/01 07:51
退会済みユーザー
2020/03/01 07:52 編集