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