みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

php データ新規追加

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

投稿日時 - 2014-04-18 16:26:31

QNo.8559447

すぐに回答ほしいです

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

「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になりますよね?

ちなみに主キーをユーザーから送ってもらうのはどうかと思いますが

投稿日時 - 2014-04-18 16:51:47

補足

ありがとうございました
今の現状を新しく質問したのでまたご指摘、ご指導お願いします

http://okwave.jp/qa/q8564513.html

投稿日時 - 2014-04-22 14:53:56

お礼

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

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

投稿日時 - 2014-04-18 17:00:52

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

>自分はまずSQLを投げる前に空のチェックをすればいいんですか?

考え方は4つ
(1)POSTを受け取って、SQLに投げる前にチェックできるタイミングがある
空だったり想定した値でない場合には前の画面にもどす
いわゆる「バリデート」処理

(2)送られてくる前にjavascriptなどでチェックする、これもUIの基本。
ただしjavascriptのチェックはあくまでもおまけなので
javascriptでチェックをかけたとしても必ずサーバー側で二重チェック
しないといけない

(3)事前処理をせずにSQLにまかせる
あらかじめ空文字をいれたデータを登録しておき自動ではじかれるようにするなど
運用でカバー

(4)チェックしない
前述したとおり、結局機械的なチェックをしてもそれが「正解」かどうかは
別のはなし。一生懸命チェックしても結局むだならしなくてもいいという
考えもある。

どれをとるかは、あなたしだい
通常は(1)、(2)をベースに行い、(3)や(4)は例外処理がおおくなるので
あまりお勧めできません。

投稿日時 - 2014-04-22 11:46:32

補足

指摘ありがとうございます
バリデート処理を調べてみたら難しそうだったので
違うやり方にしました
<?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:29

お礼

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

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

投稿日時 - 2014-04-22 11:51:27

ANo.4

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

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

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

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

投稿日時 - 2014-04-21 17:57:23

お礼

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

投稿日時 - 2014-04-22 09:15:17

ANo.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";
}

投稿日時 - 2014-04-18 19:27:01

補足

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

投稿日時 - 2014-04-21 11:36:46

お礼

ありがとうございます
出来ました
調べたら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:58

ANo.2

>affected_rows()やrowCount()の使い方がわからなくって
もしかしてPHPのマニュアル使い方わからない?
http://www.php.net/manual/ja/

mysqli関数でやるなら
http://us1.php.net/manual/en/mysqli.affected-rows.php

PDOでやるならrowCount()
http://www.php.net/manual/ja/pdostatement.rowcount.php

投稿日時 - 2014-04-18 17:10:38

お礼

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

投稿日時 - 2014-04-18 17:30:45

あなたにオススメの質問