由于某种原因,以下代码始终返回true,无论参数是什么以及SQL行实际内部是什么。它还会抛出错误“注意:第7行的C:\ wamp \ www \ Social Networking \ INC \ login.inc中未定义的偏移量:0”,但我没有看到错误:
<?php
function checkAccount($username, $password){
include("INC/dbconnect.inc");/*"INC/dbconnect.inc" is <?php $pdo = new PDO("mysql:host=localhost;dbname=socialnetwork","user","123"); ?>*/
$select = $pdo->prepare("SELECT id,password FROM users WHERE user_username = :username");
$select->execute(array(':username'=>$username));
$q_rows = $select->fetchAll();
if($q_rows[0][0]/*the ID of the user, it should always be greater than 1, if not then the username does not exist*/ > 0 && $q_rows[0][0] != null){
if($q_rows[0][1]/*the password of the user*/ == $password)
return true;
else
return false;
}
else
return false;
$pdo=null;
} ?>
有人可以告诉我有什么问题吗?我在代码内部评论了我遇到的问题,并且我尝试了普通的$select->fetch()
而不是$select->fetchAll()
无济于事。在发布此内容之前,我已经阅读了PDO(http://php.net/manual/en/pdostatement.fetchall.php)。这是文件的其余部分http://pastebin.com/YCkrRivs,谢谢。
答案 0 :(得分:0)
如果数据库没有返回任何行,则不会有条目$q_rows[0]
。因此,当您尝试检索不存在的数组中的行时,未定义的偏移量为0。您的“ID”不是&gt; 0表示不存在的用户不是正确的摘要。
示例返回看起来像这样(如果你print_r()'d it)
用户在场:
$q_rows = Array (
[0] => Array (
[id] => 1,
[password] => 'dno23n3io3'
)
)
没有用户在场:
$q_rows = Array (
)
你应该这样做:
if(size($q_rows) > 0) {
//Handle user present
} else {
//Handle no user present
}
答案 1 :(得分:0)
您不需要使用fetchAll
,只需使用fetch
:
$q_row = $select->fetch();
if ($q_row) {
// do your logic ...
}
你要返回字符串"true"/"false"
,而不是布尔值,你应该使用true/false
。
更简单,你可以这样做:
$q_row = $select->fetch();
return $q_row && $q_row[0] > 0 && $q_row[1] === $password;