-1

您知道是什么导致了这段简单代码上的警告消息吗?

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,所以不用担心。

如您所见,实际上有三个问题。如果这是一个问题,请在降级之前让我知道,以便我可以编辑我的问题。谢谢!

4

6 回答 6

2

将 $query_cookie 更改为 $query。

尝试:

$result_cookie = mysql_query($query_cookie);

您在 mysql_query() 语句中指的是 $query 。该变量不存在。

于 2013-09-13T08:22:00.820 回答
2

文档

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

在尝试从中提取记录之前,您应该始终检查mysql_query调用结果是否为 not 。false

您还将错误的变量传递给您的mysql_query调用。你的 SELECt 在$query_cookie并且你正在通过$query

于 2013-09-13T08:22:12.087 回答
1

尝试这个:

 change $id = $row_cookie[id]; instead of $id = $row_cookie;
于 2013-09-13T08:27:49.080 回答
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);
于 2013-09-13T08:23:23.623 回答
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. 如何在 PHP 中使用 bcrypt 对密码进行哈希处理?
  2. “让我登录”——最好的方法
于 2013-09-13T08:25:37.760 回答
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;
   }
于 2013-09-13T08:35:42.440 回答