• ベストアンサー

php pdo 主キー

番号 int プライマリーキ- 氏名 varchar 住所 varchar データベースで入力フォームから新規登録をしたいのですが Duplicate entry '11' for key 'PRIMARY' 11はすでに存在していると出ます オートナンバー型に変えずに"すでに登録されている番号です"というエラーメッセージを出し、もう一度登録画面に戻るしたいのですが、 try文で例外処理させれば出来ますか? また出来るのであればどういう風に記述するか教えてもらえますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5239/13707)
回答No.1

やり方は2つ 1つは先に select してみてデータが有ればエラーメッセージを表示する。 もう1つは insert してみてエラーが返ってきたら、DBのエラー内容を解読してページにエラーメッセージを表示する。

noname#197690
質問者

お礼

ありがとうございます 下記は更新画面になります こちらのプログラムをアップデートphpに送っています <head> <body> <blockquote> <br><br> 更新画面 <br><br><br> <?php $ID = htmlspecialchars($_GET['番号']); $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $st = $pdo->prepare("SELECT * FROM tbl_test WHERE 番号=?"); $st->execute(array($ID)); $row = $st->fetch(); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); ?> <form action="update.php" method="post"> 番号 <?php echo $ID ?><br><br><br> <input type="hidden" name="ID" value="<?php echo $ID; ?>"> 氏名 <input type="text" size = "50" name="NAME" value="<?php echo $NAME ?>"><br><br><br> 住所 <input type="text" size = "130"name="ADDR" value="<?php echo $ADDR ?>"><br><br><br> <BR><BR> <input type="submit" value = "更新する" style ="font-size:20px; WIDTH: 100px; HEIGHT: 40px"> <A HREF="http://localhost/top.php"> <INPUT TYPE = "button" VALUE = "一覧に戻る" style ="font-size:20px; WIDTH: 140px; HEIGHT: 40px"></A> update.phpです <html> <body> <blockquote> <?php $err = ""; if(empty($_POST['NAME'])) $err.= "<br><br>名前を入力してください。<br><br>"; if(empty($_POST['ADDR'])) $err.= "<br><br>住所を入力してください。<br><br>"; if(empty($err)) { $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $st = $pdo->prepare("UPDATE tbl_test SET 氏名=?,住所=?WHERE 番号=?"); $st->execute(array($_POST['NAME'], $_POST['ADDR'],$_POST['ID'])); echo "<br><br>レコードを修正しました<br>"; }else{ echo $err; } ?> <br><br><br> <a href="http://localhost/top.php"> <input type = "submit" value = "一覧に戻る" style ="font-size:20px; WIDTH: 150px; HEIGHT: 40px"></A> </blockquote> </body> </html> どんな感じに書けばいいですか?

noname#197690
質問者

補足

すいません間違えました こちらが新規登録のphpです <html> <body> <blockquote> <?php $con=mysqli_connect("localhost","root","admin","db_test"); // Check connection if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } if ($_POST['ID'] != '' && $_POST['NAME'] != '' && $_POST['ADDR'] != '') { $id = mysqli_real_escape_string($con, $_POST['ID']); $name = mysqli_real_escape_string($con, $_POST['NAME']); $addr = mysqli_real_escape_string($con, $_POST['ADDR']); $sql="INSERT INTO tbl_test (番号, 氏名, 住所) VALUES ('$id','$name','$addr')"; if (!mysqli_query($con,$sql)) { die('Error: ' . mysqli_error($con)); } echo "登録完了しました"; } else { echo "<br>番号が既に登録されている番号か<BR>またはデータが未入力の箇所があります。すべてデータを入力してください"; } mysqli_close($con); ?> <br><br><br> <a href="http://localhost/regist.php"> <INPUT TYPE = "button" VALUE = "登録画面に戻る" style ="font-size:20px; WIDTH: 140px; HEIGHT: 40px"></A> <br><br><br> <A HREF="http://localhost/top.php"> <INPUT TYPE = "button" VALUE = "一覧に戻る" style ="font-size:20px; WIDTH: 140px; HEIGHT: 40px"></A> </blockquote> </body> </html>

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

insert ignore into でデータを投入して、 php側でaffected_rows()やrowCount()で作用した行数を数え 0だった場合にメッセージをだせばいいのでは?

noname#197690
質問者

お礼

ありがとうございます 下記は更新画面になります こちらのプログラムをアップデートphpに送っています <head> <body> <blockquote> <br><br> 更新画面 <br><br><br> <?php $ID = htmlspecialchars($_GET['番号']); $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $st = $pdo->prepare("SELECT * FROM tbl_test WHERE 番号=?"); $st->execute(array($ID)); $row = $st->fetch(); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); ?> <form action="update.php" method="post"> 番号 <?php echo $ID ?><br><br><br> <input type="hidden" name="ID" value="<?php echo $ID; ?>"> 氏名 <input type="text" size = "50" name="NAME" value="<?php echo $NAME ?>"><br><br><br> 住所 <input type="text" size = "130"name="ADDR" value="<?php echo $ADDR ?>"><br><br><br> <BR><BR> <input type="submit" value = "更新する" style ="font-size:20px; WIDTH: 100px; HEIGHT: 40px"> <A HREF="http://localhost/top.php"> <INPUT TYPE = "button" VALUE = "一覧に戻る" style ="font-size:20px; WIDTH: 140px; HEIGHT: 40px"></A> update.phpです <html> <body> <blockquote> <?php $err = ""; if(empty($_POST['NAME'])) $err.= "<br><br>名前を入力してください。<br><br>"; if(empty($_POST['ADDR'])) $err.= "<br><br>住所を入力してください。<br><br>"; if(empty($err)) { $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $st = $pdo->prepare("UPDATE tbl_test SET 氏名=?,住所=?WHERE 番号=?"); $st->execute(array($_POST['NAME'], $_POST['ADDR'],$_POST['ID'])); echo "<br><br>レコードを修正しました<br>"; }else{ echo $err; } ?> <br><br><br> <a href="http://localhost/top.php"> <input type = "submit" value = "一覧に戻る" style ="font-size:20px; WIDTH: 150px; HEIGHT: 40px"></A> </blockquote> </body> </html> どんな感じに書けばいいですか?

noname#197690
質問者

補足

すいません間違えました こちらが新規登録画面です <html> <body> <blockquote> <?php $con=mysqli_connect("localhost","root","admin","db_test"); // Check connection if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } if ($_POST['ID'] != '' && $_POST['NAME'] != '' && $_POST['ADDR'] != '') { $id = mysqli_real_escape_string($con, $_POST['ID']); $name = mysqli_real_escape_string($con, $_POST['NAME']); $addr = mysqli_real_escape_string($con, $_POST['ADDR']); $sql="INSERT INTO tbl_test (番号, 氏名, 住所) VALUES ('$id','$name','$addr')"; if (!mysqli_query($con,$sql)) { die('Error: ' . mysqli_error($con)); } echo "登録完了しました"; } else { echo "<br>番号が既に登録されている番号か<BR>またはデータが未入力の箇所があります。すべてデータを入力してください"; } mysqli_close($con); ?> <br><br><br> <a href="http://localhost/regist.php"> <INPUT TYPE = "button" VALUE = "登録画面に戻る" style ="font-size:20px; WIDTH: 140px; HEIGHT: 40px"></A> <br><br><br> <A HREF="http://localhost/top.php"> <INPUT TYPE = "button" VALUE = "一覧に戻る" style ="font-size:20px; WIDTH: 140px; HEIGHT: 40px"></A> </blockquote> </body> </html> 結構大変ですかね?

関連するQ&A