Запрос выбора, возвращающий только 1 из 2 запрошенных столбцов

#php #sql

#php #sql

Вопрос:

Я на 90% уверен, что проблема в синтаксисе sql, но, похоже, не могу определить, где именно. Sql возвращает правильное электронное письмо, однако пароль возвращается пустым. Я пытался использовать другой столбец в базе данных, но у меня та же проблема.

Примечание: пароль хэшируется в БД.

Код:

 $sql = $link->prepare('SELECT email, password FROM users WHERE email=:email');
$sql->bindParam(':email', $email);
$sql->execute();
$resultemail = $sql->fetchColumn();
$resultpassword = $sql->fetchColumn(1);
if (!$resultemail){
    echo "empty";
} else {
    echo $resultemail;
}
if (!$resultpassword){
    echo "empty";
} else {
    echo "$resultpassword";
}
 

Ответ №1:

При каждом вызове fetchColumn он переходит к следующей строке результирующего набора и извлекает указанный столбец из этой строки (по умолчанию используется столбец 0). Итак, вы устанавливаете $resultemail значение в первый столбец первой строки результатов и $resultpassword в первый столбец второй строки результатов. Но поскольку запрос возвращает только одну строку, вы устанавливаете $resultpassword значение false .

Вы должны извлечь всю строку и установить переменные в соответствующие столбцы этой строки.

 $row = $sql->fetch(PDO::FETCH_ASSOC);
if ($row) {
    $resultemail = $row['email'];
    $resultpassword = $row['password'];
    if (!$resultemail){
        echo "empty";
    } else {
        echo $resultemail;
    }
    if (!$resultpassword){
        echo "empty";
    } else {
        echo "$resultpassword";
    }
} else {
    echo "empty";
}
 

Комментарии:

1. Сейчас я получаю это сообщение об ошибке. Вызов неопределенного метода PDOStatement::fetchAssoc().

2. Понял, просто заменил fetchAssoc() на fetch(PDO::FETCH_ASSOC). Итак .. вопрос новичка. Разница между двумя методами заключается в том, что fetchAssoc() является процедурным, а fetch() — ооп?

3. Да, извините. Сложно поддерживать все различные API-интерфейсы.

4. Ха-ха, вторая проблема, которую вы исправили для меня сегодня, я ценю вашу помощь