質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

3854閲覧

クエリ失敗して登録することができない

twsoccer15

総合スコア12

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/03/01 07:31

前提・実現したいこと

ユーザー登録を実装しているところなんですが、クエリ実行するとクエリ失敗のデバックが返されます。 何が原因でしょうか。お手数ですがご回答よろしくお願い致します。

発生している問題・エラーメッセージ

[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); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Invalid parameter number なので、クエリのプレースホルダの数とパラメータの数が一致しているかを確認する。

INSERT INTO users (email,password,login_time,create_date) VALUES(:email,:password,:login_time,:create_date)

php

1 $data = array(':email' => $email, ':pass' => password_hash($pass, PASSWORD_DEFAULT), 2 ':login_time' => date('Y-m-d H:i:s'), 3 ':create_date' => date('Y-m-d H:i:s'));

こんな書き方だと見づらいし間違いを誘発するので、ちゃんと整形しよう。

php

1$data = array( 2 ':email' => $email, 3 ':pass' => password_hash($pass, PASSWORD_DEFAULT), 4 ':login_time' => date('Y-m-d H:i:s'), 5 ':create_date' => date('Y-m-d H:i:s') 6 );

数は問題ないけど、SQLは :password に対し、パラメータ側は、:pass になっている。

教訓:見辛いコードは害悪

投稿2020/03/01 07:37

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

twsoccer15

2020/03/01 07:51

ご回答ありがとうこざいます。SQLにセットしたキーに合わせて実行してみたのですか、同じエラーログがでます。他にやるべきことはありますでしょうか。 twsoccer15
退会済みユーザー

退会済みユーザー

2020/03/01 07:52 編集

同じエラーならやり方が間違っている。 違うエラーなら、その情報を出さないと回答者にはわからん
guest

0

SQLにセットしたキー:password
PHPからセットしようとしているキー:pass

$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'));

投稿2020/03/01 07:35

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

twsoccer15

2020/03/01 07:45

ご回答ありがとうこざいます。SQLにセットしたキーに合わせて実行してみたのですか、同じエラーログがでます。他にやるべきことはありますでしょうか。
m.ts10806

2020/03/01 08:48

質問のコードがそのままなのでこちらの意図通り調整されたかどうか判断する材料がありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問