【问题标题】:PHP Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: no parameters were bound [closed]PHP警告:PDOStatement::execute():SQLSTATE [HY093]:无效的参数号:没有绑定参数[关闭]
【发布时间】: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();
    }

}   

我做错了什么?

【问题讨论】:

  • 错误信息准确地告诉你你做错了什么。查看preparebindexecute 语句的顺序。
  • 正如@MikeW 所说,execute() 应该在每个“准备”块的 bindParam 之后完成。
  • FWIW 您不需要三个查询来对一行进行三个更改 - 您可以在一个查询中完成。那么你也不需要交易。

标签: php pdo


【解决方案1】:

在执行语句之前需要绑定参数。参数是在语句执行的时候进行计算的,所以此时需要设置它们!

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

$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之后运行。

【讨论】:

    【解决方案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() 时,请在 3 个地方修复此问题,如果您要捕获异常,请捕获 PDOException 并将 $db->beginTransaction(); 放入 try 块中,因为这可能会失败!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-21
      • 2016-04-12
      • 1970-01-01
      相关资源
      最近更新 更多