gpt4 book ai didi

带有子查询的 PHP PDO UPDATE 语句

转载 作者:行者123 更新时间:2023-11-29 02:11:52 24 4
gpt4 key购买 nike

我正在尝试使用 PDO 创建一个查询,其中该查询包含一个子查询。代码不工作。使用 Workbench,我可以执行查询并且它确实执行了。

我觉得在使用 PDO 时派生表时这里有细微差别。

    $turn = 1;
$phase = -1;
$status = "waiting";
$gameid = 1;

$stmt = $this->connection->prepare("
UPDATE playerstatus
SET
turn = :turn,
phase = :phase,
status = :status,
value = value + (SELECT reinforce FROM games where id = :gameid)
WHERE
gameid = :gameid
");

$stmt->bindParam(":turn", $turn);
$stmt->bindParam(":phase", $phase);
$stmt->bindParam(":status", $status);
$stmt->bindParam(":gameid", $gameid);

$stmt->execute();

我尝试了很多调整,它只是在执行时失败了。

编辑错误:

Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number

最佳答案

PDO 命名占位符的一个已知(但没有详细记录)限制:同一个绑定(bind)占位符不能在一条语句中使用多次。解决方法是使用不同的绑定(bind)占位符名称。

(PDO 中的这个限制可能已经在以后的版本中得到解决(?)。我认为根本原因是“在幕后”,PDO 正在用位置符号问号替换命名占位符。这个问题不受限制对于 UPDATE 语句,同样的问题困扰着所有使用命名占位符的 PDO SQL 语句。)


此外,与问题无关,我建议使用 bindValue 代替 bindParam

将绑定(bind)占位符名称更改为不同/唯一。此处显示,将出现的 :gameid 之一更改为 :gameid2

           value = value + (SELECT reinforce FROM games where id = :gameid)
WHERE
gameid = :gameid2
^

我们需要为每个绑定(bind)占位符提供一个值。这意味着我们需要添加另一行。使用 bindValue,我们可以引用同一个变量而无需复制它。

    $stmt->bindValue(":gameid", $gameid);
$stmt->bindValue(":gameid2", $gameid);
^

关于带有子查询的 PHP PDO UPDATE 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50009983/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com