前提・実現したいこと
配列のデータを、MYSQLのデータベースへISERTしたい。
発生している問題・エラーメッセージ
配列のINSERTがうまくいかず、どうしても失敗した場合Falseが返ってきて、解決できないのでアドバイスを頂ければと思います。
当方としては、どこか原因かわからないのでぜひお願いします。
※DB接続自体は問題ないです。
テーブル
|no1(int)|no2(int)|first_name(varchar)|last_name(varchar)|email(varchar)
|:--|:--|--|
|1|1|tokumei|kibou| mailaddress
該当のソースコード
$dataの内容 ※Stringの中身は、見せられないので空白にしております。 array (size=3) 0 => array (size=5) 'no1' => string '' (length=0) 'no2' => string '' (length=0) 'first_name' => string '' (length=0) 'last_name' => string '' (length=0) 'email' => string '' (length=0) 1 => array (size=5) 'no1' => string '' (length=0) 'no2' => string '' (length=0) 'first_name' => string '' (length=0) 'last_name' => string '' (length=0) 'email' => string '' (length=0) 2 => array (size=5) 'no1' => string '' (length=0) 'no2' => string '' (length=0) 'first_name' => string '' (length=0) 'last_name' => string '' (length=0) 'email' => string '' (length=0) . . .
php
1public function Insert($data) { 2 foreach ($data as $key => $val) {//プレースホルダーの生成 3 foreach ($val as $key2 => $val2) { 4 $values[] = ':' . $key2; 5 } 6 } 7 8 /* 9 こちらは正常、ただし一つだけしか入らない。 10 $sql = "INSERT INTO $this->table_name VALUES 11 (1, 1,'名前', 'なし' , 'mailaddress@ddd.jp')"; 12 */ 13 $sql = sprintf("INSERT INTO %s VALUES (%s)",$this->table_name,implode(',', $values)); 14 15 16 $stmt = $this->db->prepare($sql);//挿入する値は空のまま、SQL実行の準備 17 18 foreach ($data as $key => $val) { 19 foreach ($val as $key2 => $val2) { 20 $stmt->bindValue(':' . $key2, $val2);//成功した場合True、失敗した場合Falseが返ってくる 21 } 22 } 23 24 $result = $stmt->execute();//データベースに書き込み実行する 25 26 //簡易チェック 27 if($result){ 28 var_dump('成功'); 29 }else{ 30 var_dump('失敗'); 31 } 32 33 return $result; 34}
試したこと
var_dump($data)や、簡易チェックを用いたり、実際に動作してやってみたのですが、データベースのほうに挿入されません・・
###修正後コード
以下の通りコードの変更いたしました。
こちらでも、書き込み失敗します。
SQL構文
'INSERT INTO テーブル名 VALUES
(:no10,:no20,:first_name0,:last_name0,:email0),
(:no11,:no21,:first_name1,:last_name1,:email1),
(:no12,:no22,:first_name2,:last_name2,:email2),
(:no13,:no23,:first_name3,:last_name3,:email3)'
PHP
1try { 2 $values = []; 3 foreach ($data as $rownum => $row) { 4 $rowvalues = []; 5 foreach ($row as $column => $value) { 6 $rowvalues[] = ':' . $column . $rownum; 7 } 8 $values[] = '(' . implode(',', $rowvalues) . ')'; 9 } 10 $sql = sprintf("INSERT INTO %s VALUES %s", $this->table_name, implode(',', $values)); 11 $stmt = $this->db->prepare($sql); 12 if (!$stmt) { 13 echo "\nPDO::errorInfo():\n"; 14 var_dump($stmt->errorInfo()); 15 } 16 foreach ($data as $rownum => $row) { 17 foreach ($row as $column => $value) { 18 $stmt->bindValue(':' . $column . $row_num, $value); 19 } 20 } 21 $result = $stmt->execute(); 22 if ($result) { 23 var_dump('成功'); 24 } else { 25 var_dump('失敗'); 26 } 27} 28catch(PDOException $e) { 29 echo "データベースエラー(PDOエラー)"; 30 var_dump($e->getMessage()); 31} 32return $result; 33 34} 35
回答3件
あなたの回答
tips
プレビュー