• ベストアンサー

php pdo 主キー

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

noname#197690
noname#197690
  • MySQL
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5071/13248)
回答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

  • phpMyAdminの主キーについて

    phpMyAdminを用いて、MySQLを管理しております。 例えば、 ユーザーid  int ユーザーpw  int ユーザー名  varchar(20) 住所     varchar(30) 電話番号   varchar(10) 備考     text というように管理しております。 上記の場合ですと、主キーはユーザーidにのみ設定したいのですが、 int、varcharのデータ型にすると自動的に主キーが設定されてしまいます。(操作欄で主キーのアイコンがアクティブになる。) textですと主キーになりません。 主キーを解除しようとしますが、 #1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key というメッセージがでて解除できません。 主キーの設定はされていても、自分で主キーを設定したid以外は、同じ値を複数のレコードで保持できるので、問題はないのですが、これはどういう現象なのでしょうか?

    • ベストアンサー
    • MySQL
  • varchar型を主キーに…

    現在サーブレット/JSPを利用してDBにユーザアカウントを登録、削除、更新、一覧をできるようするシステムを作成しています。 テーブルを create table loginuser ( userId char(16) not null default '', passwd char(16) not null default '', name varchar(50) not null default '', accessFlg int(1) not null default '0', primary key(userId)); で作成しました。 IDが数字の時はDBに登録ができるのですがIDに文字を入力するとDBに登録されません。 主キーをvarchar型で使用するのは不可能なのでしょうか? ご返答をよろしくお願いします。

  • 【初歩】 主キー&ユニーク&AUTO_INCREMENTをつけたフィールドを作りたい

    ・WindowsXP(SP2)IIS5.1 ・PHP 5.2.5 Win32 ・MySQL 5.1.22 RC Win32 ・phpMyAdmin 2.11.4 会社マスター(KAISYA)に管理番号、Eメール、氏名、備考、更新日時とあります。これらのうち、 ・「管理番号」に、主キー、ユニーク制約、AUTO_INCREMENTを。 ・「Eメール」に、主キー、ユニーク制約を それぞれつけるにはどのようなSQL文を発行したらいいかご教示ください。 phpMyAdminで発行した下記のSQL文ですと、 CREATE TABLE IF NOT EXISTS `KAISYA` ( `KanriNo` int unsigned AUTO_INCREMENT COMMENT '管理番号', `Email` varchar( 80 ) NOT NULL default '' COMMENT 'Eメール', `Namae` varchar( 40 ) default NULL COMMENT '氏名', `Bikou` text COMMENT '備考', `UpdateDate` timestamp NOT NULL default '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日時' ) ENGINE = InnoDB DEFAULT CHARSET = utf8 #1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key とエラーになってしまいます。 (このSQL例文には、主キー、ユニーク制約の件は未反映です) `KanriNo` int ....の行を削除すればSQL は正常に実行されるのですが。

    • ベストアンサー
    • MySQL
  • PDOでDB

    PDOでDBを表示させ修正ボタンを押し別ウインドウが開き選んだデータの修正を行いたいのですがupdate2.phpでエラ-メッセージが出ます。どうやったら直りますか 下記のメッセージです Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\WWW\test\htdoes\update2.php on line 4 レコードを修正しました。 ちなみに 番号 int プライマリ-キ- 氏名 varchar 住所 varcharです 下記はソースです 一覧画面 <HTML> <HEAD> <TITLE>一覧画面</TITLE> </HEAD> <BODY> <table border="1"> <tr> <th>番号</th> <th>氏名</th> <th>住所</th> <th>操作</th> </tr> <?php $pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin"); $st = $pdo->query("SELECT * FROM tbl_test"); while ($row = $st->fetch()) { $ID = htmlspecialchars($row['番号']); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); echo "<tr><td>$ID</td><td>$NAME</td><td>$ADDR</td><td><a href='update.php?番号=$ID'>修正</a></td></tr>"; } ?> </table> </BODY> </HTML> アップデートの入力フォーム update.php <?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(); $ID = htmlspecialchars($row['番号']); $NAME = htmlspecialchars($row['氏名']); $ADDR = htmlspecialchars($row['住所']); ?> <form action="update2.php" method="post"> 番号<br> <?php echo $ID ?><br> 氏名<br> <input type="text" NAME="NAME" value="<?php echo $NAME ?>"><br> 住所<br> <input type="text" NAME="ADDR" value="<?php echo $ADDR ?>"><br> <input type="submit"> </form> アップデートの処理 update2.php <?php $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'])); ?> レコードを修正しました。 アップデートの処理 update2.phpで 最初のエラーが出ます

  • 「Duplicate entry '1' for key 'PRIMARY'」というエラー。

    mysql> show fields from do; +-----------+------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | parent_id | int(11) | YES | | 0 | | | data_time | bigint(20) | YES | | NULL | | | text | text | YES | | NULL | | +-----------+------------+------+-----+---------+----------------+ というテーブルに、 insert into do values (1,1,1,'kkk'); などと、SQL文を実行すると、 Duplicate entry '1' for key 'PRIMARY' というエラーが出ます。 これはどういう意味のエラーなのでしょうか?

    • ベストアンサー
    • MySQL
  • 主キーはオートナンバー型のIDを使った方が良いのか

    主キーはオートナンバー型のIDを使った方が良いのか、 独自の主キーを作った方がいいのか? 今は テーブル1 ------------------- IDフィールド(オートナンバー型) 主キー 1 2 3 ------------------- 伝票番号フィールド A001 A001 A002 ------------------- 部署フィールド 営業部 システム部 営業部 ------------------- 金額フィールド 100 200 300 ------------------- という状態ですが、 新たに主キーフィールドを作り 更新クエリで UPDATE テーブル1 SET テーブル1.主キー = [テーブル1]![伝票番号] & [テーブル1]![部署] & [テーブル1]![金額]; をして、主キーを独自に作った方がいいのか。 アクセスを作るにおいて、どちらの方が良いのでしょうか? テーブルのレコードは削除したりする事もあるので、オートナンバー型だと空きができてしまいます。 レコードに空きができないデータベースなら、オートナンバー型、 空きができるデータベースなら、独自に作った主キーにしたほうがいいのでしょうか?

  • Accessでの設定について

     データベースソフトAccessを用いて、以下の用件を設定するにはどのようにフォームを設定したら良いか教えて下さい。 例)社員テーブルが、社員マスターID(オートナンバー型)、管理番号(テキスト型)、氏名(テキスト型)、時給単価(通貨型)で作成されている場合。  管理番号を入力すると、データ(氏名や時給単価)を呼び出すことができるようなフォームを作成するには、どのように設定したらよいのでしょうか? 教えて下さい。

  • Mysql php 格納できない

    mysqlのデータにデータを格納したいのですができません。 エラー文も出ません。 phpのpostで受け渡しデータベースに格納する流れです。 データの受け渡しは確認済み。 下記はソースです。  こちらも var_dump($data)で確認済み すべてにしっかりデータは入っています。 $sql='INSERT INTO zyoho(memberid,city.town,brand,syasyu,syasyumei,nenshiki,kyori, zyotai,sonota,gazou1,gazou2,gazou3,gazou4,gazou5,day)VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)'; $stmt=$dbh->prepare($sql); $data[]=$memberid; $data[]=$city; $data[]=$town; $data[]=$brand; $data[]=$syasyu; $data[]=$syasyumei; $data[]=$nenshiki; $data[]=$kyori; $data[]=$zyotai; $data[]=$sonota; $data[]=$gazou1; $data[]=$gazou2; $data[]=$gazou3; $data[]=$gazou4; $data[]=$gazou5; $data[]=date('Y-m-d H:i:s'); $stmt->execute($data); mysql テーブル名 zyoho id int primary key auto_increment memberid int city varchar(20) town varchar(20) brand varchar(50) syasyu varchar(50) syasyumei varchar(100) nenshiki varchar(20) kyori varchar(20) zyotai text sonota text gazou1 varchar(50)   gazou2 varchar(50) gazou3 varchar(50) gazou4 varchar(50),gazou5 varchar(50) day datetime 解決方法ご教授いただければと思います。

    • ベストアンサー
    • MySQL
  • SQLにプログラムが反映されないのは何故

    XAMPP Version: 1.8.2 です。   Xamsのデータベースをデータベースから削除した後  SQLから、以下2個プログラムを入力しました。  すると、削除したにも関わらず、エラーが出て プログラムが反映されません。  Xamsを削除後、再起動したらまたXamsのデータベースが 再構築されます。  私は作成した記憶はありません。  すでに存在しているので、作成しする必要は ないのか、よくわかりません!?  皆様どう思われますか!?  以下入力したプログラムです。 ---------------------------------------------------------------- CREATE DATABASE xmas; USE xmas; CREATE TABLE xmastran ( book_id int not null auto_increment, name varchar(30) not null default '' , org varchar(50) not null default '', addr varchar(80) not null default'', tel varchar(20) default '', mail varchar(40) default '', course varchar(30) default '', nums integer default 0, PRIMARY KEY (book_id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; エラー 実行したSQL: DATABASEクリスマスを作成します。 のMySQLのメッセージ:ドキュメント #1007 - データベース'クリスマス'を作成できません、データベースが存在している -------------------------------------------------- CREATE DATABASE if not exists xmas; USE xmas; CREATE TABLE xmastran ( book_id int not null auto_increment, name varchar(30) not null default '' , org varchar(50) not null default '', addr varchar(80) not null default'', tel varchar(20) default '', mail varchar(40) default '', course varchar(30) default '', nums integer default 0, PRIMARY KEY (book_id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; エラー 実行したSQL: TABLE xmastranを(CREATE book_idのINT NOT NULL AUTO_INCREMENT、 名VARCHAR(30)NOT NULL DEFAULT''を、 orgのVARCHAR(50)NOT NULL DEFAULT''を、 addrはVARCHAR(80)NOT NULL DEFAULT''を、 電話VARCHAR(20)DEFAULT''を、 メールVARCHAR(40)DEFAULT''を、 もちろんVARCHAR(30)DEFAULT''を、 numsはINTEGERのデフォルトは0、 PRIMARY KEY(book_id) )ENGINE = MYISAM DEFAULT CHARSET= utf8を; のMySQLのメッセージ:ドキュメント #1050 - テーブル 'xmastran'は既に存在します。 ------------------------------------------------------------------- 以上よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQLのキーの取り扱いについて

    LinuxでMySQLの4.0.20を使っています。 auto_numberを用いたインサートを行った場合、通常デフォルトでも 自動的にオートナンバーが割り当てられるが、それを重複しないキーとして 使っているのですが、さきほど登録したオートナンバーを取得することは可能でしょうか? 最後に登録されたオート番号を取得するスマートな方法が知りたいです。 Aがauto_number testテーブル A B C 1 あ 10 2 い 20 3 う 30 この表を見れば、次の自体は4であろうと想像できるが、データを追加した直後に そのオートナンバーが何かわかる方法があれば知りたいです。 通常インサートする場合は固有のキーも追加するので、わざわざ取得するまでもないですが、特定できるキーがオートナンバーなので、それを取得する方法が知りたいです。 select max(A) from test; で取得すれば良いのでしょうか? ※4.1.4ではujisで日本語を追加しようとしてもうまくいきませんでした。バグが直ってなさそうです。

    • ベストアンサー
    • MySQL