- ベストアンサー
php+mysqlでの重複チェックについて
- phpからCSVに吐き出して重複チェックを行なうことにしました。
- mysqlを導入し、nameをユニークインデックスにした結果、同じ名前は登録されなくなりました。
- エラーコードを使って判断することで、「その名前は登録済みです!」と表示させることができます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 insertしてみてのエラーを拾っても良いですし、登録前にselectしてみてレコードが取得できたらエラーでも良いと思います。
その他の回答 (3)
- yambejp
- ベストアンサー率51% (3827/7415)
ごめんなさい、勘違い プレペアドの処理でしたね。 具体的なエラーを拾ってみればわかるかもしれません。 http://www.php.net/manual/ja/mysqli.error.php
お礼
ありがとうございます。 こちらも試してみたいと思います。 また何かありましたら宜しくお願いします。
- yambejp
- ベストアンサー率51% (3827/7415)
>$sql = 'INSERT INTO not_schoolmate (id,name,) VALUES(?,?)'; 2個所怪しい点があります。 ・nameの後ろのカンマがいりません ・nameが文字列だとしたら、VALUESで与えるデータがきちんとエスケープされているか くわえてクォーテーションで囲まれていますか?
お礼
確認したところ、nameの後ろにカンマは入っていませんでした。 nameは入力フォームから受け取ったデータとなります。 エスケープされているか どのように確認すれば宜しいでしょうか?
- yambejp
- ベストアンサー率51% (3827/7415)
#1さんのほかには INSERT IGNORE INTOでデータを投入し、 mysql_affected_rowsでチェックすればよいかと (戻り値が1なら投入された、0ならすでにデータが存在する) http://php.net/manual/ja/function.mysql-affected-rows.php
お礼
ご連絡ありがとうごさいます。 $sql = 'INSERT INTO not_schoolmate (id,name,) VALUES(?,?)'; の下に以下を入れてみたのですがエラーになってします。 記述場所が悪いのでしょうか? 文法的な問題でしょうか? $test = mysqli_affected_rows(); if($test == 0){ echo "そのアカウントは既に登録されています。<BR>"; $errflg = "1"; }else{ echo "そのアカウントは登録されていません。"; } 以上、宜しくお願いいたします。
お礼
ご連絡ありがとうございます。 select文はコミットする前でしょうか?
補足
とりあえず、以下で対応できました。 //重複チェック $account = $_POST["name"]; $sql = 'select * from xxxxxx where name = "'.$name.'";'; $rs = mysqli_query($link, $sql); $rows = mysqli_num_rows($rs); if($rows == 0){ } else { echo "交付申請に失敗しました。<BR><BR>"; echo "【".$name."】は既に登録されています。<BR>"; $errflg = 1; }