Метод fetch. Что конкретно возвращает?

Подробное описание метода fetch можно найти здесь.
PDOStatement::fetch — Извлечение следующей строки из результирующего набора.

Не очень понятно, почему в данном примере не выводится вторая строка массива. В зависимости от аргумента, указанного первым в ['...'] fetch возвращает либо user_id, либо name. Если указывать оба, то второй по счёту игнорируется, не выпадая в ошибку.

try {
            $query = "select*
                    from users
                    where name = :name";  
            $user = $pdo->prepare($query);  
            $user->execute(['name' => 'Кирилл']); 
            echo $user->fetch()['user_id'], " - ", $user->fetch()['name']; 
        } catch (Exception $ex) {
            echo "Ошибка-исключение: ", $ex->getMessage();
        }

Проблема решается, если обходить fetch циклом while:

while ($us = $user->fetch()) {
                echo $us['user_id'], " - ", $us['name'];
            }

или вообще, в случае, если требуется вернуть всю строку таблицы, использовать метод fetchALL:

print_r ($user->fetchALL());
vedro-compota's picture

В зависимости от аргумента, указанного первым в ['...']

-- а это какая именно строка кода подразумевается?

_____________
матфак вгу и остальная классика =)

melisa's picture

#7

 echo $user->fetch()['user_id'], " - ", $user->fetch()['name'];
vedro-compota's picture

$user->fetch()['user_id']

-- в данном случае это извлечение очередной строки ответа на SQL запрос (которую php представляет в виде массива) +
сразу же обращение к его ключу (а никак не аргумент функции fetch ).

По идее происходит следующее:

echo $user->fetch()['user_id'], /* получаем id первой строки, 
возвращаемой запросом */
 " - ", 
$user->fetch()['name']; /* получаем name второй строки,
 возвращаемой запросом */

_____________
матфак вгу и остальная классика =)