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


PHP Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: no parameters were bound

我正在尝试创建一个表单,该表单在提交时将更新包含用户信息的数据库。我正在使用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();
    }
}   

我做错了什么?

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

所以你的代码应该是这样的:

$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通常应该在execute之后运行,它是关于从查询中获取结果

如果执行到早期,execute()应该是准备和绑定后最后一件事:

$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();

因此,当您execute()时,请在3个位置修复此问题,如果您要捕获异常,请捕获PDOException并将$db->beginTransaction();放入try块,因为这可能会失败!