(PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
PDOStatement::fetchAll — Возвращает массив, содержащий все строки результирующего набора
Описание
Список параметров
Смысл этого аргумента зависит от значения параметра fetch_style :
PDO::FETCH_COLUMN : Будет возвращен указанный столбец. Индексация столбцов начинается с 0.
PDO::FETCH_CLASS : Будет создан и возвращен новый объект указанного класса. Свойствам объекта будут присвоены значения столбцов, имена которых совпадут с именами свойств.
PDO::FETCH_FUNC : Будут возвращены результаты вызовов указанной функции. Данные каждой строки результирующего набора будут передаваться в эту функцию.
Возвращаемые значения
Использование этого метода для извлечения строк больших результирующих наборов может пагубно сказаться на производительности системы и сетевых ресурсов. Вместо извлечения всех данных и их обработки в PHP рекомендуется использовать встроенные средства СУБД. Например, использование выражений WHERE и ORDER BY языка SQL может уменьшить размеры результирующего набора.
Примеры
Пример #1 Извлечение всех оставшихся строк результирующего набора
Результатом выполнения данного примера будет что-то подобное:
Пример #2 Извлечение всех значений одного столбца результирующего набора
В следующем примере показано, как извлечь из результирующего набора значения только одного столбца, даже если строки содержат значения нескольких столбцов.
Результатом выполнения данного примера будет что-то подобное:
Пример #3 Группировка строк по значениям одного столбца
В следующем примере показано, как получить ассоциативный массив строк результирующего набора, сгруппированных по значениям указанного столбца. Массив содержит три ключа: значения apple и pear являются массивами, содержащими два разных цвета; в тоже время watermelon будет массивом, содержащим только один цвет.
Результатом выполнения данного примера будет что-то подобное:
Пример #4 Создание объекта для каждой строки
Результатом выполнения данного примера будет что-то подобное:
Пример #5 Вызов функции для каждой строки
Результатом выполнения данного примера будет что-то подобное:
Смотрите также
Как работать с PDO? Полное руководство.
По-хорошему, надо бы, конечно, завернуть все обращения к API в библиотеку, и пользоваться только ей. Но поскольку среднего РНР юзера очень сложно убедить отказаться от обращений к API напрямую, то лучше уж научить его, как это делать правильно.
У PDO свой собственный хитровыдуманный способ соединения, называемый DSN. Плюс во время коннекта можно задать хренову тучу опций, некоторые из которых чрезвычайно полезны. Полный список можно найти здесь, но важными из них являются только несколько.
Пример правильного соединения:
$host = ‘127.0.0.1’;
$db = ‘test’;
$user = ‘root’;
$pass = »;
$charset = ‘utf8’;
Что здесь происходит?
Плюс очень удобно задать FETCH_MODE по умолчанию, чтобы не писать его в КАЖДОМ запросе, как это очень любят делать прилежные хомячки.
Также здесь можно задавать режим pconnect-а, эмуляции подготовленных выражений и много других страшных слов.
Иногда, очень редко, может потребоваться второй способ, когда переменные сначала привязывают к запросу по одной, с помощью bindValue() / bindParam(), а потом только исполняют. В этом случае в execute() ничего не передается. Пример можно посмотреть в мануале
Используя этот метод, всегда следует предпочесть bindValue()? поскольку поведение bindParam() не очевидно для новичков и будет приводить к проблемам.
Также prepare() / execute() могут использоваться для многократного выполнения единожды подготовленного запроса с разными наборами данных. На практике это бывает нужно чрезвычайно редко, и особого прироста в скорости не приносит. Но на случай, если понадобится делать много однотипных запросов, то можно писать так:
$data = array(
1 => 1000,
5 => 300,
9 => 200,
);
Здесь мы один раз подготавливаем запрос, а затем много раз выполняем.
Но самой интересной функцией, с самым большим функционалом, является fetchAll(). Именно она делает PDO высокоуровневой библиотекой для работы с БД, а не просто низкоуровневым драйвером.
fetchAll() возвращает массив, который состоит из всех строк, которые вернул запрос. Из чего можно сделать два вывода:
1. Эту функцию не стоит применять тогда, когда запрос возвращает много данных. В таком случае лучше использовать традиционный цикл с fetch()
2. Поскольку в современных РНР приложениях данные никогда не выводятся сразу по получении, а передаются для этого в шаблон, fetchAll() становится просто незаменимой, позволяя не писать циклы вручную, и тем самым сократить количество кода.
Получение простого массива.
Вызванная без параметров, эта функция возвращает обычный индексированный массив, в котором лежат строки из бд, в формате, который задан в FETCH_MODE по умолчанию. Константы PDO::FETCH_NUM, PDO::FETCH_ASSOC, PDO::FETCH_OBJ могут менять формат на лету.
Всего различных режимов получения данных в PDO больше полутора десятков. Плюс ещё их можно комбинировать! Но это уже тема для отдельной статьи.
Работая с подготовленными выражениями, следует понимать, что плейсхолдер может заменять только строку или число. Ни ключевое слово, ни идентификатор, ни часть строки или набор строк через плейсхолдер подставить нельзя. Поэтому для LIKE надо сначала подготовить строку поиска целиком, а потом ее подставлять в запрос:
Ну, вы поняли. Тут тоже всё плохо. PDO не предоставляет вообще никаких средств для работы с идентификаторами, и их надо форматировать по-старинке, вручную (или посмотреть, все-таки, в сторону SafeMysql, в которой этот, как и многие другие вопросы, решены просто и элегантно).
Следует помнить, что правила форматирования идентификаторов отличаются для разных БД.
В mysql для ручного форматирования идентификатора необходимо выполнить два действия:
— заключить его в обратные одинарные кавычки (backticks, «`»).
— проискейпить эти символы внутри идентификатора внутри путём удвоения.
Однако, здесь есть один нюанс. Одного форматирования может быть недостаточно. приведенный выше код гарантирует нас от классической инъекции, но в некоторых случаях враг все равно может записать что-то нежелательное, если мы бездумно подставляем имена полей и таблиц прямиком в запрос. К примеру, есть в таблице users поле admin. Если входящие имена полей не фильтровать, то в это поле, при автоматическом формировании запроса из POST-а, любой дурак запишет любую гадость.
Поэтому имена таблиц и полей, приходящие от юзера, желательно проверять на допустимость, как в приведённом ниже примере
Это можно сделать, если принять соглашение, по которому имена полей в форме будут соответствовать именам полей в таблице. Тогда эти имена можно будет перечислить только один раз (в целях защиты от подмены, о которой говорилось выше), и использовать небольшую функцию-хелпер для сборки запроса, которая, в силу особенностей mysql, годится как для INSERT, так и UPDATE запросов:
Соответственно, для вставки код будет
Не слишком эффектно, но зато очень эффективно. Напомню, кстати, что если использовать Класс для безопасной и удобной работы с MySQL, то это всё делается в две строчки.
PDO и ключевые слова
Здесь кроме фильтрации ничего придумать невозможно. поэтому тупо прогонять все не прописанные в запросе напрямую операторы через белый список:
PDOStatement::fetchAll
(PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
PDOStatement::fetchAll — Возвращает массив, содержащий все строки результирующего набора
Описание
Список параметров
Смысл этого аргумента зависит от значения параметра fetch_style :
PDO::FETCH_COLUMN : Будет возвращен указанный столбец. Индексация столбцов начинается с 0.
PDO::FETCH_CLASS : Будет создан и возвращен новый объект указанного класса. Свойствам объекта будут присвоены значения столбцов, имена которых совпадут с именами свойств.
PDO::FETCH_FUNC : Будут возвращены результаты вызовов указанной функции. Данные каждой строки результирующего набора будут передаваться в эту функцию.
Возвращаемые значения
PDOStatement::fetchAll() возвращает массив, содержащий все оставшиеся строки результирующего набора. Массив представляет каждую строку либо в виде массива значений одного столбца, либо в виде объекта, имена свойств которого совпадают с именами столбцов.
Использование этого метода для извлечения строк больших результирующих наборов может пагубно сказаться на производительности системы и сетевых ресурсов. Вместо извлечения всех данных и их обработки в PHP рекомендуется использовать встроенные средства СУБД. Например, использование выражений WHERE и ORDER BY языка SQL может уменьшить размеры результирующего набора.
Примеры
Пример #1 Извлечение всех оставшихся строк результирующего набора
Результатом выполнения данного примера будет что-то подобное:
Пример #2 Извлечение всех значений одного столбца результирующего набора
В следующем примере показано, как извлечь из результирующего набора значения только одного столбца, даже если строки содержат значения нескольких столбцов.
Результатом выполнения данного примера будет что-то подобное:
Пример #3 Группировка строк по значениям одного столбца
В следующем примере показано, как получить ассоциативный массив строк результирующего набора, сгруппированных по значениям указанного столбца. Массив содержит три ключа: значения apple и pear являются массивами, содержащими два разных цвета; в тоже время watermelon будет массивом, сожержащим только один цвет.
Результатом выполнения данного примера будет что-то подобное:
Пример #4 Создание объекта для каждой строки
Результатом выполнения данного примера будет что-то подобное:
Пример #5 Вызов функции для каждой строки
Результатом выполнения данного примера будет что-то подобное:
Смотрите также
PHP PDO: Режимы получения данных, константы PDO::FETCH_*
Содержание:
В прошлой заметке мы познакомились с основами PDO и простейшими запросами выборки данных из базы данных. В этой заметке мы научимся управлять режимами получения данных.
Все предопределенные константы здесь
PDO::FETCH_BOTH
PDO::FETCH_NUM
PDO::FETCH_ASSOC
Аналог mysql_fetch_assoc() Только текстовые индексы.
PDO::FETCH_OBJ
Аналог mysql_fetch_object() без указания имени класса, возвращает экземпляр stdClass
PDO::FETCH_LAZY
PDO::FETCH_COLUMN
PDO::FETCH_KEY_PAIR
PDO::FETCH_UNIQUE
PDO::FETCH_GROUP
Группирует значения по первой колонке. К примеру, нижеследующий код разобьёт пользователей на мальчиков и девочек, и положит их в разные массивы:
То есть, этот режим идеально подходит для классической задачи вывести события сгруппированные по дням (или вывести товары, сгруппированные по категориям). Также может комбинироваться с PDO::FETCH_COLUMN :
PDO::FETCH_CLASS
Создаёт объект указанного класса, заполняя его свойства данными из БД. Однако здесь, увы, начинаются неудобства и непоследовательность в работе вызывающих функций. Если для fetchAll() можно написать красиво и компактно
то для fetch() приходится писать такую колбасу:
в то время как у класса с пустым __set() будут заполнены только существующие свойства:
Можно, кстати, заметить, что PDO присваивает значения и приватным свойствам, что несколько неожиданно, но очень удобно.
PDO::FETCH_CLASSTYPE
Очень интересная константа. Представляет собой не самостоятельный режим получения данных, а флаг-модификатор, изменяющий поведение других режимов. При её использовании PDO будет брать имя класса из первой колонки полученных из БД данных. То есть, с её помощью код для fetch() можно сделать короче
PDO::FETCH_PROPS_LATE
PDO::FETCH_INTO
В отличие от PDO::FETCH_CLASS не создаёт новый объект, а обновляет существующий. Соответственно, в качестве параметра передается переменная с объектом. По очевидным причинам имеет смысл только с fetch()
PDO::FETCH_SERIALIZE
PDO::FETCH_FUNC
PDO::FETCH_NAMED
Если же указать это флаг, то все значения колонок с совпадающими именами будут собраны во вложенном массиве в порядке поступления:
PDO::FETCH_BOUND
PDO в PHP
PDO (PHP Data Objects) — расширение для PHP, предоставляющее простой интерфейс для доступа к различным базам данных. Если говорить очень просто и коротко, при помощи PDO в PHP подключаются к базам данных разных типов.
В этом уроке мы будем подключаться к базе данных MySQL, так как это самая распространённая база данных.
Подключение к базе данных
Вы должны знать, что у сервера баз данных есть имя, также к нему могут подключаться пользователи, то есть для подключения должен быть использован логин и пароль.
Пример того, как мы можем подключиться к базе данных:
Я думаю если вы интересуетесь PDO, то ваших знаний достаточно и этот синтаксис вам объяснять не нужно.
Итак, у нас есть объект подключения для доступа к базе данных.
Обработка исключений
Когда используется PDO, то ошибки подключений советуюю ловить при помощи конструкции try<. >catch <. >. Вот пример такого кода:
Есть разные мнения, по поводу обработки ошибок, например не все советуют всегда использовать конструкцию try<. >catch <. >. Дело в том, что PHP и так выведет сообщение об ошибке на экран, так что этот код избыточен. Хотя если вы хотите например откатить транзакцию, то эта конструкция вам пригодится, но об этом ниже.
Получение данных из базы используя PDO, метод query
Не забывайте, что для всех типов баз данных этот синтаксис сработает.
Обработка результата, методы FETCH и FETCHALL.
Очевидно, что константа FETCH_LAZY замедляет работу скрипта, поэтому её желательно не использовать.
Константа FETCH_CLASS
Давайте рассмотрим пример, с использованием константы FETCH_CLASS :
Не забывайте важное правило — названия свойств в созданном классе обязаны быть такими же, как и названия полей в базе данных.
Подготовленные выражения
Подготовленные выражения нужно обязательно использовать если ваш SQL запрос содержит переменные.
Подготовленные выражения PDO — основная причина использовать PHP Data Objects, поскольку это единственный безопасный способ выполнения SQL запросов, в которых есть переменные, созданные пользователем.
Именнованные плейсхолдеры
Давайте рассмотрим пример запроса INSERT с использованием плейсхолдеров.
Итак, ещё раз последовательность работы с подготовленными выражениями по шагам:
Этот синтаксис можно записать
Видно, что в метод execute() должен передаваться массив, в котором ключи должны совпадать с именами плейсхолдеров.
Неименованные плейсхолдеры
Теперь рассмотрим работу с неименованными плейсхолдерами.
Вот другой пример применения неименованных плейсхолдеров, с использованием метода bindParam() :




