PHP MySQL更新语句失败

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

是的,我知道PHP MySQL更新语句有答案,但是没有一个能够解决这个问题。我的reset PHP文件使用bind_param或连接的变量准备查询。它在重定向到reset_success(重置成功)页面时也可以正常执行。但是,数据库记录将保持不变。我已确认网站使用的用户具有更新权限。我甚至尝试过转义
密码
,因为它是保留字的小写版本,没有任何效果。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下没有显示任何内容。我还没有足够的代表投票给你。。。