По какой-то причине он всегда возвращает 0, даже если в базе данных есть идентичный адрес электронной почты. Что-то не так с моим синтаксисом? Код работал, когда я делал это без оператора подготовки / выполнения. ...

0
pp182 20 Янв 2021 в 17:56

2 ответа

Лучший ответ

Вам просто нужно добавить $stmt->store_result();

function emailExists($conn, $email) {
    $stmt = $conn->prepare("SELECT 1 FROM accountInfo WHERE email=? LIMIT 1");
    $stmt->bind_param('s', $email);
    $stmt->execute();
    $stmt->store_result();
    return $stmt->num_rows;
}

Проверьте этот PHP-код здесь

1
Slava Rozhnev 20 Янв 2021 в 16:50

Не используйте real_escape_string(). Когда вы используете привязку параметров, не нужно ничего избегать.

Привязка параметров в mysqli довольно сложна, так как вы должны помнить странный синтаксис bind_param(). Требуется не менее 2 аргументов, первый - это строка символов, представляющих типы значений. У тебя этого нет.

В SQL не нужны скобки для параметров. Вы можете просто сделать email=?.

Если вы хотите проверить существование чего-либо с помощью SQL, вам не нужно использовать $stmt->num_rows. Вы можете использовать COUNT(1) в SQL, что должно быть проще. Фактически, забудьте о существовании этой функции / свойства, так как это приводит ко многим ошибкам, подобным вашей, и обычно бесполезно.

Когда мы исправим все мелкие проблемы, код должен выглядеть примерно так:

$email = $_POST['email'];

function emailExists(mysqli $conn, string $email):bool {
    $stmt = $conn->prepare("SELECT COUNT(1) FROM accountInfo WHERE email=? LIMIT 1");
    $stmt->bind_param('s', $email);
    $stmt->execute();
    return (bool) $stmt->get_result()->fetch_row[0];
}

echo emailExists($conn, $email);
2
Dharman 20 Янв 2021 в 15:12