簡體   English   中英

使用PHP更新MySQL字段的問題

[英]Problem with updating a MySQL field with PHP

我有一個問題:

更新選項SET votes = votes + 1 WHERE choice_id ='$ user_choice'

但是當我在我的腳本中執行它時,投票字段會更新兩次,所以投票將從4變為6而不是5。它似乎沒有被調用兩次,因為我回應了測試這個的東西而且只是得到一個回聲。 有沒有辦法讓它這樣PHP只會在每頁“刷新”時執行一次這個查詢?

編輯 :感謝您的回復,我使用的是常規MySQL,沒有MySQLi或PDO。 我發現的另一件事是,在進行查詢時,當你從0開始並更新為1時它會起作用,但之后它會變為3,5,7,......

另一個選擇是,如果您使用的是firefox並安裝了firbug,則需要禁用緩存。 由於某種原因,firbug導致兩次調用dB。 花了好幾周的時間才弄清楚我在哪里工作,因為QA在測試時會得到各種奇怪的結果。 他是唯一一個有螢火蟲的人。

PHP中有許多不同品牌的數據庫有幾個SQL接口。 您尚未顯示用於執行查詢的PHP代碼,也沒有確定您使用的數據庫品牌。

在PHP的一些SQL接口中,創建語句會隱式執行SQL。 然后你有機會獲取結果(如果它是一個SELECT語句)。 如果您的語句是SELECT或DELETE,則可能沒有造成任何損害,盡管不必執行兩次語句。 但是,如果您的語句是INSERT或UPDATE,您可能會發現它已生效兩次。

例如,使用PDO:

$pdo = new PDO(...options...);
$stmt = $pdo->query('UPDATE ...'); // executes once
$stmt->execute(); // executes a second time

這個答案是一種矯枉過正,但你可以通過啟用mysql中的二進制日志來確保它被執行兩次(記住,矯枉過正!)。 然后,您可以使用mysqllog工具查看這些文件,並查看查詢是否執行了兩次。

每個人都相信你的代碼中的某個地方正在被查詢兩次:)我正在使用這樣的查詢,它的工作正常。 另一件事,我有一個PEAR_DB對象的包裝類。 如果要求,它可以輸出在呈現當前頁面時使用的查詢(以及時間戳+堆棧跟蹤)。 我用它來查找重復的查詢(如你的)和慢速更新。

首先,您需要進行正確的查詢:

UPDATE `choices` SET `votes` = `votes` + 1 WHERE `choice_id` = '$user_choice'

此查詢必須正常工作。 也許你在PHP代碼中出錯並且這個查詢執行了兩次?

您可能只需要在votes + 1周圍加上括號,例如:

UPDATE choices SET votes = (votes + 1) WHERE choice_id = '$user_choice';

我也可以在最后加上一個LIMIT 1

另外,嘗試在PHP之外運行查詢,例如通過PHPMyAdmin? 另外,在運行之前嘗試回顯整個SQL ...您可能只是發現錯誤。

我剛剛創建了一個數據庫表來測試這個查詢,我必須說它運行正常。

UPDATE choices SET votes =(投票+1)WHERE choice_id ='1'

我認為代碼可以在你的應用程序中執行兩次,你可以嘗試打印出正在運行的sql。 您還可以針對數據庫本機運行輸出的sql語句。

總而言之,sql語句很好,只需將應用程序腳本加倍。

我只是在這里猜測,但是這個代碼可能會對頁面上使用的每個資源執行一次嗎? 因此,如果您有一個使用相同代碼的圖像或iframe,則兩個資源都會執行一次,從而導致該字段被更新兩次。

我上周剛剛在基於PDO的會話處理程序中使用了這個,我的測試計數器會觸發兩次,因為站點徽標也由php提供,我正在更新auto_prepend_file中的測試計數器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM