2010-04-14 246 views
1

我正在创建一个新的登录脚本/ members目录。PHP错误 - 登录脚本

我从头开始创建它没有任何框架(关于这个问题的建议也将不胜感激)。

的情况:

// Look up the username and password in the database 
    $query = "SELECT admin_id, username FROM admin WHERE adminname = '$admin_user' AND password = SHA1('$admin_pass')"; 
    $data = mysqli_query($dbc, $query); 

    if (mysqli_num_rows($data) == 1) { 

这段代码一直给我一个错误(尤其是最后一行):

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given in /home8/craighoo/public_html/employees/security/dir_admin.php on line 20 

当呼应查询我得到:

SELECT admin_id, adminname FROM admin WHERE adminname = 'admin' AND password = SHA1('password') 

编辑: 感谢大家。问题出在我的数据库列名和我引用的列名。

+2

我假设你正在使用PHP会议确保运行(如果你不应该!)会话成功登录后的session_regenerate_id()以防止已知漏洞。 – TravisO 2010-04-14 18:04:06

+2

而不是在数据库中运行SHA散列,我建议您使用PHP的SHA函数,特别是如果数据库服务器位于另一个盒子上,因为您将密码从Web服务器以纯文本的形式发送到数据库,即使它在您的网络,它仍然是一个漏洞。 – TravisO 2010-04-14 18:05:49

+1

旁注:您可能需要查看一下准备好的语句(http://php.net/manual/en/pdo.prepared-statements.php)以避免SQL注入攻击。 – pinkgothic 2010-04-14 18:08:39

回答

3

你的查询执行失败。发生这种情况时mysqli_query返回false(布尔值),当传递给mysqli_num_rows时,会出现此错误。

在执行之前打印查询并检查正确性。

+0

谢谢,我更新了原来的问题,现在正在查看我的SQL。 – 2010-04-14 18:03:08

+0

修正了它。感谢提醒,有时我忘记了调试的基本规则。 – 2010-04-14 18:07:03

2

考虑到mysqli_query失败时返回false,并且$ data是一个布尔值,在这里,我想在执行SQL查询期间发生错误。

你可以尝试使用mysqli_error找出这个错误是:

$data = mysqli_query($dbc, $query); 
if ($data !== false) { 
    // Do whatever you want with $data 
    if (mysqli_num_rows($data) == 1) { 
     // 
    } 
} else { 
    echo mysqli_error($dbc); 
    die; 
} 


注:呼应的错误信息和垂死的,像我一样在这里,是OK,同时深化发展脚本;但你不应该在生产中这样做。

相反,在生产中,你应该:

  • 错误记录到文件
  • 显示一个友好的信息给用户
+0

谢谢,我更新了原来的问题,现在正在查看我的SQL。 – 2010-04-14 18:03:27

+0

很高兴看到您解决了您的问题:-) – 2010-04-14 18:11:20

0

您是否尝试过通过phpmyadmin或控制台手动运行相同的查询?你会得到什么结果?

1

当你有一个关键的查询,这是最好的一个芯片添加到它,像这样:

mysqli_query($dbc, $query) or die('Critical error on line #'. __LINE__ .' when attempting to login ...<br>'. mysql_error());