2016-06-08 86 views
1

是的,我知道PHP MySQL更新语句有答案,但是他们都没有解决这个问题。我的重置PHP文件使用bind_param或连接变量准备好查询。它也会在重定向到reset_success页面时正常执行。但数据库记录保持不变。我已确认该网站正在使用的用户具有更新权限。我甚至试过逃避password,因为它是一个保留字的小写版本,没有任何工作。 apache2错误日志也显示没有错误,所以没有帮助。PHP MySQL更新语句失败

的代码如下:

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(); 
    } 
} 

任何有识之士将不胜感激!

+0

你建议立即进行删除看看[预处理语句(HTTP:// PHP。净/手动/ EN/pdo.prepared-statements.php)。它比逃避的麻烦少得多,而且最终的代码也会保护你免受SQL注入。 – Mureinik

+0

我以为这就是我正在做的$ mysqli-> prepare? –

+1

你能否确保'$ _SESSION ['email']'保持正确的值? – Tushar

回答

0

好的,它工作。即使reset_password.php没有重定向($ _SERVER ['PHP_SELF']),我还需要在函数文件中调用session_start()。这对于以相同方式操作的注册页面及其对应的功能文件不是必需的。我仍然不清楚为什么当引用者本身而不是重定向时需要这样做。

0

这应该是一个评论,但它有点长。

$ random_salt =散列( 'SHA512',uniqid(openssl_random_pseudo_bytes(16),TRUE));

这非常错误。您正在填充16到64位的盐通过哈希来消除熵。如果你想要64个随机字节,那么只需使用openssl_random_pseudo_bytes(64)。

Apache2的错误日志也显示没有错误

是否检查PHP错误日志记录工作?

为什么你没有检查mysql日志?

如果($ update_stmt->的execute()){

尝试检查$ update_stmt-> affected_rows()

+0

感谢您提供有关哈希的伟大信息。apache2错误登录正在工作,我不确定MySQL日志记录是。在debian上,我读到它应该保留为系统日志记录默认值,但在/var/log/mysql/error.log下没有显示。我没有足够的代表让你赞不绝口...... –