MySQL警告,WHERE子句

时间:2013-09-13 08:19:46

标签: php mysql

您是否知道在这个简单的代码中导致警告消息的原因是什么?

if(isset($_POST['remember']))
{
       $query_cookie = ("SELECT id FROM users WHERE email = '$email' OR username = '$username'"); 
       $result_cookie = mysql_query($query);
       $row_cookie = mysql_fetch_array($result_cookie); // LINE 36
       $id = $row_cookie; // Will be hashed before using
       setcookie( "Remember", $id, strtotime( '+30 days' ) ); 
       echo $id;
}

这是我得到的错误:

  

警告:mysql_fetch_array()要求参数1为资源,布尔值在第36行的C:\ xampp \ htdocs \ Signup \ includes \ login.php中给出

我遇到的另一个问题是我的查询。基本上我有一个带三个输入的登录表单:一个用于用户名,一个用于电子邮件,一个用于密码。我希望用户能够使用他的用户名或密码登录。然而,查询看起来有点奇怪,我想知道它是否会按预期工作,因为最终查询将以这样的结尾:

SELECT id FROM users WHERE email = 'user@host.com' OR username = '' 

或者相反。我猜这个查询不是完全正常的。如果你有任何建议,我愿意接受建议。

$ id与$ row_cookie atm相同,因为$ id将被哈希。如果我做一个简单的$id = sha1(md5($row_cookie));会不会好的?

我知道MySQL已经折旧了。我很快就会切换到MySQLi,所以不用担心。

正如您所看到的,实际上有三个问题。如果这是一个问题,请在降级之前告诉我,以便我可以编辑我的问题。谢谢!

6 个答案:

答案 0 :(得分:2)

将$ query_cookie更改为$ query。

尝试:

$result_cookie = mysql_query($query_cookie);

您在mysql_query()语句中引用了$ query。该变量不存在。

答案 1 :(得分:2)

来自the docs

  

对于SELECT,SHOW,DESCRIBE,EXPLAIN和其他返回结果集的语句,mysql_query()会在成功时返回资源,或者在出错时返回FALSE。

在尝试从中提取记录之前,您应该始终检查mysql_query来电的结果是否不是false

您还将错误的变量传递给mysql_query来电。您的SELECt位于$query_cookie,您正在通过$query

答案 2 :(得分:1)

你犯了一个小错误:

 $query_cookie = ("SELECT id FROM users WHERE email = '$email' OR username = '$username'"); 
 $result_cookie = mysql_query($query_cookie);
 $row_cookie = mysql_fetch_array($result_cookie);

答案 3 :(得分:1)

假设电子邮件或用户名字段是唯一的,并且您拒绝可能的SQL注入,请尝试:

if (isset($_POST['remember'])) {
    $query_cookie = ("SELECT id FROM users 
        WHERE email = '$email' OR username = '$username'");
    $result_cookie = mysql_query($query_cookie);
    if ($result_cookie) {
        $row_cookie = mysql_fetch_array($result_cookie);
        $id = $row_cookie['id'];
        setcookie("Remember", $id, strtotime('+30 days'));
        echo $id;
    }
}

获取结果后获取id尝试:$row_cookie['id']

我建议使用bcrypt进行散列。它是一种可通过硬件扩展的散列算法。

查看更多信息:

  1. How do you use bcrypt for hashing passwords in PHP?
  2. “Keep Me Logged In” - the best approach

答案 4 :(得分:1)

试试这个:

 change $id = $row_cookie[id]; instead of $id = $row_cookie;

答案 5 :(得分:0)

检查是否退回记录。

  if(isset($_POST['remember']))
  {
      $query_cookie = ("SELECT id FROM users WHERE email = '$email' OR username = '$username'"); 
      $result_cookie = mysql_query($query);
      if($result_cookie === FALSE) {
          echo "Could not successfully run query ($query) from DB: " . mysql_error();
          exit;
      }
      $row_cookie = mysql_fetch_array($result_cookie); // LINE 36
      $id = $row_cookie; // Will be hashed before using
      setcookie( "Remember", $id, strtotime( '+30 days' ) ); 
      echo $id;
   }