PHP + MySQL で登録時に重複チェックをする方法

このQ&Aのポイント
  • PHP + MySQL で大量のレコードを登録する際、重複チェックを効率的に行いたい場合について考えます。現在の方法では、配列を回しSELECT文で件数チェックを行っていますが、サーバーに負担が掛かる可能性があります。より効率的な方法についてご教示いただきたいです。
  • PHP + MySQL で大量のレコードを登録する際に、重複チェックを効率的に行いたいと考えています。現在は配列を回しSELECT文で件数チェックを行っていますが、サーバーの負担が心配です。他に効率的な方法があれば、教えていただきたいです。
  • PHP + MySQL を使用して大量のレコードを登録する際、重複チェックを行う方法について考えます。現在の方法では、配列を回しSELECT文で件数チェックをしていますが、サーバーに負担がかかるかもしれません。他の方法で負担を減らす方法があれば教えてください。
回答を見る
  • ベストアンサー

PHP + MySQL で登録時に重複チェックをしたいです。

PHP + MySQL で登録時に重複チェックをしたいです。 DBには ID Title Name 1 Book1 Author1 2 Book2 Author2 と3000件ほど入っています。これからも増えていく予定です。 このDBにPHPから新たに100件ほどのレコードを一気に登録したいときに、 ・Title名が既にDBに登録されている → 何もせずに次へ ・Title名がまだ登録されていない時 → DBへ登録 と、この様な処理をさせたいと考えています。 現状は登録したい値を配列で回し、一つ一つSELECT文で件数チェックをし、0件で有れば登録。0件以外であれば無視。と、している状況です。 ただこれですと、どうしてもサーバーに負担が掛かってしまう気がするのです。 もし、何か他に良い方法がありましたら教えていただけないでしょうか? よろしくお願いいたします。

  • PHP
  • 回答数4
  • ありがとう数12

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

  • ベストアンサー
  • mpx
  • ベストアンサー率71% (149/209)
回答No.1

他の方法の例として、 DBにて、"Title" をunique keyにして、登録時に、 INSERT IGNORE INTO table_name 構文を使ってINSERT する では如何でしょう。 Mysqlが、勝手に重複しいれば無視して、重複がなければ登録してくれます

0xxxYuMixxx0
質問者

お礼

これでうまくいきました!! ありがとうございました!

その他の回答 (3)

回答No.4

肝心なことを書き忘れた。 Titleがユニークキーの設定をしているならならINSERT IGNORE INTOを使えば重複キーに対しては挿入処理が行われないように処理できます。

回答No.3

>1)重複チェックのSQL文を工夫する > 例) > × select * from bookshelf where Title='hoge'; > ○ select 1 from bookshelf where Title='hoge'; 普通にcount()関数使った方が良いですから >ただこれですと、どうしてもサーバーに負担が掛かってしまう気がするのです。 そうとうショボイサーバでなければ100件程度ならそれほど問題はないでしょう。

noname#256686
noname#256686
回答No.2

昨今のサーバーであれば、気にするほどの負荷ではないと思いますが、それでもあえて負荷を考えるとすれば、こんな対策くらいでしょうか。 1)重複チェックのSQL文を工夫する  例)  × select * from bookshelf where Title='hoge';  ○ select 1 from bookshelf where Title='hoge';  データを取得する必要はないため、SELECT文の列名部分を固定値にすることで  負荷を若干軽減できます。 2)登録のSQL文を一括実行する  ループのたびに1件1件実行するのではなく、実行して良い配列にマーク等をつけ、  最後に一括でinsert文を発行することで負荷を軽減します。 3)そもそも重複チェックをしない  これはかなり強引な方法ですが、テーブルスキーマのほうでTitleをユニークな列  として構成し、登録プログラムでは重複チェックをせず、insert文を発行します。  当然、ランタイムエラーが発生するため、@mysql_queryというようにエラーを表示  しない工夫等が必要です。 いずれにせよ、サンプルプログラムを作って実際に実機でテストするのが一番です。たぶん、今のままでも危惧するほどの負荷はかかりませんよ。

関連するQ&A

  • phpでMySQL内の重複文字カウント

    phpでMySQL内に格納されている文字データのうち、重複した文字データを 重複数順にランキング表示するプログラムを作成しようと思います。 例 MySQLデータが 昼 夜 昼 昼 夜 朝 であれば、 1、昼 2、夜 3、朝 とphpで表示 MySQLへのデータ登録は、普通にmysql_queryでSQL文を飛ばしてデータ挿入しています。 その際、MySQL内のデータと重複したらイベント(重複カウントを1増やすなど)を起こす方法、 もしくは、重複しているデータと、その重複数を取得できるようなphp関数、SQL文はないものでしょうか? データ数自体は100程度のものなので、全データをphpで配列に格納してから、 配列内を捜査でもよいのですが・・・ 初歩的かつ限定的な質問ですが、どうかご回答お願いします。

    • ベストアンサー
    • PHP
  • php+mysqlでの重複チェックについて

    phpからCSVに吐き出して重複チェックを考えていたのですが 大変そうなので、mysqlを導入し、php+mysqlで重複チェックを行なうことにしました。 nameをユニークインデックスにしたところ 同じ名前は登録されなくなったのですが できれば、「その名前は登録済みです!」と表示させたいです。 エラーコードかなにかを使って 判断するのでしょうか? 以上、宜しくお願いいたします。 -----文字数の関係で一部削除しております。----- <?php //DBへ接続開始 $link = mysqli_connect($host, $user, $password, $database); if (!$link) { print("接続できませんでした"); exit(); } /* 文字セットを utf8 に変更します */ mysqli_set_charset($link, "SJIS"); //オートコミットOFF mysqli_autocommit($link, FALSE); // ステートメントの設定 $sql = 'INSERT INTO not_schoolmate (id,name,) VALUES(?,?)'; $stmt = mysqli_prepare($link, $sql); mysqli_stmt_bind_param( $stmt,"ss", $id, $name ); // 値設定 if($errflg == 0){ $id = $_POST["id"]; $name = $_POST["name"]; //SQL文を実行する mysqli_stmt_execute($stmt); //コミットする mysqli_commit($link); //ステートメントクローズ mysqli_stmt_close($stmt); ?>

    • ベストアンサー
    • PHP
  • PHP+mysql データ重複登録

    ◆PHPバージョン 5.3.3 ◆mysqlバージョン 4.1.22 ◆テーブル情報 `no` int(11) NOT NULL auto_increment, `name` text NOT NULL, `mail` text NOT NULL, `memo` text NOT NULL, `updating` timestamp NOT NULL default CURRENT_TIMESTAMP, PRIMARY KEY (`no`) ENGINE=MyISAM DEFAULT CHARSET=utf8 ◆SQL (1)insert into test(name, mail, memo) values ('abc','abc@test.com','abc') (2)insert test set name='abc', mail='abc@test.com', memo='abc' ◆処理概要 $conn = mysql_connect(ホスト、ユーザ、パスワード); mysql_query("set names utf8"); $rs = mysql_select_db(DB名, $conn); $result = mysql_query(SQL, $conn); ◆登録情報 (1, 'abc', 'abc@test.com', 'abc', '2011-09-02 16:28:57'), (2, '', '', '', '2011-09-02 16:28:57'), 【問題】 上記SQL(1)、(2)どちらでDBに登録しても、登録情報のように同時に空データも同時に登録されてしまう 全く原因の検討がつかないので、何か手がかりがありましたらご教授頂けたらと思います。 どうぞよろしくお願いします。

    • ベストアンサー
    • MySQL
  • php mysqlについて

    初心者です宜しくお願いします。 phpからデータベースを使いたいのですが(mysql)、mysql_query()関数のところで1366エラーが出ます。 半角英数ならエラーは出ません。 プログラムを貼り付けます。どなたかお願いします、説明をもっと書きたいのですが私もあまりわかってないのでどうもすみません。 今やっていることは全てローカルですwindowsを使ってます、文字コードもshift_jisです。phpもmysqlも一台のコンピュータでやっています。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>MySQLへデータを登録</title> </head> <body> DBとの連携テスト結果<br> <?php // DBに接続 if(!$con=mysql_connect("localhost","root","y3kwyuba")){ echo"connect_error"; exit; } // DBを選択 if(!mysql_select_db("test",$con)){ echo"select_db_error"; exit; } //MySQL4.1への対応 //mysql_query("SET NAMES SJIS"); この上の行のコメントをはずすとうまく動くのですが色々調べましたら、この書き方は推奨されないと書いてありました、他に対策はあるのでしょうか? $name = $_POST['nm']; $age = $_POST['age']; // フォームで送られてきたデータでINSERT文を作成 $sql = "insert into t_touroku(name,age) values('$name',$age)"; // SQLを実行 if(!$res=mysql_query($sql,$con)){ echo"query_error"; echo "エラー番号:".mysql_errno(), #エラー番号 "メッセージ:".mysql_error(); #エラーメッセージ exit; } // DBから切断 mysql_close($con); // メッセージ出力 echo"登録完了"; ?> </body> </html> 宜しくお願いします。

    • ベストアンサー
    • PHP
  • phpで重複チェック

    phpの重複チェック phpで配列の重複データをチェックして、重複しているデータを表示しようとしています。 foreach ($arry as $key => $value) { $err_count = 0; foreach ($arry as $key => $value2) { if ($value == $value2) { $err_count++; if ($err_count >= 2) { echo "重複".$value2; } } } } としているのですが、 同じモノが2回表示されて困っています。 重複しているデータは一回だけ表示したいのですが、 なにか方法ないでしょうか?

    • ベストアンサー
    • PHP
  • dbに登録したデータをphpのプルダウンに表したい

    mysqlに登録したデータをphpのプルダウンに表示させたいです。 database [db1] table [unit]カラム group varchar(20) に登録しているグループ名5個を選べるようにしたいのですが知恵を拝借できますでしょうか。 <?php $s=mysql_connect("サーバー名","アカウント","パスワード") or die("失敗しました"); print "接続OK"<BR>; mysql_select_db("db1"); ここから先が知りたいです。 みなさまのお知恵を拝借したいです。 ぜひよろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHP/mySQLでインサートができません。

    PHPとmySQLを勉強中の初心者ですが、よろしくお願いします。 PHPで簡単なインサート文を作ってそれをmySQLに保存しようとしているのですが、以下のエラーが出てしまいます。 Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource プログラムは以下の通りです。HOSTNAME,USERNAME,DBPWDは別のところで定義していますが、mysql_connect, mysql_select_dbではエラーにならないので、データベースの選択まではうまく行っていると思うのですが。 $conn = mysql_connect(HOSTNAME, USERNAME, DBPWD); if(!$conn){ die("Logon Failure to mysql Server."); } $db = mysql_select_db(DBNAME, $conn); if(!$db){ die("Cannot access to the DB"); } foreach($csv_ary as $a => $b) { $query = "INSERT INTO TEST field_a VALUES $a"; if (!mysql_query($query, $db)){ echo "更新失敗: SQL=$query<br>"; } } mysql_close($conn); field_aはvarchar(10)でPrimary_key, NOT NULLの設定です。 Foreachで展開した配列の値はちゃんと長さ10の文字列が入っています。 PHP 4.3.11は mySQL 4.0.27です。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPとMYSQLでデータ登録

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 上記のようにエラーでました。分かる方いらっしゃいましたらよろしくお願いします。 ソースは下の通りです。 <?php $con = mysql_connect("localhost","root","matsushima") or die(mysql_error()); mysql_select_db("koukou") or die(mysql_error()); $sql = "insert into area(name_area) values('".$_POST[name_area]."')";//SQL文の作成 $res = mysql_query($sql) or die(mysql_error());//クエリの実行 mysql_close($con);//切断 ?> <html> <head> <title>登録完了画面(サンプルリスト)</title> <meta name="keywords" content="入力フォーム,確認画面,サンプル"> </head> <body> <p>

  • PHPでMySQLへの接続

    お世話になります。 phpを用いてMySQLへ接続したのですが、データが空で戻ってきました。lowは件数表示されましたし、行数もその分返ってきています。何か原因は考えられるでしょうか? <html> <head> <title>PHP TEST</title> </head> <body> <?php $link = mysql_connect('localhost', 'XXXX', 'XXXX'); if (!$link) { die('接続失敗です。'.mysql_error()); } print('<p>接続に成功しました。</p>'); $db_selected = mysql_select_db('XXXX', $link); if (!$db_selected){ die('データベース選択失敗です。'.mysql_error()); } print('<p>uriageデータベースを選択しました。</p>'); //mysql_set_charset('utf-8'); $result = mysql_query('SELECT * FROM sample'); if (!$result) { die('クエリーが失敗しました。'.mysql_error()); } while ($row = mysql_fetch_assoc($result)) { print('<p>'); print('id='.$row['str']); print(',name='.$row['etc']); print('</p>'); } $close_flag = mysql_close($link); if ($close_flag){ print('<p>切断に成功しました。</p>'); } ?> </body> </html>

    • ベストアンサー
    • PHP
  • PHPとMySQLで作ったプログラムについて

    PHP(Ver.5.2.5)とMySQL(Ver.5.0.45)で住所録プログラムを作りました。住所は登録できるのですが、PHPで住所録を表示すると新規登録分が表示されません。住所録登録プログラムではmysql_close文でDBをちゃんと終了しています。コマンドラインクライアントのselect*from文では新規登録分が1回でちゃんと表示されることと、住所録表示プログラムでブラウザーの更新ボタンをクリックすると新規登録分が表示されることから、住所録表示プログラムがおかしいのではないかと思い、いろいろ試したのですが、変わりません。住所録表示プログラムのスクリプトの一部を以下に示します。 <?php mysql_connect('localhost','root'); *rootパスワードは設定していません。 mysql_select_db('lesson'); $sql = 'select * from jushoroku'; $result = mysql_query($sql); $rows = mysql_num_rows($result); if($rows == 0){ echo "<p>該当データがありません。</p>"; }else{ while($row = mysql_fetch_array($result)){ echo "<p>"; echo $row["renban"]; echo ・・・ } } ?> 新規登録分を1回で表示するにはどこを直せば良いのでしょうか。どなたか教えてください。

    • ベストアンサー
    • PHP

専門家に質問してみよう