PHP警告:PDOStatement::execute():SQLSTATE[HY093]:无效参数编号:未绑定任何参数

PHP警告:PDOStatement::execute():SQLSTATE[HY093]:无效参数编号:未绑定任何参数,php,pdo,Php,Pdo,我正在尝试创建一个表单,当提交该表单时,它将更新包含用户信息的数据库。我正在使用PDO和事务,但在提交表单时不断出现以下错误 PHP Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: no parameters were bound in /var/www/html/resources/memfuncs.php on line 75 这是我的密码: Settings.php 我没有包括表单

我正在尝试创建一个表单,当提交该表单时,它将更新包含用户信息的数据库。我正在使用PDO和事务,但在提交表单时不断出现以下错误

PHP Warning:  PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: no parameters were bound in /var/www/html/resources/memfuncs.php on line 75
这是我的密码:

Settings.php

我没有包括表单的HTML,尽管它也在上面的文件中

memfuncs.php

我做错了什么?

您很早就执行了,在准备和绑定之后,执行应该是最后一件事:

$st3 = $db->prepare("UPDATE users SET email = :email WHERE id = :id");
$st3->bindParam(":email", $email, PDO::PARAM_STR);
$st3->bindParam(":id", $id, PDO::PARAM_INT);
$st3->execute();

因此,在执行时在3个位置修复此问题,如果您要捕获异常,也可以捕获PDOException并放置$db->beginTransaction;在try块中,因为这可能会失败

在执行语句之前,需要绑定参数。在执行语句时,将对参数进行求值,因此需要在此点设置参数

因此,您的代码应该如下所示:

$st2 = $db->prepare("UPDATE users SET username = :username WHERE id = :id");
$st2->bindParam (":username", $username, PDO::PARAM_STR);
$st2->bindParam (":id", $id, PDO::PARAM_INT);
$st2->execute();

请注意,bindColumn用于从查询中获取结果,通常应在执行后运行。

错误消息准确地告诉您错误所在。查看prepare、bind和execute语句的顺序。正如@MikeW所说,执行应该在每个prepare块的bindParam之后完成。FWIW对一行进行三次更改不需要三次查询,只需一次查询即可。你也不需要交易。
$st3 = $db->prepare("UPDATE users SET email = :email WHERE id = :id");
$st3->bindParam(":email", $email, PDO::PARAM_STR);
$st3->bindParam(":id", $id, PDO::PARAM_INT);
$st3->execute();
$st2 = $db->prepare("UPDATE users SET username = :username WHERE id = :id");
$st2->bindParam (":username", $username, PDO::PARAM_STR);
$st2->bindParam (":id", $id, PDO::PARAM_INT);
$st2->execute();