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

解決済みの質問

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

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"二重投稿です。";}

投稿日時 - 2006-12-29 03:18:45

QNo.2632000

困ってます

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

#1回答者さんも述べていますが、複数列でプライマリキーを構成できるので、MySQL側に重複チェックを任せるのが最もシンプルです。

重複エラーを発生させたくないなら、事前に条件検索して重複チェックしてもいいでしょう。

【表定義例】
create table sample
(id varchar(30),
ip varchar(17),
primary key(id,ip));

投稿日時 - 2006-12-29 13:49:09

お礼

プライマリキーを調べてみました。
こんなに便利なものを知らなかったとは・・・、教えていただいて本当に助かりました。


>>重複エラーを発生させたくないなら、事前に条件検索して重複チェックしてもいいでしょう。


すいません、重複チェックをする場合は最初に挙げた方法でよろしいのでしょうか?


 // 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"二重投稿です。";}

投稿日時 - 2006-12-29 19:47:33

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

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

回答(2)

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

投稿日時 - 2006-12-29 06:06:24

お礼

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

投稿日時 - 2006-12-29 19:19:50

あなたにオススメの質問