Команда INSERT вставка дубликатов - PullRequest
0 голосов
/ 16 декабря 2009

Я пишу веб-сайт викторины.
Что должно произойти:

  • На странице есть вопрос и четыре кнопки или текстовое поле.
  • Когда вы нажимаете кнопку, она вызывает себя с номер ответа в адресе как: ?q=[question number]&a=[answer].
  • Если вопрос использует текстовое поле, оно отправляет ответ.
  • Этот код должен обнаружить, что что-то было отправлено на него и запишите это в базу данных.
  • Идентификатор пользователя хранится в файле cookie.
  • В базе данных также есть ключевой столбец. идея заключается в том, что в нем хранятся все ответы, которые пользователь отправил в течение определенного времени, и пользователи могут изменять свои ответы.
    <?PHP
        mysql_connect("------", "------", "------") or die();
        mysql_select_db("------") or die();
        $q=$_GET['q'];
        if(isset($_GET['a'])){
            $a=$_GET['a'];
        } else {
            $a=$_POST['longanswer'];
        }       
        if(isset($a)){
            $u=$_COOKIE['id'];
            if($qust['atype']==1){
                mysql_query("INSERT INTO answers (`userid` ,`answer` ,`qid`) VALUES ($u, $a, $q);");
            } else {
                mysql_query("INSERT INTO answers (`userid` ,`answer` ,`qid`) VALUES ($u, '$a', $q);");
            }
        }
    ?>
    

Не думаю, что это должно иметь значение, но позже в коде он запрашивает базу данных с помощью команды SELECT.
Когда я запускаю этот код, кажется, вводит 2 или 3 записи в базу данных. Кажется, что тенденция заключается в том, что когда я запускаю код, он вводит предыдущий ответ, за которым следует новый ответ. Любая помощь будет принята с благодарностью. Спасибо,

Logan

Ответы [ 3 ]

1 голос
/ 16 декабря 2009

Другой вариант - сначала попытаться получить данные, которые вы собираетесь ввести в базу данных. Если вы найдете его, он уже есть, поэтому не добавляйте его снова. Предложения по использованию ограничений обоснованы, но если данные, которые вы пытаетесь предотвратить дубликаты, нелегко добавить в ограничения, или данные, которые вы не хотите дублировать, не являются точно теми же данными ( скажи просто аналогичные данные) тогда это еще один вариант.

1 голос
/ 16 декабря 2009

Похоже, что вы хотите, чтобы разрешить только один ответ на вопрос для каждого пользователя. Если это так, то вы захотите УНИКАЛЬНОЕ ограничение для вашей таблицы по идентификатору пользователя и qid:

ALTER TABLE answers ADD UNIQUE(userid,qid);

Это приведет к ошибке при попытке вставить строку с тем же идентификатором пользователя и qid. Если вы хотите разрешить пользователям изменять свою ошибку, вы можете изменить свой запрос INSERT на:

INSERT INTO answers (userid ,answer ,qid) VALUES ($uid, '$answer', $qid) ON DUPLICATE KEY UPDATE answer='$answer'

Это предотвратит отображение нескольких записей в базе данных, но из вашего PHP-кода все равно могут быть вызваны несколько INSERT. Чтобы это исправить, нам нужно увидеть еще немного вашего кода.

0 голосов
/ 16 декабря 2009

Уникальное ограничение, упомянутое cmptrgeekken, должно быть обязательно добавлено, если вы разрешаете только один ответ для пользователя, но затем вы должны также обработать нарушение первичного ключа, если оно происходит: информировать пользователя, на которого он уже ответил, ИЛИ заменить предыдущее значение, в зависимости о том, как вы хотите, чтобы сайт работал.

Кроме того, по какой-то причине запрос срабатывает более одного раза? Может быть, по javascript или какой-то другой вашей логике? Если дубликаты ответов появляются, когда вы нажимаете только один раз, похоже, это так.

/ B

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...