<!DOCTYPE html> <html lang = “ja”> <head> <meta charset = “UFT-8”> <title></title> </head> <body> <?php $dsn = "mysql:host=localhost;dbname=hogemoge;charset=utf8;"; $user = 'root'; $pass = ''; try{ // DBへ接続 $db = new PDO($dsn,$user,$pass); // エラー時に例外処理をthrowする $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); if ($db == null){ print('接続に失敗しました。<br>'); }else{ print('接続に成功しました。<br>'); } // プリペアドステートメントを利用 $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // トランザクション開始 $db->beginTransaction(); // SQL作成 $sql1 = 'CREATE TABLE hoge( id INT(11) AUTO_INCREMENT PRIMARY KEY, name VARCHAR(10), age INT(11), hobby VARCHAR(10), )charset = utf8'; try{ // SQL実行 $q = $db -> query($sql1); $results = $q->fetchall(); $aryInsert=[[':name'=>'hogehoge', ':age'=>10, ':hobby'=>'昼寝'], [':name'=>'mogemoge', ':age'=>12, ':hobby'=>'歌'], [':name'=>'hogehoge2', ':age'=>10, ':hobby'=>'散歩'], [':name'=>'hogehoge3', ':age'=>15, ':hobby'=>'映画'], ]; // SQL作成 $sql = $pdo->prepare("INSERT INTO hoge( name, age, hobby ) VALUES ( :name, :age, :hobby )"); $arySql1=[]; // 行(レコード)の繰り返し foreach($aryInsert as $key1 => $val1){ $arySql2 = []; //列(カラム)の繰り返し foreach($val1 as $key2 => $val2){ $arySql2[] = ':'.$key2.$key1; } $arySql1[] = '('.implode(',', $arySql2).')'; } $sql .= implode(',', $arySql1); $sth = $pdo -> prepare($sql); foreach($aryInsert as $key1 => $val1){ foreach($val1 as $key2 => $val2){ $sth -> bindValue(':'.$key2.$key1, $val2); } } } }catch (PDOException $e) { $db->rollBack(); echo $e->getMessage(); die(); } // 接続を閉じる $dbh = null; ?> </body> </html>
前提・実現したいこと
PHPからデータベース・テーブル作成をしています。
DBに接続可能・データベースも作成済みです。
テーブルが作成できても、その先に進めません。
データをインサートする際に以下のエラーメッセージが発生しました。
### エラーメッセージ(XAMPPブラウザ表示)
接続に成功しました。 SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'fruits' already exists
該当のソースコード
// SQL実行 $q = $db -> query($sql1); $results = $q->fetchall(); $aryInsert=[[':name'=>'plum', ':price'=>240, ':stock'=>40], [':name'=>'kiwi', ':price'=>120, ':stock'=>80], [':name'=>'lemon', ':price'=>180, ':stock'=>50], [':name'=>'melon', ':price'=>360, ':stock'=>30], ]; // SQL作成 $sql = $pdo->prepare("INSERT INTO fruits( name, price, stock ) VALUES ( :name, :price, :stock )"); $arySql1=[]; // 行(レコード)の繰り返し foreach($aryInsert as $key1 => $val1){ $arySql2 = []; //列(カラム)の繰り返し foreach($val1 as $key2 => $val2){ $arySql2[] = ':'.$key2.$key1; } $arySql1[] = '('.implode(',', $arySql2).')'; } $sql .= implode(',', $arySql1); $sth = $pdo -> prepare($sql); foreach($aryInsert as $key1 => $val1){ foreach($val1 as $key2 => $val2){ $sth -> bindValue(':'.$key2.$key1, $val2); } } }
試したこと
try/catchの区切りがいまいちわかっていないため、もしかしたらそれが原因なのではないかと思います。
初心者のもので、まだまだコード不備あると思いますが、なんなりとご教示いただけますと幸いです。
補足情報(FW/ツールのバージョンなど)
vscode/xampp/DBeaverを使用
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。