Работа с БД в Drupal 7 - урок 7 - Обработка результатов запроса (fetch)
Запрос выборки всегда будет возвращать результат обработки запроса как 0 или больше записей. Есть несколько путей обработать данные результата запроса, которые вы можете использовать по своему усмотрению.
Наиболее часто результаты используются в виде цикла foreach().
<?php $result = db_query("SELECT nid, title FROM {node}"); foreach ($result as $record) { // делаем что-нибудь с каждой $record $node = node_load($record->nid); } ?>
Основываясь на том что необходимо сделать с результатом, вы можете использовать и другие пути обработки записей. Для явной обработки следующих записей используйте:
<?php $record = $result->fetch(); // Используется обработка по умолчанию (объект). $record = $result->fetchObject(); // Обрабатывается как объект. $record = $result->fetchAssoc(); // Обрабатывается как ассоциативный массив. ?>
Если больше не останется записей, то будет возвращено FALSE. Вместо обычного fetch() следует использовать fetchObject() и fetchAssoc(), так как это более ясно объясняет как будут обрабатываться записи. И еще можно переключить каким образом будет обрабатывать fetch(), по умолчанию. Для обработки fetch() одной записи используйте:
<?php $record = $result->fetchField($column_index); ?>
Значение по умолчанию для $column_index равно 0. Для подсчет количества строк в результате используйте:
<?php $number_of_rows = $result->rowCount(); ?>
Для обработки всех записей в один массив используйте:
<?php //Отправляет результат в виде ассоциативного массива объектов. $result->fetchAll(); // Отправляет результат в виде ассоциативного массива с ключом названия поля и результатом в значение $result->fetchAllAssoc($field); // Отправляет результат второй колонки в ассоциативный массив Поля 1 => Поле 2 $result->fetchAllKeyed(); $result->fetchAllKeyed(0,2); // массив будет Поле 0 => Поле 2 $result->fetchAllKeyed(1,0); // массив будет Поле 1 => Поле 0 // Отправляет одну запись как одиночный массив. $result->fetchCol(); // Подсчитывает количество записей для столбца по умолчанию (по умолчанию это первый столбец) $result->fetchCol($column_index); ?>
Заметьте что fetchAll() и fetchAllAssoc() будут по умолчанию использоваться по умолчанию если fetch был настроен для этого. Это можно сделать через передачу новой fetch mode константы. Для fetchAll() это будет первый параметр. Для fetchAllAssoc() это будет второй параметр.
Так как PHP поддерживает методы класса сцепления для возвращаемых объектов, это позволяет пропускать переменную $result полностью:
<?php // Получить ассоциативный массив nid и title $nodes = db_query("SELECT nid, title FROM {node}")->fetchAllKeyed(); // Получить одиночную запись из БД $node = db_query("SELECT * FROM {node} WHERE nid = :nid", array(':nid' => $nid))->fetchObject(); // Получить одиночное значение из БД $title = db_query("SELECT title FROM {node} WHERE nid = :nid", array(':nid' => $nid))->fetchField(); ?>