Почему PDO возвращает Result, когда не должен?

У меня есть только одно текстовое поле, в котором пользователь может ввести имя пользователя или адрес электронной почты, чтобы сбросить пароль.

Во-первых, вот код: (я включил только тот код, который мне известен, где находится проблема).

try {

    // connect to database
    $dbh = sql_con();

    // prepare query
    $stmt = $dbh->prepare("
                     SELECT COUNT(*)
                     FROM
                         users
                     WHERE
                         user_login = :username
                     OR
                         user_email = :email
                     ");

    // execute query
    $stmt->execute(array(':username' => $username_email, ':email' => $username_email));

    if ($stmt->fetchAll() > 0) {

        // something was found
        // just echoing at the moment until i figure out what i am doing wrong
        echo 'i found something';
        exit;

    } else {
        // nothing found
        echo 'i found nothing';
        exit;
    }

}
catch (PDOException $e) {

    ExceptionErrorHandler($e);
    require_once($footer_inc);
    exit;
}

Не уверен, что я делаю неправильно, возможно, что-то очень глупое, но когда я ввожу имя пользователя или адрес электронной почты, которого, как я знаю, нет в базе данных, он все равно выдает echoes Я что-то нашел.

Что я делаю неправильно?

Я собирался использовать rowCount, но, как было предложено в руководстве по PHP, он гласит:

PDOStatement::rowCount() возвращает количество строк, затронутых последним оператором DELETE, INSERT или UPDATE, выполненным соответствующим объектом PDOStatement.
Если последним оператором SQL, выполненным соответствующим PDOStatement, был оператор SELECT.
, некоторые базы данных могут возвращать количество строк, возвращаемых этим оператором.
Однако такое поведение не гарантируется для всех баз данных, и на него не следует полагаться для переносимых приложений.

Таким образом, в руководстве по PHP говорится, что я должен сделать Count(*) перед выполнением моего реального запроса, а затем работать с результатом.


person PHPLOVER    schedule 17.04.2012    source источник


Ответы (3)


Возможно, вы имели в виду if (count($stmt->fetchAll()) > 0) {

person shanethehat    schedule 17.04.2012
comment
спасибо ... я изменил код на то, что вы показали выше, и изменил SQL-запрос, и теперь он работает. Спасибо, phplover - person PHPLOVER; 17.04.2012

Это потому, что fetchAll() возвращает массив. даже если в результате запроса нет строк, вы все равно получите как минимум пустой массив и...

php > var_dump(array() > 0);
bool(true)

Вам нужно сделать

if ($stmt->rowCount > 0) { ... }

вместо. И, кроме того, вы выполняете COUNT(*), так что независимо от того, что совпало, вы получите результат в виде одной строки, содержащий количество совпадений. Вам нужно будет получить эту одну строку и проверить значение этого подсчитанного поля.

person Marc B    schedule 17.04.2012
comment
Это упоминается в вопросе, почему он не использует это. Вот почему я голосую против. - person Simon Forsberg; 17.04.2012

$statement -> fetchAll() вернет массив. Сравнивать с 0 смысла нет. Вероятно, вы имели в виду count() количество элементов в результирующем наборе, возвращаемом из $statement -> fetchAll().

person GordonM    schedule 17.04.2012