質問
PHPで動的に生成したプレースホルダを含むSQL文について、そのプレースホルダの値のバインドを以下のようにやってみたのですが、データベースにはINSERTされません。execute関数に単純に連想配列を渡すだけではだめなのでしょうか?
PHP
1require 'db_connection.php'; 2 3// テスト用ダミーデータ 4$params = [ 5 'id' => 99, 6 'your_name' => 'John', 7 'email' => 'test3@test.com', 8 'url' => 'http://test3.com', 9 'gender' => '1', 10 'age' => '33', 11 'contact' => 'メッセージ', 12 'created_at' => '2023-01-28' 13]; 14 15$count = 0; 16$columns = ''; 17$values = ''; 18 19foreach(array_keys($params) as $key){ 20 if($count++>0){ 21 $column='id,your_name,email,url,gender,age,contact,created_at '; 22 $columns .= ','; 23 $values=':id,:your_name,:email,:url,:gender,:age,:contact,:created_at' 24 $values .= ','; 25 } 26 $columns .= $key; 27 $values .= ':'.$key; 28} 29 30$sql = 'insert into contacts ('. $columns .') values('. $values .')'; 31 32// var_dump($sql); // "insert into contacts (id,your_name,email,url,gender,age,contact,created_at) values(:id,:your_name,:email,:url,:gender,:age,:contact,:created_at)" 33// exit; 34 35$stmt = $pdo->prepare($sql); 36$stmt->execute($params); 37
試したこと
以下のテストは正常に動作しています(INSERTできています)
PHP
1require 'db_connection.php'; 2 3//INSERTテスト 4$stmt = $pdo->prepare('INSERT INTO contacts (id, your_name, email, url, gender, age, contact, created_at) VALUES(:id, :name, :email, :url, :gender, :age, :contact, :created_at)'); 5$stmt->bindValue(':id', 99); 6$stmt->bindValue(':name', '山田次郎'); 7$stmt->bindValue(':email', 'abc@abc.com'); 8$stmt->bindValue(':url', 'http://text'); 9$stmt->bindValue(':gender', 1); 10$stmt->bindValue(':age', 41); 11$stmt->bindValue(':contact', 'メッセージ'); 12$stmt->bindValue(':created_at', '2023-01-28'); 13$stmt->execute();
また以下のようにバインドをやってみたりもしましたが駄目でした
PHP
1 $stmt->bindValue(":id", $params['id'], PDO::PARAM_INT); 2 $stmt->bindValue(":your_name", $params['your_name'], PDO::PARAM_STR); 3 $stmt->bindValue(":email", $params['email'], PDO::PARAM_STR); 4 $stmt->bindValue(":url", $params['url'], PDO::PARAM_STR); 5 $stmt->bindValue(":gender", $params['gender'], PDO::PARAM_INT); 6 $stmt->bindValue(":age", $params['age'], PDO::PARAM_INT); 7 $stmt->bindValue(":contact", $params['contact'], PDO::PARAM_STR); 8 $stmt->bindValue(":created_at", $params['created_at'], PDO::PARAM_STR); 9 $stmt->execute(); //実行
回答1件