PHP警告:PDOStatement :: execute():SQLSTATE [HY093]:参数号无效:没有参数被绑定

时间:2014-10-13 21:17:37

标签: 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

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

}   

我做错了什么?

2 个答案:

答案 0 :(得分:2)

你执行得很早,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()并将PDOException放入try块中,那么在3 $db->beginTransaction();处修复此问题,因为这可能会失败!

答案 1 :(得分:2)

您需要在执行语句之前绑定参数。在执行语句时,参数将被评估,因此需要在此时设置它们!

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

$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之后运行,该{{1}}用于从查询中获取结果