Intereting Posts

Что содержит PDOStatement и каково использование fetch / fetchAll?

Я не понимаю 1), что находится внутри объекта PDOStatement, и 2) почему мне нужен метод fetch () или fetchAll ().

Моя база данных: одна простая таблица под названием «животные» с тремя столбцами (id, name, species).

Мой код:

try { $pdo = new PDO($dsn, $user, $pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { exit( $e->getMessage() ); } try { $sql = "SELECT * FROM animals"; $results = $pdo->query($sql); print_r($results); } catch (PDOException $e) { echo $e->getMessage(); } 

Во-первых, print_r (или var_dump) печатает это: PDOStatement Object ( [queryString] => SELECT * FROM animals )

Но если я напишу это:

 foreach($results as $row) { echo $row['id'] . ' ' . $row['name'] . ' ' . $row['species']; } 

печатается каждое содержимое моей таблицы.

Итак, 1) почему print_r не показывает ничего из этой информации, если она существует внутри моего объекта?

а также

2) зачем мне нужны $results->fetch() или $results->fetchAll() для получения информации, которую я уже выбрал из базы данных, и находятся в результатах результата $ results?

Потому что именно так разработан API, имея в виду гибкость.

Ваш объект не содержит всех наборов данных. Вместо этого PDOStatement реализует интерфейс Iterator / Traversable , неявно вызывающий ->fetch для каждой операции foreach .

Некоторые люди предпочитают использовать ->fetch вручную, или ->fetchAll для вытягивания всех строк сразу.