Моя функция возвращает true, когда я ожидаю false - PullRequest
0 голосов
/ 13 октября 2019

Я не понимаю, почему мой код возвращает 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 возврат.

Где я ошибся в этом?

1 Ответ

3 голосов
/ 13 октября 2019

Есть фантастический, но недооцененный ответ, Если ваш код делает что-то неожиданное, есть большая вероятность, что вы где-то делаете предположение .

Вы еще не изучили краеугольный каменьКонцепция в искусстве программирования называется debugging . Что означает , вы должны проверять каждое сделанное вами предположение .

Здесь вы предполагаете, что когда запрос возвращает строку, оператор (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) return true - это тавтология . Оператор $count > 0 уже возвращает true или false, так что вы можете вернуть его результат сразу, без лишних условий
  • , более того, 1 так же хорошо, как и истина в PHP. Таким образом, в конце вы можете сразу же вернуть результат fetchColumn (). в случае, если строка найдена, она будет 1 равной true и просто false в противном случае.
...