2

我正在使用以下查询

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

但是它给了mer错误..

$abilityPts column not found

我该如何解决这个问题?

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

5 回答 5

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

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

    通过连接创建 SQL 查询并将 PHP 变量嵌入字符串是一种非常糟糕的做法,它会使您的代码容易受到 SQL 注入的影响,这是一项严重的业务。准备好的语句更清晰、更安全,并且被社区普遍接受为最佳实践。如果您已经在使用准备好的语句,那么您做得很好,请继续使用它们。

  2. 您应该执行我在 1. 中描述的操作,但还要注意PHP 中的'和之间的区别。"

    ' (单引号):

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

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

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

    有关详细信息,请阅读有关字符串的 PHP 手册

于 2013-03-07T08:34:21.357 回答
-2

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

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

于 2013-03-07T08:35:02.337 回答
-2
$statement = $conn->prepare(sprintf('UPDATE players SET ability = (ability + %d) WHERE id = :myPlayerId', $abilityPts));

试试这个

于 2013-03-07T08:36:15.383 回答
-2

尝试执行以下操作:

$statement = $conn->prepare("UPDATE players SET ability = (ability + " . $abilityPts . ") WHERE id = :myPlayerId");
于 2013-03-07T08:36:17.370 回答
-2

请尝试以下代码:

$abilityPts = xxx;
$statement = $conn->prepare("UPDATE players SET ability = (ability + ".$abilityPts.") WHERE id = :myPlayerId");
于 2013-03-07T08:36:40.083 回答