アプリ版:「スタンプのみでお礼する」機能のリリースについて

入力フォームに入力された番号が登録されてなかったら新規登録できるようにしたい
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文を書けばいですか?

A 回答 (5件)

「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

補足日時:2014/04/22 14:53
    • good
    • 0
この回答へのお礼

ありがとうございます
番号は入力フォームからユーザが入力出来ます

affected_rows()やrowCount()の使い方がわからなくって

お礼日時:2014/04/18 17:00

>自分はまず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が返ってきません!
どこが記述がおかしいですが?
ご指導おねがいします

補足日時:2014/04/22 13:43
    • good
    • 0
この回答へのお礼

ありがとうございます
javascriptはまったく触れたことが自身がないので、バリデート処理でやってします。

調べてわからなかったらまた質問するのでそのときは私に力を貸してください

お礼日時:2014/04/22 11:51

>いまの状態だと番号が重複していなければ氏名と住所が空白でもデータが登録されてしまいます



氏名や住所が空かどうかはSQLに投げる前にチェックできますよね?

if (isset($_POST['NAME']) and $_POST['NAME']!=='' and isset($_POST['ADDR']) and $_POST['ADDR']!==''){
正;
}else{
偽;
}

ただ空かどうかのチェックはあまり意味がありません。
$_POST['NAME']に「hoge」的な適当なダミーデータがのってくることだって十分あり
空の場合とごみデータの場合とそう大差ないからです
    • good
    • 0
この回答へのお礼

返事遅くなり、すいません!
自分はまずSQLを投げる前に空のチェックをすればいいんですか?

お礼日時:2014/04/22 09:15

>自分場合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";
}

この回答への補足

いまの状態だと番号が重複していなければ氏名と住所が空白でもデータが登録されてしまいます

補足日時:2014/04/21 11:36
    • good
    • 0
この回答へのお礼

ありがとうございます
出来ました
調べたら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 "既に登録している番号です";
}
?>

ここから番号、氏名、住所が空白だったらエラーメッセージを出してエラーじゃなかったらデータの追加を行いたいのですが、入力チェックをしてから追加の処理を行えばいいですか?

お礼日時:2014/04/21 11:29

>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 …
    • good
    • 0
この回答へのお礼

ありがとうございます
マニュアルを読んでもなかなか理解できなくって勉強します
自分場合affected_row()ですか?

お礼日時:2014/04/18 17:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!