プログラム初心者の方へ:効率的なデータベースの登録情報の重複チェック方法

このQ&Aのポイント
  • プログラム初心者の方へ:データベースに登録情報の重複をチェックする方法について解説します。
  • 一回のSQL発行で名前とメールの重複チェックを行いたい場合、mysqli_query関数を使用して名前とメールをそれぞれチェックすることができます。
  • 取得した名前とメールのデータが重複している場合は、例外をスローすることで重複エラーを処理することができます。
回答を見る
  • ベストアンサー

チェックする方法

プログラム初心者です $nameと$mailをDBに登録してあるか調べたいのですが sqlを一回だけ発行で調べる方法はありますか? //名前とメールを取得して重複チェック $name2 = mysqli_query($link,sprintf('SELECT name FROM table WHERE name="%s"', mysqli_real_escape_string($link,$name) )); $data = mysqli_fetch_assoc($name2); if(isset($data['name'])==$name){ throw new Exception('noname'); } $name3 = mysqli_query($link,sprintf('SELECT mail FROM table WHERE mail="%s"', mysqli_real_escape_string($link,$mail) )); $data2 = mysqli_fetch_assoc($name3); if(isset($data2['mail'])==$mail){ throw new Exception('nomail'); } よろしくお願いします

  • flash0
  • お礼率97% (297/306)
  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
noname#244856
noname#244856
回答No.1

提示されたコードにおかしい点が含まれているのでそれも直しつつ1つにまとめました。 $result = mysqli_query($link, sprintf( 'SELECT name, mail FROM table WHERE name="%s" OR mail="%s"', mysqli_real_escape_string($link, $name), mysqli_real_escape_string($link, $mail) )); while ($row = mysqli_fetch_assoc($result)) { if ($name === $row['name'] && $mail === $row['mail']) { throw new Exception('その名前とメールアドレスは既に登録されています'); } elseif ($name === $row['name']) { throw new Exception('その名前は既に登録されています'); } elseif ($mail === $row['mail']) { throw new Exception('そのメールアドレスは既に登録されています'); } }

flash0
質問者

お礼

わかりやすい回答ありがとうございます 動きました おかげでコードがまとまってすっきりしました。ありがとうございます

関連するQ&A

  • セキュリティ

    プログラム初心者です PDOやる前にmysqliの手続き型で勉強中です 手続き型でフォームから入力された値をこんな感じにするのは危険でしょうか? 悪意を持ったユーザーに簡単に突破されますか? if(!empty($_POST['name'])){ $sql = sprintf('SELECT * FROM hoge WHERE name="%s"', mysqli_real_escape_string($link,$_POST['name']) ); } 更新するとき if(!empty($_POST['name'])){ mysqli_query($link,sprintf('UPDATE hoge SET name="%s" WHERE id=%d', mysqli_real_escape_string($name), mysqli_real_escape_string($link,10) )); } よろしくお願いします

    • ベストアンサー
    • PHP
  • 検索機能

    プログラム初心者です 検索機能をつける方法を教えてください 質問1 like検索のLIKE “%value%”でもインデックスを使う方法はありますか?それともインデックスを使わなくても十分速いのでしょうか? 質問2 複数キーワードをスペースをはさんで検索してきた場合、どうやって処理すればいいのでしょうか? and検索のみです 例えばこんな文字の場合です $search = 'ああ いい うう'; $recordSet2 = mysqli_query($link,sprintf('SELECT * FROM table where name LIKE "%%%s%%"', $search )); while($row = mysqli_fetch_assoc($recordSet2)){ ?> <tr> <td><?php print $row['name']; ?></td> </tr> <?php } ?> よろしくお願いします

    • ベストアンサー
    • PHP
  • 空文字のアップデート

    mysql初心者です phpとmysqliを使っています テーブルhogeにid、gifとカラムがあります gifのカラムを空にしたいのですがこんな感じでいいでしょうか? mysqli_query($link,sprintf('UPDATE hoge SET gif="%s" WHERE id=%d', "", mysqli_real_escape_string($link,$id) )); よろしくお願いします

    • ベストアンサー
    • MySQL
  • 画像削除機能を付けたい

    php初心者です 以前教えていただいたサンプルを元に phpとmysqliの手続き型で画像アップ機能を作りたいです サンプルでは削除機能がないので、削除機能を付けたいと思いました 付けたい機能 1.画像削除機能 2.画像一覧表示(そのひとがアップしている画像を取得して一覧表示、その画像のしたに削除チェックを付けたい) 以前教えていただいたサンプル http://qiita.com/mpyw/items/73ee77a9535cc65eff1e 素人なりに考えてみましたが頭パンクしました 失敗作 フォーム失敗作 しかし、DBから取得した画像と、削除チェックの位置を合わせられませんでした <div> <p>画像表示一覧</p> <form method="POST" action=""> ここに画像1(gif) 削除チェック<input type="checkbox" name="deletefile[]" value="1"> ここに画像2(jpg) 削除チェック<input type="checkbox" name="deletefile[]" value="2"> <input type="submit" value="削除ボタン" name="btn"> </form> </div> DBのgifのテーブルのカラムはidとuser_idとgif(画像名)にしています どんどんINSERTで登録していく感じになっています(テーブル設計も自信ありません・・・) 受け取るphpの上のほうに記述したもの ※セッションidから会員の画像名を取得 session_start(); $id = $_SESSION['id']; $sql= mysqli_query($link,sprintf('SELECT * FROM gif WHERE user_id=%d', mysqli_real_escape_string($link,$id) )); $data = mysqli_fetch_assoc($sql); if(isset($_POST["deletefile"])){ if(isset($data['gif'])){ if(unlink("img/".画像名 )){ mysqli_query($link,sprintf('DELETE FROM gif WHERE id=%d', mysqli_real_escape_string($link,画像の番号) )); $mes = "削除しました"; }else{ $mes = "削除失敗"; } } } 新しくサンプルいただけると助かります よろしくお願いします

    • ベストアンサー
    • PHP
  • 重複が

    新規登録の時の重複をチェックしたいです テーブルのカラムはシンプルにidとnameとpassだけです nameに同じ名前の人がいると困るので、HTMLフォームから送られた名前と登録してある名前の重複がないかチェックするようにできますか? やってみましたが動きません(ーー;; $name = mysql_real_escape_string($_POST['name']); $name3=array(); $name2 = mysql_query('SELECT name FROM hoge2 WHERE name=$name'); while($data = mysql_fetch_assoc($name2)) { array_push($name3, $data['name']); } if(isset($name3)){ print "重複があります"; }else{ //ここからsql $sql = sprintf('INSERT INTO hoge2 SET name="%s", pass="%s"', $name, mysql_real_escape_string($_POST['pass']) ); //ここまで mysql_query($sql) or die(mysql_error()); }

    • ベストアンサー
    • MySQL
  • テストdataの作成について

    プログラム初心者です テスト用にmysqlのテストdataをつくりたいです PHPでダミーDATA10万件をinsertする方法を教えてください カラムはuser_id gif_id tag の三つです user_id gif_idはなにも記入しなくてもいいです。(数字が入る予定です) tagはあ~お、か~こまで1文字をランダムに値を変化させながら入れられますか?(無理なら同じタグでいいです) XAMPP(ローカル)で作るので負荷かかってもかまいません mysqli_query($link,sprintf('INSERT INTO tag(user_id,gif_id,tag) VALUES(%d,%d,"%s"),(%d,%d,"%s","%s")', mysqli_real_escape_string($link,$id), mysqli_real_escape_string($link,$gif_id), mysqli_real_escape_string($link,$tag), mysqli_real_escape_string($link,$id), mysqli_real_escape_string($link,$gif_id), mysqli_real_escape_string($link,$tag2) )); よろしくお願いします

    • ベストアンサー
    • PHP
  • mysqliについて

    PHP初心者です PHP 5.2.5 MySQL 5.1.22 レンタルサーバーのphpのバージョンが php5.2.5ではpdoがバグで使えないらしいのでmysqliを使おうとしています。PHP 5.2.5でもmysqliはバグありますか? mysqliでMYSQLに接続するにはどうすればいいのでしょうか? いままではこんな感じでしたがmysqliにするとどんなコードになるのでしょうか? $link=mysql_connect('localhost', 'user', 'pass')or die(mysql_error()); mysql_select_db(user'); mysql_query('SET NAMES UTF8'); $start=1; $hyouji=10; $recordSet = mysql_query(sprintf('SELECT * FROM hoge2 ORDER BY id LIMIT %d, %d' , ',$start,$hyouji)); <?php while ($table = mysql_fetch_assoc($recordSet)) { ?> <tr> <td><?php print($table['id']); ?></td> <td><?php print($table['name']); ?></td> </tr> <?php } ?>

    • ベストアンサー
    • PHP
  • php+mysql

    Warning: mysql_query() expects parameter 1 to be string, resource given in C:\xampp\htdocs\phptest\test6.php on line 30 Warning: mysql_fetch_assoc() expects parameter 1 to be resource, null given in C:\xampp\htdocs\phptest\test6.php on line 32 このようなエラーが出てしまいます line30 $res = mysql_query($link,$query); line32 while($row = mysql_fetch_assoc($res)) { 戻り値がおかしいのでしょうか? 下の分の falseを使っているところが問題なんでしょうか? <?php $link = mysql_connect('localhost','ogawa','taku1106','ogawa'); if ( $link !==false) { $msg =''; $err_msg =''; if ( isset( $_POST['send'] )=== true) { $subject =$_POST['subject']; $honbun =$_POST['honbun']; if ( $subject !=='' && $honbun !=='' ) { $query = " INSERT INTO ogawa ( " ."subject," ."honbun," .") VALUES ( " . "'" . mysqli_real_escape_string( $link, $subject ) ."', " . "'" . mysqli_real_escape_string( $link, $honbun ) . "'" ." ) "; $kakikomi = date('Y-m-d h:i:s'); $res = mysqli_query($link,$query); if ($res !==false) { $msg = '書き込みに成功しました。'; }else{ $err_msg = '書き込みに失敗しました。'; } }else{ $err_msg = 'タイトルと本文を書き込んで下さい。'; } } $query = "SELECT id,subject,honbun,kakikomi FROM ogawa"; $res = mysql_query($link,$query); $data = array(); while($row = mysql_fetch_assoc($res)) { array_push($data,$row); } arsort($data); }else{ echo"データベースの接続に失敗しました"; } mysql_close($link); ?> <html> <head> <meta http-equiv="content-type" content="text/html;charset=UTF8;" /> </head> <body>> <table border="1"> <form action="test6.php" method="POST"> <tr><th>タイトル<td><input type="text" name="text" size="50"></td></tr> <tr><th>本文<td><textarea name="subject" cols="52" rows="8"></textarea> <tr><td><input type="submit" value="保存 する" /></td><tr> </table> </form> <?php if ($msg !=='')echo'<p>'.$msg.'</p>'; if ($err_msg !=='')echo'<p style="color:#f00;">'.$err_msg.'</p>'; foreach($data as $key =>$val) { echo $val['subject'].''.$val['honbun'].'<br>'; } ?> </body> </html>

  • パスワードの暗号化

    php+mysqlでシンプルな会員登録を作りたいのですがパスワードは暗号化したほうがいいですか? パスワードを簡単に暗号化できる方法はありますか? postされたpassと暗号化されたpassのチェック方法がわかりません ログイン if ($_POST['id'] !='' && $_POST['pass'] !='') { $sql = sprintf('SELECT * FROM hoge WHERE id="%s" AND pass="%s"', mysql_real_escape_string($_POST['id']), mysql_real_escape_string($_POST['pass']) ); $record = mysql_query($sql) or die(mysql_error()); if ($table = mysql_fetch_assoc($record)) { $_SESSION['id'] = $table['id']; $_SESSION['name'] = $table['name']; } else { //エラー }

    • ベストアンサー
    • MySQL
  • php、クエリ生成について

    OS:Mac OS X 10.6.8 Snow Leopard 環境:MAMPを使ったローカル環境 PHP:5.3.6 MySQL:5.5.9 PHPとMYyQLを使って検索システムを作ってみている者です。 検索結果がどうしても全件表示になってしまいます。 また、$queryにはSELECT * FROM テーブル名 にwhereで条件を付加してるのですが、 $queryをprintしてみても、SELECT * FROM テーブル名 しか表示されません。 いろいろ調べたり試したりしてみたのですが、原因がつかめず、解決策が見つかりません。 どうか、アドバイスご教示お願いします。 <body> <?php $debug = false; //DB Connect $url = "localhost"; $user = "ユーザー名"; $pass = "パスワード"; $db = "DB名"; $link = mysql_connect($url,$user,$pass) or die("No Connected"); $sdb = mysql_select_db($db,$link) or die("No Connected"); if($debug) echo_r($HTTP_POST_VARS); //Error Check //Request Method Check if($_SERVER["REQUEST_METHOD"] != "POST") { echo "Error: invalid method"; exit(); } //Create Query $query = "SELECT * FROM テーブル名"; //Create Search Criteria $where = array(); if (isset($_POST['type'])and($_POST['type'] !== '')) { $where[] = sprintf("(type='%s')", mysql_real_escape_string($_POST['type'])); } if (isset($_POST['name'])and($_POST['name'] !== '')) { $where[] = sprintf("(name='%s')", mysql_real_escape_string($_POST['name'])); } if (isset($_POST['address'])and($_POST['address'] !== '')) { $where[] = sprintf("(address like '%%%s%%')", mysql_real_escape_string($_POST['address'])); } if (isset($_POST['description'])and($_POST['description'] !== '')) { $where[] = sprintf("(description like '%%%s%%')", mysql_real_escape_string($_POST['description'])); } if (count($where) <> 0) { $query .= ' where ' . implode(' and ', $where); } echo $query; //Result $result = mysql_query($query) or die($query . '<br />' . mysql_error() . '<hr />'); $num_rows = mysql_num_rows($result); ?> <h2>Search Result</h2><br> <?php if($num_rows == 0) { $message = "No date"; } else { $message = $num_rows ."hits"; echo $message; } ?> <table> <tr> <td>Type</td> <td>Company</td> <td>Address</td> <td>Description of Business</td> </tr> <?php while($row = mysql_fetch_assoc($result)): ?> <tr> <td><?php echo $row['type']; ?></td> <td><?php echo $row['name']; ?></td> <td><?php echo $row['address']; ?></td> <td><?php echo $row['description']; ?></td> </tr> <?php endwhile; ?> </table> </body>

    • ベストアンサー
    • PHP