【问题标题】:Updating table using PDO : Syntax Error使用 PDO 更新表:语法错误
【发布时间】:2016-03-30 11:03:10
【问题描述】:

我正在创建一个函数来更改表用户的密码,但我遇到了语法错误

函数如下:

 public function changepassword($password, $newpassword) {
        $user_id = $_SESSION["userSession"];
        $stmt = $this->db->prepare("SELECT * FROM user WHERE user_id=:user_id");
        $stmt->execute(array(":user_id" => $user_id));
        $userRow = $stmt->fetch(PDO::FETCH_ASSOC);
        if ($password = $userRow['password']) {
            $sql = "UPDATE user set password=:password WHERE user_id=:user_id";
            $stmt2 = $this->db->query($sql);
            $stmt->execute(array(":user_id" => $user_id, ":password" => $password ));
            $stmt2->execute();
            return true;
        } else {
            return false;
        }
    }

这是函数调用

if (isset($_POST['btn-save'])) {
    $password = $_POST['password'];
    $newpassword = $_POST['newpassword'];
    $newpassword2 = $_POST['newpassword2'];

    if ($newpassword == $newpassword2) {
        if ($user->changepassword($password, $newpassword)) {
            header("Location: selfedit.php?inserted");
        } else {
            header("Location: selfedit.php?failure");
        }
    } else {
        header("Location: selfedit.php?failurematch");
    }
}

这是我得到的错误:

致命错误:带有消息的未捕获异常“PDOException” 'SQLSTATE[42000]: 语法错误或访问冲突:1064 你有一个 SQL 语法错误;检查与您对应的手册 MariaDB 服务器版本,用于在 ':password 附近使用正确的语法 WHERE user_id=:user_id' at line 1' in C:\xampp\htdocs\aDatabase2\class.user.php:37 堆栈跟踪:#0 C:\xampp\htdocs\aDatabase2\class.user.php(37): PDO->query('更新用户 设置...') #1 C:\xampp\htdocs\aDatabase2\selfedit.php(8): USER->changepassword('fereira', 'umdois') #2 {main} 抛出 C:\xampp\htdocs\aDatabase2\class.user.php 在第 37 行

编辑 1

我根据this question cmets更改了功能,得到了不同的错误

public function changepassword($password, $newpassword) {
    $user_id = $_SESSION["userSession"];
    $stmt = $this->db->prepare("SELECT * FROM user WHERE user_id=:user_id");
    $stmt->execute(array(":user_id" => $user_id));
    $userRow = $stmt->fetch(PDO::FETCH_ASSOC);
    if ($password == $userRow['password']) {
        $sql = "UPDATE user set password=:newpassword WHERE user_id=:user_id";
        $stmt2 = $this->db->prepare($sql);
        $stmt2->execute(array(":user_id" => $user_id, ":password" => $newpassword ));
        return true;
    } else {
        return false;
    }
}

新错误:

致命错误:带有消息的未捕获异常“PDOException” 'SQLSTATE[HY093]: 无效的参数号:未定义参数' 在 C:\xampp\htdocs\aDatabase2\class.user.php:37 堆栈跟踪:#0 C:\xampp\htdocs\aDatabase2\class.user.php(37): PDOStatement->执行(数组)#1 C:\xampp\htdocs\aDatabase2\selfedit.php(8): USER->changepassword('ferreira', 'anotherpass') #2 {main} 抛出 C:\xampp\htdocs\aDatabase2\class.user.php 在第 37 行

【问题讨论】:

  • 我不使用 PDO,但那可能是 prepare(),而不是 query()
  • @Blackhole 是正确的。 query() 用于简单查询,但prepare()/execute() 必须与参数一起使用。
  • if - $stmt 中有 2 个 execute() 有绑定,而 $stmt2 没有。这将是你的错误的原因。
  • 比较不正确。 $password = $userRow['password'] 设置$password
  • @TylerSebastian 您应该在绑定中包含冒号。驱动程序当前会自动附加它,但如果他们将来删除该功能,您可能会不走运。

标签: php mysql pdo


【解决方案1】:

它的工作原理是从 EDIT 1 更改这一行:

 $sql = "UPDATE user set password=:newpassword WHERE user_id=:user_id";

到这里:

$sql = "UPDATE user set password=:newpassword WHERE user_id=:user_id";

最终功能:

public function changepassword($password, $newpassword) {
    $user_id = $_SESSION["userSession"];
    $stmt = $this->db->prepare("SELECT * FROM user WHERE user_id=:user_id");
    $stmt->execute(array(":user_id" => $user_id));
    $userRow = $stmt->fetch(PDO::FETCH_ASSOC);
    if ($password == $userRow['password']) {
        $sql = "UPDATE user set password=:password WHERE user_id=:user_id";
        $stmt2 = $this->db->prepare($sql);
        $stmt2->execute(array(":user_id" => $user_id, ":password" => $newpassword ));
        return true;
    } else {
        return false;
    }
}

【讨论】:

    猜你喜欢
    • 2017-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 2013-05-26
    相关资源
    最近更新 更多