• ベストアンサー

効率のよいテーブルにするには?

PHPとMYSQLを使用して投票システムのようなものを作っています。 ひとつの投票タイトルにおいて同じIPアドレスからの二重投票を防ぐには、どのようなプログラムにすれば一番効率がいいのでしょうか? ・ 誰でもタイトルを作成できるため、タイトルは次々と増えていく。 ・ 一度、あるタイトルに投票したIPアドレスでは、2度と同じタイトルに投票できない。 (他のタイトルになら投票できる) ・ 会員制ではなく、誰でも自由に投票することができる。 とりあえず方法を考えてみたのですが、投票ごとにレコードが増えていくため、後々、IPアドレス確認時に重くならないか心配です。 これで大丈夫か、それとも、もっと効率のいい方法があれば教えてください。 [ データベース ] テーブル = sample タイトルID = id IPアドレス = ip [ PHP ] タイトルID = $title  $db = mysql_connect("LOCALHOST","root",""); // データベース接続  $adress = getenv("REMOTE_ADDR"); // IPアドレス取得  // IPアドレス確認  $sql = " SELECT count(*) as hoge FROM sample WHERE id='$title' and ip='$adress'";  $result = mysql_query($sql,$db);  $count = mysql_fetch_array($result); if($count[hoge] == 0){    // 投票プログラム     ( 省略)       // IPをテーブルに登録    $sql = "INSERT INTO sample(id,ip) VALUES('$title','$adress')";    $result = mysql_query($sql,$db); } else{print"二重投稿です。";}

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

  • ベストアンサー
回答No.2

#1回答者さんも述べていますが、複数列でプライマリキーを構成できるので、MySQL側に重複チェックを任せるのが最もシンプルです。 重複エラーを発生させたくないなら、事前に条件検索して重複チェックしてもいいでしょう。 【表定義例】 create table sample (id varchar(30), ip varchar(17), primary key(id,ip));

mogrin_001
質問者

お礼

プライマリキーを調べてみました。 こんなに便利なものを知らなかったとは・・・、教えていただいて本当に助かりました。 >>重複エラーを発生させたくないなら、事前に条件検索して重複チェックしてもいいでしょう。 すいません、重複チェックをする場合は最初に挙げた方法でよろしいのでしょうか?  // IPアドレス確認  $sql = " SELECT count(*) as hoge FROM sample WHERE id='$title' and ip='$adress'";  $result = mysql_query($sql,$db);  $count = mysql_fetch_array($result); if($count[hoge] == 0){ (省略) } else{print"二重投稿です。";}

その他の回答 (1)

noname#182251
noname#182251
回答No.1

MYSQLは使用したことがないのですが、複数列でプライマリーキーを設定できるはずです。それならば ・IPアドレスとタイトルIDをプライマリーキーにしたテーブル使用して投票すれば

mogrin_001
質問者

お礼

プライマリーキーの存在は知りませんでした、早速、調べてみることにします。どうもありがとうございました。

関連するQ&A