Другой подход к обработке результатов запроса предлагает функция 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 мы будем сразу по всему "функциональному фронту", постепенно расширяя и наращивая наши возможности.