PHP / MYSQL допускает только один голос на одного члена?

Я дал задание на работу по созданию системы голосования наград, я не слишком много знаю о php и mysql. Но я знаю об этом больше, чем кто-либо еще, и мой босс в отпуске. Но я повторно использовал код, который ранее был оставлен в нашей системе и адаптировал его в этом году.

В принципе система голосования работает нормально, и я создал новые таблицы в mysql для сбора данных. Я нашел один довольно большой недостаток в существующем коде, хотя и не знаю, как его изменить. В принципе, код позволяет людям голосовать столько раз, сколько они хотят в данный момент. Я хочу ограничить его только 1 голосом на одного члена, чтобы все было честно.

Таким образом, на данный момент члены регистрируются с номером членства, а затем голосуют. Голоса хранятся в таблицах mysql, и я могу добавить голоса, запросив данные.

Я надеялся, что кто-то может помочь мне добавить строку или два кода, которые просто проведут проверку, проголосовал ли член. Когда член голосует, их член нет. хранится в таблицах 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()); ?> 

благодаря

    Related of "PHP / MYSQL допускает только один голос на одного члена?"

    Вот быстрый и грязный подход:

     $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 } 

    Как отметил Писворор, это решение имеет (по крайней мере) два ограничения:

    1. Он ограничен методом, содержащим его, поэтому он не предотвращает множественные голоса в целом – только с помощью этого конкретного метода. (Вы можете написать функцию, которая будет содержать эту же проверку, но вам все равно придется вызывать эту функцию везде, где пользователь пытается проголосовать.)
    2. Это приводит к дополнительной нагрузке на базу данных, что может быть неприемлемым в сценарии с высоким трафиком.

    С учетом этих соображений моя рекомендация заключалась в том, чтобы сначала запустить скрипт для проверки наличия повторяющихся значений member_id в вашей таблице голосов, удалить все, кроме одного, в каждом случае, а THEN добавить ограничение UNIQUE в вашу таблицу. Оттуда вы можете быть уверены, что в вашей таблице никогда не будет более одной строки с тем же элементом member_id.

    Вы можете добавить ограничение UNIQUE к вашей таблице. Это одноразовая операция – вам не нужно делать это каждый раз, когда выполняется ваш скрипт, это изменение структуры таблицы. Запустите это в своем инструменте администрирования MySQL (например, phpMyAdmin, Navicat, HeidiSQL, what-have-you):

     ALTER TABLE awards_2009_votes ADD UNIQUE (member_id); 

    После этого изменения не удастся добавить второе голосование с одинаковым идентификатором участника – 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 } 

    Я не уверен в вашем коде, какова ваша структура таблицы, но следующая структура таблицы ограничивает голосование пользователя одним голосом на каждую тему:

    Таблица пользователей

     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 

    Вы можете написать несколько строк следующим образом: althouth Я не проверял, но они должны работать …

     $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()); }