2014-08-28 47 views
-3

好吧,所以我可能會丟失一些東西,但我在PHP中建立一個查詢。mysql發生了一些奇怪的事

$query=("UPDATE values SET max=max+$value, right=right+$value WHERE 
     id IN ($placement_id)"; 
$pdo->$query($query); 

現在,奇怪的事情發生時,我檢查數據庫。所有具有匹配ID的行都會更新最大列,但右列不會。我確信它們都是數據庫中的int類型。

我錯過了什麼嗎?

+4

[ **'RIGHT' **](HTTP://dev.mysql。 com/doc/refman/5.6/en/reserved-words.html)是mysql中的保留關鍵字,您需要在您的列周圍備份ticks – 2014-08-28 19:55:39

+1

... as [[values]](http://dev.mysql.com /doc/refman/5.6/en/reserved-words.html) – 2014-08-28 19:56:36

+0

我認爲這個查詢應該拋出一個錯誤,而不是修改任何列的內容。看起來你完全錯過了代碼易受SQL注入攻擊的想法。 – spencer7593 2014-08-28 20:01:32

回答

5

您正在使用兩個保留字,rightvalues

總結這些話在反引號,或選擇適合自己的表和列不同的詞。

$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 statementsPDO with prepared statements。後者是你似乎用作MySQL API庫的東西。


從評論引用spencer7593

「此外,在連接上設置PDO::ERRMODE_EXCEPTION將導致PDO拋出錯誤(這是不是最合適的做法,我不建議這一點。但是如果我們不打算編寫代碼來執行檢查,看看語句是否成功,我們會讓MySQL錯誤被忽略,默認爲PDO::ERRMODE_SILENT「。

+0

非常感謝。我不能相信我錯過了這一點。 – 2014-08-28 20:06:15

+0

@EliasBaez不客氣。 – 2014-08-28 20:06:35

+1

+1此外,在連接上設置**'PDO :: ERRMODE_EXCEPTION' **將導致PDO拋出錯誤。 (這不是最合適的方法,我不會在所有情況下都推薦這種方法。但是如果我們不打算編寫代碼來執行檢查,爲了查看語句是否成功,我們將使用默認的** PDO :: ERRMODE_SILENT **來忽略MySQL錯誤。 – spencer7593 2014-08-28 20:07:00

相關問題