2009-12-16 48 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個條目到數據庫。這個趨勢似乎是,當我運行代碼時,它輸入了先前的答案,然後是新的答案。 任何幫助將不勝感激。謝謝,

洛根

+1

對特定用戶提出的問題有多個答案是否無效?您可能需要考慮在您的表上使用唯一約束來強制執行該操作。 – mopoke 2009-12-16 00:41:46

+1

看來你可能已經切斷了你的一些代碼,如果是這樣的話,你能否包括其餘的代碼。 – Dostee 2009-12-16 00:44:00

+1

*咳嗽*。這看起來非常容易受到SQL注入的影響。請逃避你的變量... – Franz 2009-12-16 00:49:34

回答

1

好像你想要做的就是讓每用戶的問題只有一個答案。如果是這樣的話,你會希望在用戶名和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代碼中調用。要解決這個問題,我們必須看到更多的代碼。

0

如果您只允許每個用戶一個答案,則必須添加cmptrgeekken提到的唯一約束,但如果發生該問題,還必須處理主鍵違規:通知用戶它已經回覆或更換以前的值,取決於你希望網站的工作方式。

此外,是由於某種原因該請求觸發不止一次?也許通過JavaScript,或者你的其他邏輯?如果您只點擊一次就會出現重複的答案,這似乎就是這種情況。

/B

1

另一種辦法是先嚐試檢索你即將進入到數據庫中的數據。如果你找到它,它已經在那裏,所以不要再添加它。使用約束的建議是合理的,但如果您試圖防止重複的數據不容易添加到約束或您不希望重複的數據不是剛好相同的數據(也就是說類似的數據)那麼這是另一種選擇。