我正在使用以下查询
$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'"}
答案 0 :(得分:6)
您正在使用预准备语句。 所以使用准备好的陈述。使用:abilityPts
并绑定$abilityPts
的方式与绑定:myPlayerId
的方式相同。
$conn->prepare('UPDATE players SET ability = (ability + :abilityPts) WHERE id = :myPlayerId');
通过连接创建SQL查询并在字符串中嵌入PHP变量是一种非常糟糕的做法,它可以使您的代码对SQL注入开放,这是严肃的事情。准备好的陈述更清晰,更安全,并且通常被社区认为是最佳做法。如果您已经使用预备语句,那么表现良好,只需继续使用它们。
你应该按照我在1中描述的那样做。,但也要注意PHP中'
和"
之间的区别。
与双引号和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");