使用 COALESCE 但列仍在更新
Using COALESCE but the column is still updated
objective是,如果$_POST['password']
为空,不更新密码栏,但它是。
try {
$stmt = $db->prepare('UPDATE users SET email = :email, password = COALESCE(NULLIF(:password, ""), password) WHERE user_id = :user_id');
$stmt->bindValue(':user_id', (int) $_POST['user_id'], PDO::PARAM_INT);
$stmt->bindValue(':email', $_POST['email'], PDO::PARAM_STR);
$stmt->bindValue(':password', password_hash($_POST['password'], PASSWORD_BCRYPT), PDO::PARAM_STR);
$stmt->execute();
$_SESSION['success'] = 'User updated successfully.';
header('Location: '.DIRADMIN.'user.php');
exit;
} catch(PDOException $e) {
$_SESSION['error'] = 'An error occurred while updating the user.';
error_log($e->getMessage(), 0);
}
有什么想法吗?
编辑:
在我的示例中,我使用 COALESCE
到 return 第一个非 NULL 字符串。所以如果 NULLIF
returns NULL 因为 :password 等于 "",那么第一个非 NULL 字符串应该是 password 列的值。
我个人不会将这种检查委托给您的数据库代码;相反,我可能会在写入数据库之前使用 php ;这样你就可以避免建立不必要的数据库连接。
例如:
if (isset($_POST['password']) && !empty($_POST['password'])) {
// write to the database
} else {
// some error logic to flash the error back to the user
}
问题是您将 :password
绑定到 password_hash
的结果。当您散列空密码时,结果不是空字符串。尝试:
$stmt->bindValue(':password',
empty($_POST['password']) ? '' : password_hash($_POST['password'], PASSWORD_BCRYPT),
PDO::PARAM_STR);
objective是,如果$_POST['password']
为空,不更新密码栏,但它是。
try {
$stmt = $db->prepare('UPDATE users SET email = :email, password = COALESCE(NULLIF(:password, ""), password) WHERE user_id = :user_id');
$stmt->bindValue(':user_id', (int) $_POST['user_id'], PDO::PARAM_INT);
$stmt->bindValue(':email', $_POST['email'], PDO::PARAM_STR);
$stmt->bindValue(':password', password_hash($_POST['password'], PASSWORD_BCRYPT), PDO::PARAM_STR);
$stmt->execute();
$_SESSION['success'] = 'User updated successfully.';
header('Location: '.DIRADMIN.'user.php');
exit;
} catch(PDOException $e) {
$_SESSION['error'] = 'An error occurred while updating the user.';
error_log($e->getMessage(), 0);
}
有什么想法吗?
编辑:
在我的示例中,我使用 COALESCE
到 return 第一个非 NULL 字符串。所以如果 NULLIF
returns NULL 因为 :password 等于 "",那么第一个非 NULL 字符串应该是 password 列的值。
我个人不会将这种检查委托给您的数据库代码;相反,我可能会在写入数据库之前使用 php ;这样你就可以避免建立不必要的数据库连接。
例如:
if (isset($_POST['password']) && !empty($_POST['password'])) {
// write to the database
} else {
// some error logic to flash the error back to the user
}
问题是您将 :password
绑定到 password_hash
的结果。当您散列空密码时,结果不是空字符串。尝试:
$stmt->bindValue(':password',
empty($_POST['password']) ? '' : password_hash($_POST['password'], PASSWORD_BCRYPT),
PDO::PARAM_STR);