みなさま、いつもお世話になっております。アドバイスとご指摘をお願いします。
###前提・実現したいこと
自分で作った関数を利用してSQL文に引数をバインドさせてINSERTしたい。
###発生している問題・エラーメッセージ
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in /Volumes/Transcend_Kai/Dropbox/htdocs/registerTest.php on line 48
###該当のソースコード
php
1<?php 2 3error_reporting(E_ALL); 4ini_set('display_errors', 'On'); 5 6 7function registerUser($name, $email, $password){ 8 try{ 9 $pdo = dbConnect(); 10 $sql = 'INSERT INTO users (username, email, password, login_time, create_date) VALUE (:username,:email, :password, :login_time, :created_date)'; 11 $data = array(':username' => $name,':email' => $email, ':password' => password_hash($password, PASSWORD_DEFAULT), ':login_time'=> date('Y-m-d H:i:s'), ':created_time' => date('Y-m-d H:i:s')); 12 queryPost($pdo,$sql,$data); 13 }catch(Exception $e){ 14 error_log('エラー発生 '.$e->getMessage()); 15 echo '登録に失敗しました。'; 16 } 17} 18 19/** 20* 21* @return PDO $pdoのインスタンスを生成 22*/ 23function dbConnect(){ 24 $dsn ='mysql:dbname=freemarket;host=localhost;charset=utf8'; 25 $user = 'root'; 26 $password = 'root'; 27 $option = array( 28 // SQL実行失敗時にはエラーコードのみ設定 29 PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT, 30 // デフォルトフェッチモードを連想配列形式に設定 31 PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, 32 // バッファードクエリを使う(一度に結果セットをすべて取得し、サーバー負荷を軽減) 33 // SELECTで得た結果に対してもrowCountメソッドを使えるようにする 34 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true, 35 ); 36 $pdo = new PDO($dsn,$user,$password,$option); 37 return $pdo; 38} 39 40/** 41 * @param $pdo PDO 42 * @param $sql /prepare済みのもの 43 * @param $data /バインドするもの 44 * @return mixed $stmt 45 */ 46function queryPost($pdo, $sql, $data){ 47 $stmt = $pdo->prepare($sql); 48 $stmt -> execute($data); 49 return $stmt; 50} 51 52$name = 'darekasan'; 53$email = 'test@test.com'; 54$password = 'testpass'; 55 56registerUser($name,$email,$password); 57
###試したこと
エラーメッセージをたどって同じような問題に直面した方が与えられていたアドバイスをもとに、試行錯誤をしてみましたが、
$dataにどのような値を入れればいいのか結局わからずじまいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/20 13:27