入力フォームに入力された番号が登録されてなかったら新規登録できるようにしたい
INSEPT IGNORE INTOで主キーを無視するのではなく重複したらエラーメッセージを出しユーザにもう一度入力させるようにする
新規登録フォーム
<html>
<head><title>新規登録</title></head>
<body>
<blockquote>
<form action = "insert.php" method = "POST">
<br><br>登録画面<br><br>
すべての項目入力してください<br>
番号<input type="number" name = "ID">
(一覧画面にない番号を入力してください) <br>
<br>氏名<input type="text" size = "50" name = "NAME"><br><br>
住所<input type="text" size = "130" name = "ADDR"><br><br>
<a href="http://localhost/top.php">
<input type = "submit" value = "登録する" style ="font-size:20px; width: 100px; height: 40px"></A>
<a href="http://localhost/top.php">
<input type = "button" value = "一覧に戻る" style ="font-size:20px; width: 100px; height: 40px"></A>
</body>
</blockquote>
</form>
</body>
</html>
登録を実行するフォーム
<?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));
}
header('Location: http://localhost/top.php');
exit();
} else {
?>
<html>
<body>
<blockquote>
<br><br>データが未入力の箇所があります。すべてデータを入力してください
<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>
<?php
}
mysqli_close($con);
?>
どういう風にselect文を書けばいですか?
No.1ベストアンサー
- 回答日時:
「php側でaffected_rows()やrowCount()で作用した行数を数えて」って
書きましたよね?
仮にtestdbデータベースにtblテーブルを作ったとして
use testdb;
create table tbl (id int not null ,data varchar(10),unique (id));
insert into tbl values(1,'a'),(2,'b'),(3,'c');
<?php
$dsn = 'mysql:host=localhost; dbname=testdb';
$pdo = new PDO($dsn,$user,$password);
$sql = "insert ignore into tbl(id,data) values(?,?)";
$stmt = $pdo->prepare( $sql);
$stmt->execute(array(4,'x'));
if($stmt->rowCount()>0){
print "ok";
}else{
print "ng";
}
?>
とすると、1回目はokで2回目以降はngになりますよね?
ちなみに主キーをユーザーから送ってもらうのはどうかと思いますが
この回答への補足
ありがとうございました
今の現状を新しく質問したのでまたご指摘、ご指導お願いします
http://okwave.jp/qa/q8564513.html
ありがとうございます
番号は入力フォームからユーザが入力出来ます
affected_rows()やrowCount()の使い方がわからなくって
No.5
- 回答日時:
>自分はまずSQLを投げる前に空のチェックをすればいいんですか?
考え方は4つ
(1)POSTを受け取って、SQLに投げる前にチェックできるタイミングがある
空だったり想定した値でない場合には前の画面にもどす
いわゆる「バリデート」処理
(2)送られてくる前にjavascriptなどでチェックする、これもUIの基本。
ただしjavascriptのチェックはあくまでもおまけなので
javascriptでチェックをかけたとしても必ずサーバー側で二重チェック
しないといけない
(3)事前処理をせずにSQLにまかせる
あらかじめ空文字をいれたデータを登録しておき自動ではじかれるようにするなど
運用でカバー
(4)チェックしない
前述したとおり、結局機械的なチェックをしてもそれが「正解」かどうかは
別のはなし。一生懸命チェックしても結局むだならしなくてもいいという
考えもある。
どれをとるかは、あなたしだい
通常は(1)、(2)をベースに行い、(3)や(4)は例外処理がおおくなるので
あまりお勧めできません。
この回答への補足
指摘ありがとうございます
バリデート処理を調べてみたら難しそうだったので
違うやり方にしました
<?php
$err = "";
if(empty($_POST['ID'])) $err.= "<br><br>番号入力してください。<br><br>";
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("INSERT INTO tbl_test VALUES(?,?,?)");
$st->execute(array($_POST['ID'], $_POST['NAME'],$_POST['ADDR']));
if($st->rowCount()>0)
{
header('Location: http://localhost/top.php');
}else{
print "既に登録している番号です";
}
echo $err;
}
?>
こう行ったのですが、重複しないでデータが空だったら登録するということはできました
しかしエラーのときに$errが返ってきません!
どこが記述がおかしいですが?
ご指導おねがいします
ありがとうございます
javascriptはまったく触れたことが自身がないので、バリデート処理でやってします。
調べてわからなかったらまた質問するのでそのときは私に力を貸してください
No.4
- 回答日時:
>いまの状態だと番号が重複していなければ氏名と住所が空白でもデータが登録されてしまいます
氏名や住所が空かどうかはSQLに投げる前にチェックできますよね?
if (isset($_POST['NAME']) and $_POST['NAME']!=='' and isset($_POST['ADDR']) and $_POST['ADDR']!==''){
正;
}else{
偽;
}
ただ空かどうかのチェックはあまり意味がありません。
$_POST['NAME']に「hoge」的な適当なダミーデータがのってくることだって十分あり
空の場合とごみデータの場合とそう大差ないからです
No.3
- 回答日時:
>自分場合affected_row()ですか?
PDOの方がネット上に資料が多いような気がしますが
自分で探す気がないならどっちでも同じでしょうけど
<?php
$db='testdb';
$mysqli = new mysqli($host,$uname,$passwd,$db);
$id=4;
$data="x";
$sql = "insert ignore into tbl(id,data) values(?,?)";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param('is',$id,$data);
$stmt->execute();
if($mysqli->affected_rows>0){
print "ok";
}else{
print "ng";
}
ありがとうございます
出来ました
調べたらPDOのほうが資料が多いのでPDOで作成しました
下記のとおりになりました
<?php
$pdo = new PDO("mysql:dbname=db_test;host=localhost", "root", "admin");
$st = $pdo->prepare("INSERT INTO tbl_test VALUES(?,?,?)");
$st->execute(array($_POST['ID'], $_POST['NAME'],$_POST['ADDR']));
if($st->rowCount()>0)
{
header('Location: http://localhost/top.php');
}else{
print "既に登録している番号です";
}
?>
ここから番号、氏名、住所が空白だったらエラーメッセージを出してエラーじゃなかったらデータの追加を行いたいのですが、入力チェックをしてから追加の処理を行えばいいですか?
No.2
- 回答日時:
>affected_rows()やrowCount()の使い方がわからなくって
もしかしてPHPのマニュアル使い方わからない?
http://www.php.net/manual/ja/
mysqli関数でやるなら
http://us1.php.net/manual/en/mysqli.affected-row …
PDOでやるならrowCount()
http://www.php.net/manual/ja/pdostatement.rowcou …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP PHP MySQLに画像を直接保存 2 2022/06/05 11:50
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- PHP php ログイン 1 2022/11/01 00:24
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マイクラPC版のコマンドで効率...
-
【初心者】特定の文字に色をつ...
-
green houseのGH-YMP24-GD...
-
T-SQLの sp_executesql について
-
エクセルで最後の文字だけ置き...
-
別テーブルからSELECTした値を...
-
おすすめのアクセスアップマニ...
-
UPDATE my_items SET item_name...
-
ストアド内でカラム名一覧を取得
-
論文投稿用figure作成
-
書籍の内容はまともでしょうか?
-
【MySQL】本当に困っているので...
-
URL と行番号の指定
-
共通点はあります。何が違うの...
-
Excel2000でレーダーチャートの...
-
LEFT JOIN と GROUP BY
-
【MySQL】本当に困っています。...
-
親と子供が複数のSQL取得方法
-
my_itemsテーブルのIDにAUTO_IN...
-
SELECT my_items.item_name, ca...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
副問合せの書き方について
-
SQLサーバから、項目の属性(型...
-
VIEWの元のテーブルのindexって...
-
select文のwhere句に配列を入れ...
-
selectした大量データをinsert...
-
センノシド異性体構造式
-
Unionした最後にGROUP BYを追加...
-
insertを高速化させたい
-
SQLにて特定の文字を除いた検索...
-
ある条件の最大値+1を初番する...
-
マイクラPC版のコマンドで効率...
-
inner joinをすると数がおかし...
-
sqlで、600行あるテーブルを100...
-
エクセルの関数について教えて...
-
Access パラメータクエリをcsv...
-
URL と行番号の指定
-
複数テーブルのGROUP BY の使い...
-
PL/SQLの変数について
おすすめ情報