【发布时间】: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 您应该在绑定中包含冒号。驱动程序当前会自动附加它,但如果他们将来删除该功能,您可能会不走运。