我有以下问题。
此错误一直伴随着我
致命错误:未捕获错误:在C:\ xampp \ htdocs \ certificado \ functions.php中调用boolean上的成员函数fetchAll():堆栈跟踪:#0 C:\ xampp \ htdocs \ certificado \ index。 php(11):get_info_from_email(' amanda_pandoka @ ...')#1 {main}在第49行的C:\ xampp \ htdocs \ certificado \ functions.php中抛出
在下面的代码中,我无法理解错误。有人能帮助我吗?
function connect() {
$socket = new PDO('mysql:host=' . @$host . ';dbname=' . @$nomedobancodedados,
@$usuario, @$senha);
$socket->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
return $socket;
}
function get_info_from_email($email) {
if (!$email)
return false;
global $db;
$sql = "
SELECT
id,
name,
email,
type,
data,
file
FROM
attendee
WHERE 1=1
AND email = '{$email}'
";
if ($info = $db->query($sql))
return false;
if ($info = $info->fetchAll())
return false;
return $info;
}
答案 0 :(得分:2)
if ($info = $db->query($sql))
return false;
这表示:如果$db->query($sql)
的结果可以存储在$info
中且不是false
,null
或空字符串或数组,请立即停止返回false
。所以基本上,如果您的查询成功执行并正确返回PDOStatement
并在其中包含结果,那么您的函数将在此处停止。
if ($info = $info->fetchAll())
return false;
这是您收到错误的地方。达到此代码的事实意味着查询无法执行(否则,它将更早返回false
)。所以基本上,你在fetchAll()
上打电话给false
。尝试查看此处的错误(在此print_r($db->errorInfo());
之前执行if
- 语句)
顺便说一句,如果if
来电成功,那么此false
- 语句也会导致您的函数返回fetchAll()
,这可能不是什么你要。此外,通过直接使用$db->query()
函数调用中提供的电子邮件地址,您可以将代码保持为可能的SQL注入攻击。通常,如果您不能100%控制其中的内容,永远不会信任任何变量。你应该使用准备好的声明。
另据规则,总是在代码块上使用花括号(if
/ elseif
/ else
,for
/ {{1} } / foreach
/ while
,do
/ try
/ catch
),因为如果有一天你不再需要考虑它们决定代码块应该做两件事而不是一件事,如果你能直观地看到代码试图做的事情,那么调试代码会更容易。
此代码(未经测试)应按您希望的方式运行:
finally
答案 1 :(得分:-1)
像这样继续
function get_info_from_email($email) {
if (!$email) {
return false;
}
global $db;
$sql = $db->prepare("
SELECT
id,
name,
email,
type,
data,
file
FROM
attendee
WHERE 1=1
AND email = :email
");
print_r($db->errorInfo());
// return false if the query cannot be executed
if (!$sql->execute(array(':email' => $info))) {
return false;
}
// return false if there was an **error** retrieving the query results
if (($info = $sql->fetchAll()) === false) {
return false;
}
return $info;
function get_info_from_email($email) {
if (!$email) {
return false;
}
global $db;
$sql = $db->prepare("
SELECT
id,
name,
email,
type,
data,
file
FROM
attendee
WHERE 1=1
AND email = :email
");
print_r($db->errorInfo());
// return false if the query cannot be executed
if (!$sql->execute(array(':email' => $info))) {
return false;
}
// return false if there was an **error** retrieving the query results
if (($info = $sql->fetchAll()) === false) {
return false;
}
return $info;