PHP MySQL更新语句失败
是的,我知道PHP MySQL更新语句有答案,但是没有一个能够解决这个问题。我的reset PHP文件使用bind_param或连接的变量准备查询。它在重定向到reset_success(重置成功)页面时也可以正常执行。但是,数据库记录将保持不变。我已确认网站使用的用户具有更新权限。我甚至尝试过转义PHP MySQL更新语句失败,php,mysql,sql-update,Php,Mysql,Sql Update,是的,我知道PHP MySQL更新语句有答案,但是没有一个能够解决这个问题。我的reset PHP文件使用bind_param或连接的变量准备查询。它在重定向到reset_success(重置成功)页面时也可以正常执行。但是,数据库记录将保持不变。我已确认网站使用的用户具有更新权限。我甚至尝试过转义密码,因为它是保留字的小写版本,没有任何效果。apache2错误日志也没有显示错误,因此没有帮助 代码如下: if (empty($error_msg)) { // Create a ran
密码
,因为它是保留字的小写版本,没有任何效果。apache2错误日志也没有显示错误,因此没有帮助
代码如下:
if (empty($error_msg)) {
// Create a random salt
$random_salt = hash('sha512', uniqid(openssl_random_pseudo_bytes(16), TRUE));
// Create salted password
$password = hash('sha512', $password . $random_salt);
// Prepare the update statement
//if ($update_stmt = $mysqli->prepare("UPDATE members SET password = ?, salt = ? WHERE email = ?")) {
if ($update_stmt = $mysqli->prepare("UPDATE members SET password = '".$password."', salt = '".$random_salt."' WHERE email = '".$_SESSION['email']."';")) {
// Binding params
//$update_stmt->bind_param('sss', $password, $random_salt, $_SESSION['email']);
// Execute the update statement
if ($update_stmt->execute()) {
header('Location: reset_success.php');
exit();
}
else{
header('Location: error.php?err=Reset failure: UPDATE');
exit();
}
}
else{
header('Location: error.php?err=Reset failure: PREPARE');
exit();
}
}
如有任何见解,将不胜感激 好的,它正在工作。我需要在函数文件中额外调用session_start(),即使reset_password.php没有重定向($_SERVER['php_SELF'])。对于以相同方式运行的注册页面及其相应的功能文件,这是不需要的。我仍然不清楚,当推荐人是自己并且没有重定向时,为什么还需要这样做。好的,它正在工作。我需要在函数文件中额外调用session_start(),即使reset_password.php没有重定向($_SERVER['php_SELF'])。对于以相同方式运行的注册页面及其相应的功能文件,这是不需要的。我仍然不清楚,当推荐人是自己并且没有重定向时,为什么还需要这样做。这应该是一个评论,但有点长 $random_salt=hash('sha512',uniqid(openssl_random_pseudo_字节(16),TRUE)) 这是非常错误的。您将盐从16位填充到64位,并通过散列去除熵。如果您想要64个随机字节,那么只需使用openssl_random_pseudo_字节(64) apache2错误日志也未显示任何错误 您是否检查过PHP错误日志记录是否正常工作 你为什么不检查mysql日志 如果($update\u stmt->execute()){
尝试检查$update\u stmt->affected\u rows()这应该是一条注释,但有点长 $random_salt=hash('sha512',uniqid(openssl_random_pseudo_字节(16),TRUE)) 这是非常错误的。您正在将salt从16位填充到64位,并通过散列删除熵。如果您想要64个随机字节,则只需使用openssl\u random\u pseudo\u字节(64) apache2错误日志也未显示任何错误 您是否检查过PHP错误日志记录是否正常工作 你为什么不检查mysql日志 如果($update\u stmt->execute()){
尝试检查$update\u stmt->affected\u rows()您应该查看。这比逃跑麻烦多了,生成的代码也会保护您免受SQL注入。我想这就是我使用$mysqli->prepare所做的。您能确保
$\u会话['email']吗
保存正确的值?但是您使用字符串替换来设置值,而不是绑定变量,这使得绑定部分(bind_param()
),您已经禁用了它,它是清理要绑定到查询中的变量的部分。您应该研究一下。这比转义麻烦多了,生成的代码也会保护您免受SQL注入的影响。我想这就是我使用$mysqli->prepare所做的事?请确保$\u会话['email']
保存正确的值?但是您使用字符串替换来设置值,而不是绑定变量,这使得绑定部分(bind_param()
),您已经禁用了它,它是清理要绑定到查询中的变量的部分。感谢您提供有关哈希的详细信息。apache2错误日志正在工作,我不确定MySQL日志是否正常。在debian上,我读到它应该保留为系统日志默认值,但在/var/log/MySQL/error.log下没有显示任何内容。我知道还没有足够的代表投票给你…谢谢你提供了关于散列的大量信息。apache2错误日志正在运行,我不确定MySQL日志是否正常。在debian上,我读到它应该保留为系统日志默认值,但在/var/log/MySQL/error.log下没有显示任何内容。我还没有足够的代表投票给你。。。