データベースにデータを追加する際に以下のようなエラーがでます。
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`inventory`.`goods`, CONSTRAINT `brand_id` FOREIGN KEY (`brand`) REFERENCES `brand` (`id`))
実現したいこととしては、「index.php」で入力したデータを、「insert.php」によってデータベース(inventry)に追加するというプログラムを書いています。
データベースの構造は以下のようになっています。
他に必要な情報があれば教えてください。
ソースコードは以下です。
index.php
1<?php 2 require_once("util.php"); 3 4 $user = 'inventoryuser'; 5 $password = 'pw4inventoryuser'; 6 7 //利用するデータベース 8 $dbName = 'inventory'; 9 10 //MySQLサーバー 11 $host = 'localhost:3306'; 12 13 //MySQLのDSN文字列 14 $dsn = "mysql:host={$host};dbname={$dbName};charset=utf8"; 15?> 16 17 <?php 18 //MySQLデータベースに接続する 19 try{ 20 $pdo = new PDO($dsn, $user, $password); 21 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 22 23 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 24 echo "データベース{$dbName}に接続しました。<br>"; 25 26 27 $sql = "SELECT id, name FROM brand"; 28 29 //プリペアードステートメントを作る 30 $stm = $pdo->prepare($sql); 31 32 //SQL文を実行する 33 $stm->execute(); 34 35 //結果の取得(連想配列で受け取る) 36 $brand = $stm->fetchAll(PDO::FETCH_ASSOC); 37 }catch (Exception $e) { 38 echo '<span class="error">エラーがありました。</span><br>'; 39 echo $e -> getMessage(); 40 exit(); 41 } 42 ?> 43 44 <!DOCTYPE html> 45 <html lang="en" dir="ltr"> 46 <head> 47 <meta charset="utf-8"> 48 <title>データベーステスト</title> 49 </head> 50 <body> 51 <form method="POST" action="insert.php"> 52 <ul> 53 <li> 54 <label>情報を追加します<br> 55 <span>商品ID : </span> 56 <input type="text" name="id" placeholder="商品ID"><br> 57 <span>年齢を入力してください:</span> 58 <input type="text" name="name" placeholder="商品名"><br> 59 <span>性別を入力してください:</span> 60 <input type="text" name="size" placeholder="(未入力でもOK)"><br> 61 </label> 62 </li> 63 <li> 64 <select name="brand"> 65 <?php 66 foreach($brand as $row){ 67 echo '<option value=">', $row["id"], '">', $row["name"], "</option>"; 68 } 69 ?> 70 </select> 71 </li> 72 <li> 73 <label>個数: 74 <input type="number" name="quantity" placeholder="半角数字"> 75 </li> 76 <li><input type="submit" value="追加する"></li> 77 </ul> 78 </form> 79 </body> 80</html> 81
insert.php
1 2<?php 3require_once("util.php"); 4$gobackURL = "index.php"; 5 6$errors= []; 7if(!isset($_POST["id"])||($_POST["id"]==="")){ 8 $errors[] = "商品IDが空です"; 9} 10 11if(!isset($_POST["name"])||($_POST["name"]==="")){ 12 $errors[]="商品名が空です。"; 13} 14if(!isset($_POST["brand"])||($_POST["brand"]==="")){ 15 $errors[] = "ブランドが空です。"; 16} 17if(!isset($_POST["quantity"])||($_POST["quantity"]==="")){ 18 $errors[] = "個数が整数値ではありません。"; 19} 20 21if(count($errors)>0){ 22 echo '<ol class="error">'; 23 foreach($errors as $value){ 24 echo "<li>", $value, "</li>"; 25 } 26 echo "</ol>"; 27 echo "<hr>"; 28 exit(); 29} 30 31$user = 'inventoryuser'; 32$password = 'pw4inventoryuser'; 33 34//利用するデータベース 35$dbName = 'inventory'; 36 37//MySQLサーバー 38 $host = 'localhost:3306'; 39 40 //MySQLのDSN文字列 41 $dsn = "mysql:host={$host};dbname={$dbName};charset=utf8"; 42?> 43 44<!DOCTYPE html> 45<html lang="en" dir="ltr"> 46 <head> 47 <meta charset="utf-8"> 48 <title>データベーステスト</title> 49 </head> 50 <body> 51 <?php 52 //MySQLデータベースに接続する 53 54 try{ 55 $pdo = new PDO($dsn, $user, $password); 56 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 57 58 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 59 echo "データベース{$dbName}に接続しました。<br>"; 60 }catch (Exception $e) { 61 echo '<span class="error">エラーがありました。</span><br>'; 62 echo $e -> getMessage(); 63 exit(); 64 } 65 66 try{ 67 $pdo->beginTransaction(); 68 $sql1 = "INSERT INTO goods (id, name, size, brand) 69 VALUES (:id, :name, :size, :brand)"; 70 $sql2 = "INSERT INTO stock (goods_id, quantity) 71 VALUES (:goods_id, :quantity)"; 72 73 //プリペアードステートメントを作る 74 $stm1 = $pdo->prepare($sql1); 75 $stm2 = $pdo->prepare($sql2); 76 77 $stm1 -> bindValue(':id', $_POST["id"], PDO::PARAM_STR); 78 $stm1 -> bindValue(':name', $_POST["name"], PDO::PARAM_STR); 79 $stm1 -> bindValue(':size', $_POST["size"], PDO::PARAM_STR); 80 $stm1 -> bindValue(':brand', $_POST["brand"], PDO::PARAM_STR); 81 82 $stm2 -> bindValue(':goods_id', $_POST["id"], PDO::PARAM_STR); 83 $stm2 -> bindValue(':quantity', $_POST["quantity"], PDO::PARAM_INT); 84 //SQL文を実行する 85 $stm1->execute(); 86 $stm2->execute(); 87 88 $pdo->commit(); 89 90 echo "商品データ/在庫データを追加しました。"; 91 }catch (Exception $e) { 92 $pdo-> rollBack(); 93 echo '<span class="error">登録エラーがありました。</span><br>'; 94 echo $e -> getMessage(); 95 exit(); 96 } 97 ?> 98 99 <hr> 100 <p><a href="<?php echo $gobackURL;?>">戻る</a></p> 101 </body> 102</html> 103
回答3件
あなたの回答
tips
プレビュー