mysql发生了一些奇怪的事

问题描述:

好吧,所以我可能会丢失一些东西,但我在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

您正在使用两个保留字,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