3

私は賞の投票システムを設定する仕事をしていましたが、php と mysql についてあまり知りません。しかし、私はここにいる誰よりもこのことを知っており、私の上司は休暇中です。しかし、以前はシステムに残されていたコードを再利用して、今年に合わせて調整しています。

基本的に、投票システムは正常に機能しており、データを取得するために mysql に新しいテーブルをセットアップしました。ただし、既存のコードにかなり大きな欠陥が 1 つ見つかりましたが、それを修正する方法がわかりません。基本的に、このコードにより、人々は現時点で何度でも投票できます。公平を期すために、メンバーごとに 1 票に制限したいと思います。

そのため、現時点では、会員は会員番号でログインしてから投票します。投票は mysql テーブルに保存され、データを照会して投票を追加できます。

メンバーがすでに投票したかどうかを確認するだけのコードを 1 行または 2 行追加するのを誰かが手伝ってくれることを期待していました。メンバーが投票すると、そのメンバーNo. 投票の選択とともにSQLテーブルに保存されます。したがって、おそらく最善の方法は、memeberid がテーブルに既に存在するかどうかを確認し、存在する場合は、ユーザーに投票済みであること、またはその旨を伝えることです。

<?php
//Insert into volunteer awards
$coach=mysql_real_escape_string($_SESSION['coach']);
$official=mysql_real_escape_string($_SESSION['official']);
$young_volunteer=mysql_real_escape_string($_SESSION['young_volunteer']);
$volunteer=mysql_real_escape_string($_SESSION['volunteer']);

$memberid=$_SESSION['MM_Username'];
$association=$_SESSION['MM_Association'];
$region=$_SESSION['Region'];


$sql_query = mysql_query("INSERT INTO awards_2009_votes (`id`, `member_id`, `region`, `coach`, `official`, `volunteer`, `young_volunteer`) VALUES ('', '$memberid', '$region', '$coach', '$official', '$volunteer', '$young_volunteer')") or die (mysql_error());
?>

ありがとう

4

4 に答える 4

8

テーブルに UNIQUE 制約を追加できます。これは 1 回限りの操作です。スクリプトを実行するたびにこれを行う必要はありません。これはテーブル構造の変更です。これを MySQL 管理ツール (phpMyAdmin、Navicat、HeidiSQL、what-have-you など) で実行します。

ALTER TABLE awards_2009_votes ADD UNIQUE (member_id);

この変更後、同じメンバー ID で 2 番目の投票を追加することはできなくなります。INSERT (または UPDATE) は失敗します。

ここでの利点は、チェックがデータベースで自動的に行われることです。そのため、1) コードの重複をチェックしたり、2) 複数の投票を手動で追加したりすることを心配する必要はありません。


@ middaparkaが言うINSERT IGNOREように、「重複キー」エラーを回避するために使用する必要があります。

$sql_query = mysql_query("INSERT IGNORE INTO awards_2009_votes (`member_id`, `region`, `coach`, `official`, `volunteer`, `young_volunteer`) VALUES ('$memberid', '$region', '$coach', '$official', '$volunteer', '$young_volunteer')") or die (mysql_error());
if (mysql_insert_id()) {
    // row was inserted - vote added
} else {
    // row was not inserted - already voted
}
于 2009-09-15T12:14:15.390 に答える
3

あなたのコードからあなたのテーブル構造が何であるかはわかりませんが、次のテーブル構造では、ユーザーの投票がトピックごとに 1 票に制限されます。

ユーザー テーブル

user_id int unsigned not null auto_increment,
username varchar
// and other user info fields

トピックス表

topic_id int unsigned not null auto_increment,
topic_title varchar
// and other topic info fields

投票表

user_id,
topic_id,
vote_value,
primary key (user_id,topic_id) //this is the constraint that will allow only one vote
于 2009-09-15T12:17:33.777 に答える
1

これは、迅速で汚いアプローチです。

$sql_query = "SELECT FROM awards_2009_votes WHERE member_id = '$memberid'";
$sql_result = mysql_query($sql_query);
$num_rows = mysql_num_rows($sql_result);

if ($num_rows > 0) {
    // this member has already voted
} else {
    // carry on
}

ただし、Piskvor が指摘したように、このソリューションには (少なくとも) 2 つの制限があります。

  1. それを含むメソッドに限定されているため、一般的に複数の投票を妨げているわけではなく、この特定のメソッドのみを使用しています。(これと同じチェックを含む関数を作成することもできますが、ユーザーが投票しようとするすべての場所でその関数を呼び出す必要があります。)
  2. これにより、データベースにさらに負荷がかかり、トラフィックの多いシナリオでは受け入れられない可能性があります。

これらの点を念頭に置いて、最初にスクリプトを実行して、投票テーブルで重複する member_id 値が発生していないかどうかを確認し、それぞれの場合に 1 つを除いてすべて削除してから、UNIQUE 制約をテーブルに追加することをお勧めします。そこから、テーブルに同じ member_id を持つ複数の行が存在しないことを確認できます。

于 2009-09-15T12:13:46.060 に答える
0

次のように数行書くことができますが、チェックしていませんが、動作するはずです...

$result=mysql_query("select count(*) count from awards_2009_votes where member_id='$memberid'");

$has_voted_array=mysql_fetch_array($result);
if($has_voted['count']!=0)
echo "You have already registered youur vote";
else
{
//do normal operation
$sql_query = mysql_query("INSERT INTO awards_2009_votes (id, member_id, region, coach, official, volunteer, young_volunteer) VALUES ('', '$memberid', '$region', '$coach', '$official', '$volunteer', '$young_volunteer')") or die (mysql_error());
}
于 2009-09-15T12:17:37.767 に答える