使用fetchAll()从PDO对象中进行选择

时间:2012-12-25 00:46:04

标签: php mysql pdo

由于某种原因,以下代码始终返回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,谢谢。

2 个答案:

答案 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;