Разбор результата

Итак, выполнять запрос мы научились, теперь займемся разбором результата.

Метод query() возвращает результат в формате, который задается его третьим параметром:


$all  = $db->query('SELECT * FROM `table`', null, 'assoc');                        // Вся таблица в ассоциативном массиве
$name = $db->query('SELECT `name` FROM `table` WHERE `id`=?i', array($id), 'el');  // Одно значение
$id   = $db->query('INSERT INTO `table` VALUES (?)', array('Новая строка'), 'id'); // Идентификатор только что вставленной строки			
			

Формат разбора результата задается в виде обычной строки. Если он не указан, то возвращается обычный mysqli_result.

Форматы разбора

Здесь приведены возможные форматы и описание, когда они могут быть удобны.

no

Без разбора. Возвращается mysqli_result с которым программист волен поступать по своему разумению.

Используется по умолчанию, когда аргумент $fetch не указан.

assoc

Выборка нескольких строк в виде массива записей. Все записи в виде ассоциативных массивов. Аналог перебора с mysql_fetch_assoc():


$pattern = 'SELECT `user_id`,`name`,`surname` FROM `users` ORDER BY `user_id`';						
$users   = $db->query($pattern, null, 'assoc');
echo 'У нас '.count($users).' пользователей!';
foreach ($users as $user) {
	$id   = $user['user_id'];
	$name = $user['name'].' '.$user['surname'];
	echo 'А под номером '.$id.' у нас живёт юзер '.$name."\n";
}
						
row

Аналогично, только каждой записи соответствует порядковый массив вместо ассоциативного (вроде перебора с mysql_fetch_row()).

object

Для особых гурманов аналог mysql_fetch_object().

col

Выборка одного столбца из нескольких строк. Например, список имён пользователей:


$pattern = 'SELECT `name` FROM `users` WHERE `status`=?';
$data    = array('looser');
$names   = $db->query($pattern, $data, 'col');
foreach ($names as $name) {
	echo $name."\n";
}
						
kassoc
kassoc:<key>

Аналогично assoc, но основной массив будет не порядковый, а ассоциативный, где ключ - первый столбец.


$db->query('SELECT `user_id`,`name`,`surname` FROM `users`', null, 'kassoc');
// Результат:
array(
	'5'  => array('id' => 5, 'name' => 'Пятый', 'surname' => 'Пользователь'),
	'7'  => array('id' => 7, 'name' => 'Седьмой', 'surname' => 'Пользователь'),
	'17' => array('id' => 17,'name' => 'Семнадцатый', 'surname' => 'Пользователь'),	
);
						

Либо столбец-ключ можно указать явно:


$db->query('SELECT `user_id`,`name`,`surname` FROM `users`', null, 'kassoc:name');
// Результат:
array(
	'Пятый'       => array('id' => 5, 'name' => 'Пятый', 'surname' => 'Пользователь'),
	'Седьмой'     => array('id' => 7, 'name' => 'Седьмой', 'surname' => 'Пользователь'),
	'Семнадцатый' => array('id' => 17,'name' => 'Семнадцатый', 'surname' => 'Пользователь'),	
);
						
iassoc
irow
icol
iobject

Аналоги assoc, row, col и object, однако возвращается не массив, а объект-итератор.

В случае, когда выбирается много данных, которые следует по очереди перебрать, это может быть эффективнее, чем перебирать их внутри goDB формируя массив, а потом перебирать уже его в прикладном коде. Но далеко не всегда.

Получаемых объект содрежит в себе ссылку на данные и реализует следующие интерфейсы:

  • Iterator: можно перебирать в цикле foreach.
  • Countable: можно узнать общее количество выбранных записей с помощью count($result).
  • ArrayAccess: можно получит доступ к определённой записи по индексу ($result[12]['field'].

Вобщем ведёт себя практически, как обычный массив.

vars

Выборка двух столбцов, из которых первый становится ключом, а второй элементом результирующего ассоциативного массива.

Например, таблица каких-то настроек для конкретных пользователей:

user | option_name | option_value
1    | "option1" | "value1"
2    | "option2" | "value2"
1    | "option3" | "value3"
1    | "option4" | "value4"
						

Запрашиваем все настройки для пользователя с id #1:


$userId  = 1;						
$pattern = 'SELECT `option_name`,`option_value` FROM `options` WHERE `user`=?i';
$data    = array($userId);
$options = $db->query($pattern, $data, 'vars');
						

В итоге получаем:


$options = array(
	'option1' => 'value1',
	'option3' => 'value3',
	'option4' => 'value4',
);
						

Можно делать выборку по одному столбцу, тогда он будет, как ключём, так и значением.


$pattern = 'SELECT `id` FROM `table` WHERE `name`=?';
$data    = array($name);
$rows    = $db->query($pattern, $data, 'vars');
if (isset($rows[5])) {
	echo 'Строка с #id=5 соответствует условию';
}
						
rowassoc

Выбирается одна строка и представляется в виде ассоциативного массива полей.


$userId  = 1;						
$pattern = 'SELECT * FROM `users` WHERE `user_id`=?i';
$data    = array($userId);
$user    = $db->query($pattern, $data, 'rowassoc');
if ($user) {
	echo 'Вот параметры нашего первого юзера:';
	var_dump($user);
} else {
	echo 'Мы не нашли указанного пользователя';
}
						

В случае, если такой строки нет (запрос вернул ноль записей), возвращается FALSE.

rowrow

Тоже самое, но строке соответствует порядковый массив.

rowobject
Ну, вы поняли...
el

Одно значение (выборка одного столбца из одной строки).


$name = $db->query('SELECT `name` FROM `users` WHERE `user_id`=?i', array(1), 'el');						
if ($name) {
	echo 'Его имя: '.$name;
} else {
	echo 'Нет такого';
}
						

Или так:


$count = $db->query('SELECT COUNT(*) FROM `users`', null, 'el');						
echo 'У нас уже '.$count.' пользователей';
						
bool

Аналогично el, только значение приводится к boolean:


$banned = $db->query('SELECT `banned` FROM `users` WHERE `user_id`=?i', array($userId), 'el');						
						

$exists = $db->query('SELECT `user_id` FROM `users` WHERE `user_id`=?i', array($userId), 'el');
						
id

Новое значение автоинкрементного поля:


$pattern = 'INSERT INTO `users` SET `name`=?, `surname`=?';
$data    = array('vasa', '_c');
$userId  = $db->query($pattern, $data, 'id');						
echo 'Мы создали пользователя, его ID='.$userId;
						
ar

Количество затронутых запросом полей (affected_rows):


$pattern = 'DELECT FROM `users` WHERE `iq`<?i';
$data    = array(140);
$count   = $db->query($pattern, $data, 'ar');
echo 'Мы удалили '.$count.' пользователей с IQ менее 140';
						
num

Количество строк в ответе. Если, конечно, пригодится без самого ответа.

Не считайте, пожалуйста, с его помощью количество строк в таблице :)

© Григорьев Олег aka vasa_c, 2006—2010