Шаг 14 - Функции работы с MySQL, часть 3

Другой подход к обработке результатов запроса предлагает функция MYSQL_FETCH_ARRAY. Эта функция возвращает ассоциативный массив, сформированный из очередной обрабатываемой строки. Первый параметр, как обычно, указатель на ресурс результатов выборки, второй - флаг (константа), отвечающий за содержимое возвращаемого функцией ассоциативного массива. Рассмотрим пример. Надо вывести список книг из нашей таблицы books вместе с именами авторов.

//для формирования SELECT-а
$sel_fields=array('author' => 'Автор', 'namebook' => 'Название книги');
$link=mysql_connect($host,$user,$pass) or die(mysql_errno($link).mysql_error($link));
//выбрали БД
$db=mysql_select_db($db_name,$link) or die(mysql_errno($link).mysql_error($link));
//переменная $type принимает значение одной из следующих
//констант: MYSQL_ASSOC, MYSQL_NUM, and MYSQL_BOTH
$type=MYSQL_ASSOC;
reset($sel_fields);    //внутренний указатель массива на первый элемент
//работает в версиях PHP3 и PHP4
while(list($k,$v)=each($sel_fields)) {//сформируем строку для SELECT-а
	$sel_str[]=" $k as '$v'";
}
//закомментированная часть работает только в PHP4
//это альтернативное решение для цикла по массиву
//установка указателя на первый элемент для foreach-цикла не требуется
//foreach($sel_fields as $k=>$v) {
//	$sel_str[]=" $k as '$v'";
//}
$sel_str=implode(',',$sel_str);    //сделать строку из массива, используя разделитель
//на выходе имеем строку $sel_str = "author as 'Автор', namebook as 'Название книги'"
$result=mysql_query("SELECT ".$sel_str." FROM ".$table, $link) or 
	die(mysql_errno($link).mysql_error($link));
//пройдемся по результату выборки
while($data=mysql_fetch_array($result,$type)) {
	while(list($k,$v)=each($data)) {	//версия для PHP 3,4
		echo "$k => $v<br>";
	}
	//в комментариях альтернатива while-циклу (только для PHP4)
	//foreach($data as $k=>$v) {
	//echo "$k => $v<br>";
	//}
}

В зависимости от значения второго параметра функции MYSQL_FETCH_ARRAY мы получим (для нашего примера) либо ассоциативный массив со значениями вида ($type = MYSQL_ASSOC)

Автор => Р. Яргер и др.
Название книги => MySQL и mSQL. Базы данных для небольших предприятий и Интернета
Автор => Ларри УОЛЛ
Название книги => Программирование на Perl

либо ($type = MYSQL_NUM)

0 => Р. Яргер и др.
1 => MySQL и mSQL. Базы данных для небольших предприятий и Интернета
0 => Ларри УОЛЛ
1 => Программирование на Perl

(здесь имеем ассоциативный массив, в котором ключ - номер поля в затребованной последовательности полей таблицы в select-е, значение - выбранное значение для поля; нумерация полей начинается с нуля) либо для значения MYSQL_BOTH получаем "винегрет" из первых двух вариантов:

0 => Р. Яргер и др.
Автор => Р. Яргер и др.
1 => MySQL и mSQL. Базы данных для небольших предприятий и Интернета
Название книги => MySQL и mSQL. Базы данных для небольших предприятий и Интернета.
0 => Ларри УОЛЛ
Автор => Ларри УОЛЛ
1 => Программирование на Perl
Название книги => Программирование на Perl

(Еще раз хочу обратить внимание. Имена полей здесь получились по-русски потому, что в select-е использована стандартная для SQL декларация алиасов: select field as 'некий текст'.)

Еще один метод обработки выбранных данных - функция MYSQL_FETCH_OBJECT. Она по своей сути аналогична MYSQL_FETCH_ARRAY (как по параметрам, так и по значениям второго параметра - константам), с той лишь разницей, что возвращаемое значение - объект:

while($row=mysql_fetch_object($result,$type)) {
	$data=get_object_vars($row);
	//сформировали ассоциативный массив из переменных объекта
	while(list($k,$v)=each($data)) {
		echo "$k => $v<br>";
	}
}

Здесь любопытна вторая строка. Дело в том, что, если бы мы не использовали строки с пробелами в алиасах select-а, то синтаксически все бы выглядело так:

//где-то выше было сказано $result=MYSQL_QUERY("select author, namebook from books");
while($row=mysql_fetch_object($result,$type)){
	//остальные функции работы с классами в PHP 
	//мы рассмотрим в шаге, посвященном классам
	echo "$row->author => $row->namebook<br>";
}

Все. Но как обратиться к переменной объекта с именем 'Название книги', я так и не придумал.

Еще две fetch-функции (MYSQL_FETCH_FIELD() и MYSQL_FETCH_LENGTHS()) возвращают служебную информацию. Их мы рассмотрим в следующем шаге.

P.S. Остальные функции MySQL будут рассмотрены после того, как мы разберем минимальный набор строковых функций, функций работы с массивами и прочие полезности, т.к. без этого далее двигаться крайне затруднительно. Иными словами, двигаться в глубь PHP мы будем сразу по всему "функциональному фронту", постепенно расширяя и наращивая наши возможности.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Константин Платонов - 21.11.2000