2013-03-25 67 views
0

我尝试了解为什么我在我的具体情况下得到布尔错误的代码适用于其他人的新手。我有一个函数返回$ user_id,稍后将在会话中使用它。这是他的功能:PHP布尔错误

function login($username, $password) { 
     $user_id = user_id_from_username($username); 
     $username = sanitize($username); 
     $password = sha1($password); 
     return (mysql_result(mysql_query("SELECT COUNT (user_id) FROM users WHERE username = '$username' AND password = '$password'"), 0) == 1) ? $user_id : false ; 
    } 

这总是导致失败,与此error: Warning: mysql_result() expects parameter 1 to be resource, boolean given in。用一个指向这一行的行号。

return (mysql_result(mysql_query("SELECT COUNT (`user_id`) FROM users WHERE username  = '$username' AND password = '$password'"), 0) == 1) ? $user_id : false ; 

为什么这会失败?这不足以检查查询成功和测试结果的天气。数据库连接和SQL查询似乎是正确的,无论我使用'或省略。经过几个小时的研究,我设法用if语句去除错误。像这样:

function login($username, $password) { 
     $user_id = user_id_from_username($username); 
     $username = sanitize($username); 
     $password = sha1($password); 
     $result = mysql_query("SELECT COUNT (user_id) FROM users WHERE username = '$username'AND password = '$password'"); 
     if ($result == 1) { 
      return $user_id; 
     } else if ($result == 0) { 
      return false; 
     } 
    } 

我想知道为什么第二个函数可以工作,而不是第一个。你是否必须使用if语句来检查查询?如果有更好的方式来写这个函数请建议:)

+0

更新:我整天都在为这个代码苦苦挣扎,因为即使用户名和密码是正确的,它也不会匹配密码和用户名。发现在$密码中留下sha1,完成工作并匹配。为什么密码安全性会导致函数返回错误?奇怪的。 – 2013-03-25 23:15:55

回答

1

也许你有错误的查询,以便mysql_query回报false

替换:

return (mysql_result(mysql_query("SELECT COUNT (user_id) FROM users WHERE username = '$username' AND password = '$password'"), 0) == 1) ? $user_id : false ; 

有:

$result = mysql_query("SELECT COUNT(user_id) as count FROM users WHERE username = '$username' AND password = '$password'") or die(mysql_error()); 

return (mysql_result($result, 0, 'count') == 1) ? $user_id : false ; 

,你会看到mysql错误。

+0

谢谢Narek你的代码确实工作,没有错误:)。只是所以我明白这一点,所以我必须分开mysql_query和mysql_result,并且使用“as count”作为user_id也是必要的。这也可以应用于此代码。这个代码也是如此。函数user_exists($ username){$ username = sanitize($ username); return(mysql_result(mysql_query(“SELECT COUNT(user_id)FROM users WHERE username ='$ username'”),0)== 1)? true:false;}} - 如果是这样,我曾尝试在此处应用它的解决方案,但失败: – 2013-03-25 15:20:07

+0

$ result = mysql_query(“SELECT COUNT(username)as count FROM users WHERE username ='$ username'”)或死亡(“无法执行选择查询 - ”。mysql_error());;; return(mysql_result($ result,0,'count')=== 1)? true:false导致无法执行select查询 - FUNCTION lr.COUNT不存在。检查参考手册中的'函数名称分析和解析'部分。我又在做什么错了?注:我没有设法使代码块,当我按下输入文章对不起。 – 2013-03-25 15:24:24

+0

将'COUNT(用户名)'改为'COUNT(用户名)'(不含空格),但最好改为COUNT(*)',将会更快。 – Narek 2013-03-26 05:46:46