我只有一个文本字段,用户可以在其中输入用户名或电子邮件地址以重置密码。
首先是代码:(我只包含我知道问题所在的代码)。
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;
}
不确定我做错了什么,可能是非常愚蠢的事情,但是当我输入我知道不在数据库中的用户名或电子邮件地址时,它仍然echo
已经我找到了一些东西
我做错了什么?
我打算使用rowCount
,但正如PHP手册所建议的那样:
PDOStatement::rowCount()
返回受相应PDOStatement对象执行的最后DELETE
,INSERT
或UPDATE
语句影响的行数。
如果关联的PDOStatement
执行的最后一条SQL语句是SELECT
声明,某些数据库可能会返回该语句返回的行数 但是,并不保证所有数据库都有这种行为,不应依赖于便携式应用程序。
所以基本上PHP手册说我应该在执行我的真实查询之前做Count(*)
然后使用结果。
答案 0 :(得分:3)
您可能是if (count($stmt->fetchAll()) > 0) {
答案 1 :(得分:3)
那是因为fetchAll()
返回一个数组。即使查询结果没有行,您仍然至少得到一个空数组,并且......
php > var_dump(array() > 0);
bool(true)
你需要做
if ($stmt->rowCount > 0) { ... }
代替。此外,你正在做COUNT(*)
,所以无论匹配什么,你都会获得包含匹配计数的单行结果。您需要获取该行,并检查该计数字段的值。
答案 2 :(得分:0)
$ statement - > fetchAll()将返回一个数组。将它与0进行比较是没有意义的。你可能想要count()从$ statement返回的结果集中的元素数 - > fetchAll()