2009-12-16 3 views
0

Я пишу веб-сайт викторины.
Что должно случиться:Команда INSERT, вставляющая дубликаты

  • страница имеет вопрос о нем и четыре кнопки или текстового поля.
  • При нажатии на кнопку, она называет себя число ответов в адрес как: ?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

+1

Недействительно ли иметь более одного ответа на вопрос от конкретного пользователя? Возможно, вам стоит подумать о том, чтобы применить это ограничение, используя уникальное ограничение для вашей таблицы. – mopoke

+1

похоже, что вы, возможно, отрезали часть кода, не могли бы вы включить остальные, если это так. – Dostee

+1

* кашель *. Это выглядит очень уязвимым для SQL-инъекций. Удалите переменные ... – Franz

ответ

1

Похоже, что вы хотите сделать, это разрешить только один ответ на каждый вопрос для каждого пользователя. Если это так, то вы будете хотеть UNIQUE ограничение на вашем столе на ID_пользователя и QID:

ALTER TABLE answers ADD UNIQUE(userid,qid); 

Это приведет к ошибке при попытке вставить строку с тем же идентификатором пользователя и QID. Если вы хотите, чтобы пользователи могли изменить свою ошибку, вы можете изменить свой ВСТАВИТЬ запрос:

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

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

0

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

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

/B

1

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

Смежные вопросы