使用php中的变量更新int列

时间:2013-03-07 08:32:34

标签: php sql prepared-statement

我正在使用以下查询

$abilityPts = xxx;
$statement = $conn->prepare('UPDATE players SET ability = (ability + $abilityPts) WHERE id = :myPlayerId');

然而它给出了错误..

$abilityPts column not found

我该如何解决这个问题?

{"error":"SQLSTATE[42S22]: Column not found: 1054 Unknown column '$abilityPts' in 'field list'"}

5 个答案:

答案 0 :(得分:6)

  1. 您正在使用预准备语句。 所以使用准备好的陈述。使用:abilityPts并绑定$abilityPts的方式与绑定:myPlayerId的方式相同。

    $conn->prepare('UPDATE players SET ability = (ability + :abilityPts) WHERE id = :myPlayerId');
    

    通过连接创建SQL查询并在字符串中嵌入PHP变量是一种非常糟糕的做法,它可以使您的代码对SQL注入开放,这是严肃的事情。准备好的陈述更清晰,更安全,并且通常被社区认为是最佳做法。如果您已经使用预备语句,那么表现良好,只需继续使用它们。

  2. 你应该按照我在1中描述的那样做。,但也要注意PHP中'"之间的区别。

    ' (Single quoted):

      

    与双引号和heredoc语法不同,特殊字符的变量和转义序列在单引号字符串中出现时不会被扩展。

    这基本上意味着以下内容:

    $a = 15;
    echo 'My favorite is $a.'; //My favorite is $a.
    echo "My favorite is $a."; //My favorite is 5.
    

    有关详细信息,请阅读PHP manual on Strings

答案 1 :(得分:-2)

将变量放在单引号中不会对变量进行求值。使用双引号或字符串连接。

为了避免进一步惩罚我的相当通用的答案:你不应该直接在数据库的查询中直接使用变量,尤其是在使用预准备语句时。

答案 2 :(得分:-2)

$statement = $conn->prepare(sprintf('UPDATE players SET ability = (ability + %d) WHERE id = :myPlayerId', $abilityPts));

试试这个

答案 3 :(得分:-2)

尝试执行以下操作:

$statement = $conn->prepare("UPDATE players SET ability = (ability + " . $abilityPts . ") WHERE id = :myPlayerId");

答案 4 :(得分:-2)

请尝试以下代码:

$abilityPts = xxx;
$statement = $conn->prepare("UPDATE players SET ability = (ability + ".$abilityPts.") WHERE id = :myPlayerId");