【发布时间】:2014-10-13 21:17:36
【问题描述】:
我正在尝试创建一个表单,提交后将更新包含用户信息的数据库。我正在使用 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
if(isset($_POST['username'])){
$id = $_SESSION['id'];
$username = $_POST['username'];
$first_name = $_POST['first_name'];
$last_name = $_POST['last_name'];
$email = $_POST['email'];
$password1 = $_POST['password1'];
$password2 = $_POST['password2'];
if ($password1 === $password2){
updatesettings($id, $username, $first_name, $last_name, $email, $password);
}
}
我没有包含表单的 HTML,虽然它也在上面的文件中。
memfuncs.php
function updatesettings($id, $username, $first_name, $last_name, $email){
global $db;
$db->beginTransaction();
try {
// UPDATE USERNAME
$st2 = $db->prepare("UPDATE users SET username = :username WHERE id = :id");
$st2->execute();
$st2->bindParam (":username", $username, PDO::PARAM_STR);
$st2->bindParam (":id", $id, PDO::PARAM_INT);
//UPDATE FIRST + LAST NAME
$st = $db->prepare("UPDATE users SET first_name = :first_name AND last_name = :last_name WHERE id = :id");
$st->execute();
$st->bindParam (":first_name", $first_name, PDO::PARAM_STR);
$st->bindParam (":last_name", $last_name, PDO::PARAM_STR);
$st->bindParam (":id", $id, PDO::PARAM_INT);
// UPDATE Email
$st3 = $db->prepare("UPDATE users SET email = :email WHERE id = :id");
$st3->execute();
$st3->bindParam(":email", $email, PDO::PARAM_STR);
$st3->bindParam(":id", $id, PDO::PARAM_INT);
// COMMIT CHANGES
$db->commit();
} catch (Exception $error){
$db->rollBack();
echo "Failed: " . $error->getMessage();
}
}
我做错了什么?
【问题讨论】:
-
错误信息准确地告诉你你做错了什么。查看
prepare、bind和execute语句的顺序。 -
正如@MikeW 所说,execute() 应该在每个“准备”块的 bindParam 之后完成。
-
FWIW 您不需要三个查询来对一行进行三个更改 - 您可以在一个查询中完成。那么你也不需要交易。