2012-04-17 95 views
1

我只有一个文本字段,用户可以在其中输入用户名或电子邮件地址以重置密码。PHP PDO - 返回结果,当它不应该?

首先这里是代码:(我只包含我知道问题所在的代码)。

try { 

    // connect to database 
    $dbh = sql_con(); 

    // prepare query 
    $stmt = $dbh->prepare(" 
        SELECT COUNT(*) 
        FROM 
         users 
        WHERE 
         user_login = :username 
        OR 
         user_email = :email 
        "); 

    // execute query 
    $stmt->execute(array(':username' => $username_email, ':email' => $username_email)); 

    if ($stmt->fetchAll() > 0) { 

     // something was found 
     // just echoing at the moment until i figure out what i am doing wrong 
     echo 'i found something'; 
     exit; 

    } else { 
     // nothing found 
     echo 'i found nothing'; 
     exit; 
    } 

} 
catch (PDOException $e) { 

    ExceptionErrorHandler($e); 
    require_once($footer_inc); 
    exit; 
} 

不知道我做错了,可能是一些很无聊的,但是当我输入用户名或邮箱地址,我知道是不是在数据库中仍回声出我发现了一些

请问有人能告诉我我做错了吗?

我打算用rowCount而是由PHP手册中的建议也指出:

PDOStatement对象:: rowCount时()返回受上一DELETE,INSERT,或通过执行UPDATE语句的行数相应的PDOStatement对象。 如果由关联的PDOStatement执行的最后一条SQL语句是SELECT 语句,则某些数据库可能会返回该语句返回的行数。
但是,这种行为不能保证所有的数据库,不应该依赖于便携式应用程序。

所以基本上,PHP手册说我应该做一个Count(*)之前执行我真正的查询然后处理结果。

回答

3

你也许意味着if (count($stmt->fetchAll()) > 0) {

+0

谢谢你...我改变了代码,你上面显示的和改变的SQL查询,它现在的作品。谢谢,phplover – PHPLOVER 2012-04-17 16:52:06

3

这是因为fetchAll()返回数组。即使查询结果中没有行,你仍然可以获得至少一个空数组,并...

php > var_dump(array() > 0); 
bool(true) 

你需要做的

if ($stmt->rowCount > 0) { ... } 

代替。此外,您正在执行COUNT(*),因此无论匹配什么,您都会得到一个包含匹配计数的单行结果。您需要获取该行,并检查该计数字段的值。

+0

在问题中提到他为什么不使用它。这就是我投票的原因。 – 2012-04-17 16:41:12

0

$ statement - > fetchAll()将返回一个数组。将它与0比较是没有意义的。你可能是想count()从$语句返回的结果集中的元素的数量 - > fetchAll()