Я не понимаю 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
для вытягивания всех строк сразу.