Php 我的函数在预期为false时返回true

Php 我的函数在预期为false时返回true,php,function,pdo,return,boolean,Php,Function,Pdo,Return,Boolean,我不明白为什么我的代码会返回true,而我期望的是false,反之亦然。这是我的密码: public function CheckMac($mac){ $database = new Database(); $db = $database->connectDatabase(); $checkedmac = $db->prepare("SELECT * FROM `displays` WHERE `displayMac` = '$mac'"); $che

我不明白为什么我的代码会返回
true
,而我期望的是
false
,反之亦然。这是我的密码:

public function CheckMac($mac){
    $database = new Database();
    $db = $database->connectDatabase();
    $checkedmac = $db->prepare("SELECT * FROM `displays` WHERE `displayMac` = '$mac'");
    $checkedmac->execute();
    $count = (int)$checkedmac->fetchColumn();
    if ($count > 0) {
        return true;
    } else {
        return false;
    }
}
我有正确的查询,当我回显
$mac
并将其放入查询中时,phpMyAdmin会返回预期的行,因为它存在于数据库中,但当我运行此代码时,我会得到一个
false
返回


我在这一点上哪里出错了?

有一个奇妙但被低估的答案

您还需要学习编程艺术中称为调试的基础概念。这意味着你应该验证你所做的每一个假设

这里假设当查询返回一行时,
(int)$checkedmac->fetchColumn()语句返回一个正数。所以你必须验证它

我可以假设表中的第一列不包含正数,而是一个字符串。转换为数字的字符串将返回0。它将解释为什么在找到记录时得到0。但你也必须验证它

如果我的假设被证明是正确的,只需选择一个常量值,而不是不确定的
*
。例如,您可以使用
1
,您的查询将完美地工作:

public function CheckMac($db, $mac){
    $stmt = $db->prepare("SELECT 1 FROM `displays` WHERE `displayMac` = ?");
    $stmt->execute([$mac]);
    return $stmt->fetchColumn();
}
几点注意:

  • 您应该始终只连接一次。在单个位置预先创建$db变量,然后在任何地方使用它
  • 您使用的是无保护的。它应该始终是我的示例中所示的方式
  • if($count>0)返回true
    是重言式。
    $count>0
    语句已返回
    true
    false
    ,因此您可以直接返回其结果,而无需附加条件
  • 此外,1在PHP中与true一样好。因此,最终您可以立即返回fetchColumn()的结果。如果找到该行,则该行的值为1等于true,否则为false
启用错误报告/检查日志。您希望从查询中得到什么结果?您想统计表中可用的记录数吗?现在一切都正常了,您使我的代码变得更好了,谢谢您的帮助。解释非常好!