2

各位晚安,

有另一个“看着这个太长的时刻”。

此代码在运行时返回成功消息,但没有任何内容输入到数据库表中,没有引发错误,我知道从 _post 接收到所有正确的值但我看不出有什么问题,我有一个几乎相同的查询另一个页面,它工作正常。

任何人都可以看到代码的问题吗?

if (isset($_POST['username']) && $_POST['username'] !== '')
{

    $salted = md5($_POST['pass1'] . 'salt');

  try
  {
    $sql = 'INSERT INTO users SET 
      username = :username,
      firstname = :firstname,
      lastname = :lastname,
      email = :email,
      password = $salted,
      joined = CURDATE()';
    $s = $PDO->prepare($sql);
    $s -> bindValue(':username', $_POST['username']);
    $s -> bindValue(':firstname', $_POST['firstname']);
    $s -> bindValue(':lastname', $_POST['lastname']);
    $s -> bindValue(':email', $_POST['email']);
    $s -> execute();

  }
  catch (PDOException $e)
  {
    $error = 'Error adding submitted user.';
    echo $error;
    exit();
  }

  ?> <div class="alert alert-success">User added to the database.</div> <?php

}
4

1 回答 1

1

为了得到答案,在这里总结评论。标记的社区 Wiki。

  • 应引用 INSERT 语句中的字符串。

      password = '$salted',
    
  • 无论如何,您都应该使用参数。

      password = :password,
    
      . . .
    
      $s -> bindValue(':password', $salted);
    
  • MD5 不是现代强密码存储的首选散列函数。SHA1 也不是。
    尝试改用 SHA256 或 Bcrypt。

    $salted = hash('sha256', $_POST['pass1'] . 'salt');
    
  • 如果您对每个用户使用随机盐字符串,则盐渍效果会更好。

  • 确保您的 PDO 实例配置为抛出异常

    $PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
  • 始终捕获 PDO 异常的错误消息,即使您不将其输出给用户。

    error_log($e->getMessage());
    
于 2013-10-06T19:09:50.717 回答