好吧,所以我可能會丟失一些東西,但我在PHP中建立一個查詢。mysql發生了一些奇怪的事
$query=("UPDATE values SET max=max+$value, right=right+$value WHERE
id IN ($placement_id)";
$pdo->$query($query);
現在,奇怪的事情發生時,我檢查數據庫。所有具有匹配ID的行都會更新最大列,但右列不會。我確信它們都是數據庫中的int類型。
我錯過了什麼嗎?
好吧,所以我可能會丟失一些東西,但我在PHP中建立一個查詢。mysql發生了一些奇怪的事
$query=("UPDATE values SET max=max+$value, right=right+$value WHERE
id IN ($placement_id)";
$pdo->$query($query);
現在,奇怪的事情發生時,我檢查數據庫。所有具有匹配ID的行都會更新最大列,但右列不會。我確信它們都是數據庫中的int類型。
我錯過了什麼嗎?
您正在使用兩個保留字,right
和values
總結這些話在反引號,或選擇適合自己的表和列不同的詞。
$query=("UPDATE `values` SET max=max+$value, `right`=`right`+$value WHERE
id IN ($placement_id)";
然而,max
也可以發揮你的技巧,使包裝在反引號也。這是一個aggregate function。
$query=("UPDATE `values` SET `max`=`max`+$value, `right`=`right`+$value WHERE
id IN ($placement_id)";
有error reporting上,會指示的錯誤:因爲好像你正在使用PDO
error_reporting(E_ALL);
ini_set('display_errors', 1);
(和tagged這樣):$pdo->$query($query);
添加$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
右後連接打開。
旁註:你現在的代碼是開放的SQL injection。使用prepared statements或PDO with prepared statements。後者是你似乎用作MySQL API庫的東西。
從評論引用spencer7593
:
「此外,在連接上設置
PDO::ERRMODE_EXCEPTION
將導致PDO拋出錯誤(這是不是最合適的做法,我不建議這一點。但是如果我們不打算編寫代碼來執行檢查,看看語句是否成功,我們會讓MySQL錯誤被忽略,默認爲PDO::ERRMODE_SILENT
「。
非常感謝。我不能相信我錯過了這一點。 – 2014-08-28 20:06:15
@EliasBaez不客氣。 – 2014-08-28 20:06:35
+1此外,在連接上設置**'PDO :: ERRMODE_EXCEPTION' **將導致PDO拋出錯誤。 (這不是最合適的方法,我不會在所有情況下都推薦這種方法。但是如果我們不打算編寫代碼來執行檢查,爲了查看語句是否成功,我們將使用默認的** PDO :: ERRMODE_SILENT **來忽略MySQL錯誤。 – spencer7593 2014-08-28 20:07:00
[ **'RIGHT' **](HTTP://dev.mysql。 com/doc/refman/5.6/en/reserved-words.html)是mysql中的保留關鍵字,您需要在您的列周圍備份ticks – 2014-08-28 19:55:39
... as [[values]](http://dev.mysql.com /doc/refman/5.6/en/reserved-words.html) – 2014-08-28 19:56:36
我認爲這個查詢應該拋出一個錯誤,而不是修改任何列的內容。看起來你完全錯過了代碼易受SQL注入攻擊的想法。 – spencer7593 2014-08-28 20:01:32