if ($info = $db->query($sql))
return false;
这表示:如果结果$db->query($sql)
可以存储在$info
并且不是类似的东西false
, null
或空字符串或数组,立即停止并返回false
。所以基本上,如果您的查询成功执行并正确返回PDOStatement
有了结果,你的函数就到此为止了。
if ($info = $info->fetchAll())
return false;
这就是您收到错误的地方。事实上,到达此代码意味着查询无法执行(否则,它会返回false
较早)。所以基本上,你打电话fetchAll()
on false
。尝试看看这里的错误是什么(执行print_r($db->errorInfo());
在这之前if
-陈述)
顺便说一下,这个if
-语句也会导致你的函数返回false
if the fetchAll()
电话是成功的,这可能不是您想要的。此外,通过使用$db->query()
直接使用函数调用中提供的电子邮件地址,您的代码将面临可能的 SQL 注入攻击。一般来说,never如果您无法 100% 控制其中的内容,请相信任何变量。您应该使用准备好的语句。
作为另一条规则,always在代码块上使用花括号 (if
/elseif
/else
, for
/foreach
/while
/do
, try
/catch
/finally
),因为如果有一天您决定代码块应该做两件事而不是一件,那么您就不需要再考虑它们,并且如果您可以直观地看到代码正在尝试执行的操作,则调试代码会更容易。
此代码(未经测试)应该按照您想要的方式工作:
function get_info_from_email($email) {
if (!$email) {
return false;
}
global $db;
$stmt = $db->prepare("
SELECT
id,
name,
email,
type,
data,
file
FROM
attendee
WHERE 1=1
AND email = :email
");
// return false if the query cannot be executed
if (!$stmt->execute(array(':email' => $email))) {
return false;
}
// return false if there was an **error** retrieving the query results
if (($info = $stmt->fetchAll()) === false) {
return false;
}
return $info;
}