MYSQL db возвращает неверный счет - PullRequest
1 голос
/ 11 ноября 2011

Этот фрагмент кода возвращает 1 каждый раз, даже если в таблице базы данных нет указанного адреса электронной почты.Как вы, я помещаю die ($ count) сразу после bind_result.Возвращает 1 каждый раз.Вы заметили что-то неправильное в моем коде?

    $stmt = $db->prepare("SELECT COUNT(id) FROM `users` WHERE `email`=? LIMIT 1") or die($db->error);
    $stmt->bind_param("s", $email) or die ($stmt->error);
    $stmt->execute() or die ($stmt->error);
    $count=$stmt->bind_result($count) or die ($stmt->error);
            die($count);
            $stmt->close();
    return ($count > 0 ? true : false);

Ответы [ 2 ]

2 голосов
/ 11 ноября 2011

Вы не вызвали $stmt->fetch(), чтобы поместить результат запроса в связанную переменную $ count.

Поэтому значение $ count устанавливается равным возвращаемому значению $stmt->bind_result(), которое всегда равно true (1) или false (0).

См. Примеры на http://php.net/manual/en/mysqli-stmt.bind-result.php,, вы используете bind_result(), чтобы сообщить оператору, в каких PHP переменных хранить результаты, но вы должны получить результаты запроса как отдельный вызов fetch().


Комментарий: Ни одна из этих функций не возвращает результат вашего подсчета.

Функции возвращают TRUE в случае успеха и FALSE в случае ошибки. Они не возвращают результат запроса. Вот почему вы связываете переменную, поэтому выборка может сохранить результат в этой переменной как побочный эффект, а не как возвращаемое значение. Вы не должны назначать $count=*anything*.

Вот как должен выглядеть ваш код:

$stmt = $db->prepare("SELECT COUNT(id) FROM `users` WHERE `email`=? LIMIT 1") 
    or die($db->error);
$stmt->bind_param("s", $email) 
    or die ($stmt->error);
$stmt->execute() 
    or die ($stmt->error);
$stmt->bind_result($count)  // do not use return value
    or die ($stmt->error);
$stmt->fetch() // do not use return value
    or die ($stmt->error);
print ($count);
$stmt->close()
    or die ($stmt->error);
return ($count > 0 ? true : false);
1 голос
/ 11 ноября 2011

bind_result связывает переменные с подготовленным оператором для хранения результатов и возвращает TRUE в случае успеха или FALSE в случае ошибки.

$stmt->bind_result($count);
$stmt->fetch();
$stmt->close();
return ($count > 0 ? true : false); // return $count > 0; would be ok.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...