Снимката горе замисля начинаещия PHP програмист относно правилен избор на една от следните функции:
- mysql_fetch_array()
- mysql_fetch_assoc()
- mysql_fetch_row()
- mysql_fetch_object()
Най-лесно нещата могат да се схванат с нагледни примери, което и ще направим. За целта ще ползвам локален сървър, терминал, програма mysql> и резултата върнат в браузъра.
Подготовка
Създаваме тестова таблица на име catalogs в учебна БД test.CREATE TABLE IF NOT EXISTS `catalogs` ( `id_catalog` int(11) NOT NULL AUTO_INCREMENT, `name` tinytext NOT NULL, PRIMARY KEY (`id_catalog`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
Запълваме таблицата с тази заявка:
INSERT INTO `catalogs` (`id_catalog`, `name`) VALUES (1, 'Процесори'), (2, 'Дънни платки'), (3, 'Видеокарти'), (4, 'Твърди дискове');
Визуално получаваме следното:
Създаваме файл connect.php
<?php defined('DB_HOST') ? null : define("DB_HOST", "127.0.0.1:3306"); defined('DB_USER') ? null : define("DB_USER", "name"); defined('DB_PASS') ? null : define("DB_PASS", "password"); defined('DB_NAME') ? null : define("DB_NAME", "test"); $id=@mysql_connect(DB_HOST, DB_USER, DB_PASS) or die('No server connection! Error '.mysql_errno()); mysql_select_db(DB_NAME, $id) or die('No DB selected'); mysql_query("SET CHARACTER SET 'utf8'", $id);
mysql_fetch_array()
Като първо предложение ще започнем с тази функция.
mysql_fetch_array() връща текущия запис в резултиращата таблица на заявката като масив. Този масив има два типа: числов (неасоциативен/списък) и асоциативен. Повторен повик на функцията превежда курсора в резултиращата таблица към следващия запис.
Нека първо изпълним тестова заявка в mysql> SELECT id_catalog, name FROM catalogs;
+------------+-----------------------------+ | id_catalog | name | +------------+-----------------------------+ | 1 | Процесори | | 2 | Дънни платки | | 3 | Видеокарти | | 4 | Твърди дискове | +------------+-----------------------------+
Отлично! А сега постигнем същото чрез PHP, с леко отстъпление. Резултатът на функцията ще прекараме през функция print_r().
<?php header('Content-Type:text/html; charset=UTF-8'); //съединение с БД require('connect.php'); //заявка $query = "SELECT id_catalog, name FROM catalogs"; $res = mysql_query($query, $id); $row = mysql_fetch_array($res); //резултат echo '<pre>' . print_r($row, true) . '</pre>';
резултат изобразен в браузъра
Array ( [0] => 1 [id_catalog] => 1 [1] => Процесори [name] => Процесори )Според описанието горе функцията извлече резултата от клетките на първия ред на таблицата под формата на масив, чийто ключове са 0 или id_catalog за поле id_catalog, съответно 1 или name за поле name.
Става ясно, че функцията предлага два начина за извличане съдържанието на клетката. Обръщение по числен индекс или обръщение по име на полето.
пример
<?php header('Content-Type:text/html; charset=UTF-8'); require('connect.php'); //заявка $query = "SELECT id_catalog, name FROM catalogs"; $res = mysql_query($query, $id); $row = mysql_fetch_array($res); //по име на полето echo $row['id_catalog']; echo $row['name']; echo '<hr>'; //по числов индекс echo $row[0]; echo $row[1];
резултат изобразен в браузъра
1Процесори
1Процесори
Отлично!
Функцията по този начин извлече първи ред. Как да извлечем трети ред, например:
3 | Видеокарти
Решение е като добавим ограничение в заявката с оператор LIMIT.
Отброяването стартира от О и съответно:
mysql> SELECT id_catalog, name FROM catalogs LIMIT 2, 1;
+------------+----------------------+ | id_catalog | name | +------------+----------------------+ | 3 | Видеокарти | +------------+----------------------+Остава да препишем заявката в PHP файла горе, за да получим същото в браузъра.
Отново 6!
Остана да се научим как да извлечем цялата таблица. Според описанието на функцията това става след повторен повик и курсора сам се премества към следващ ред. Постига се чрез цикъл FOR или WHILE.
пример
<?php header('Content-Type:text/html; charset=UTF-8'); require('connect.php'); $query = "SELECT id_catalog, name FROM catalogs"; $res = mysql_query($query, $id); $row = mysql_fetch_array($res); while(($row = mysql_fetch_array($res)) !== FALSE) { echo $row['id_catalog'].' '. $row['name'], "\r\n"; }
резултат изобразен в браузъра
1 Процесори 2 Дънни платки 3 Видеокарти 4 Твърди дискове
Нека погледнем синтаксиса на функция mysql_fetch_array() в учебник по PHP:
array mysql_fetch_array ( resource result [, int result_type] )
result е първи аргумент на функцията и той е дескриптор на резултиращата таблица, връщана от функция mysql_query(). Втори незадължителен аргумент може да приема едно от следните три значения (константи).
- MYSQL_ASSOC - възврат на резултата като асоциативен масив
- MYSQL_NUM - възврат на резултата като числов масив
- MYSQL_BOTH - смесен възврат на резултата: числов и асоциативен
По подразбиране вторият аргумент е MYSQL_BOTH.
Примерите горе ползват семпла заявка. Тя идва от една таблица. При по-сложна заявка, ако няколко полета имат сходни имена, в резултата ще попадне последната колонка. Тогава достъп към първите може да стане по числените стойности на индексите в масива (в случай че не ползвате псевдоними).
mysql_fetch_assoc()
Функция mysql_fetch_assoc() е производна на функция mysql_fetch_array (resource result , MYSQL_ASSOC) и връща само асоциативен масив. С тази си особеност тя повтаря всичко казано за mysql_fetch_array().
Описане:
array mysql_fetch_assoc ( resource result )
Счита се за универсална и се препоръчва навсякъде, където е възможно нейната употреба.
пример
<?php header('Content-Type:text/html; charset=UTF-8'); require('connect.php'); $query = "SELECT id_catalog, name FROM catalogs"; $res = mysql_query($query, $id); if(!$res) exit(mysql_error()); for($data=array(); $row = mysql_fetch_assoc($res); $data[]=$row); foreach($data as $val) { echo $val['id_catalog'].' '. $val['name'], "\r\n"; }
резултат изобразен в браузъра
1 Процесори 2 Дънни платки 3 Видеокарти 4 Твърди дискове
Идеята ми бе да покажа как може да се извлече таблицата с оператор FOR. Резултата връща двумерен масив и чрез FOREACH довеждаме нещата до ума. Същината на занятието държи ред 14. Вижда се, че за постигане на резултата ключовете носят имената на полетата на таблицата.
mysql_fetch_row()
Функция mysql_fetch_row() е прозводна на функция mysql_fetch_array (resource result , MYSQL_NUM) и връща само числов (неасоциативен) масив. Масива започва с индекс 0. С тази си особеност тя повтаря всичко казано за mysql_fetch_array().
Описане:
array mysql_fetch_row ( resource result )
пример
<?php header('Content-Type:text/html; charset=UTF-8'); require('connect.php'); $query = "SELECT id_catalog, name FROM catalogs"; $res = mysql_query($query, $id); if(!$res) exit(mysql_error()); while(list($id, $name) = mysql_fetch_row($res)) { echo $id.' '. $name, "\r\n"; }
резултат изобразен в браузъра
1 Процесори 2 Дънни платки 3 Видеокарти 4 Твърди дискове
Функцията връща масив, всеки елемент който съответства на едно поле в записа. Ако курсора достигне края на таблицата подобно на горните функции връща FALSE. Удобство при ползване на mysql_fetch_row е функция list(), преобразуваща елемента на масива в променлива.
Опростени нещата изглеждат така:
while($row = mysql_fetch_row($res)) { echo $row[0].' '. $row[1], "\r\n"; }
mysql_fetch_object()
Функция mysql_object() работи аналогично на mysql_fetch_array(), с единствено отличие - функцията връща обект, вместо масив. На практика вие работите с полетата само по името на колонката. Тези имена стават свойства на обекта.
Описане:
object mysql_fetch_object ( resource result )
пример
<?php header('Content-Type:text/html; charset=UTF-8'); require('connect.php'); $query = "SELECT id_catalog, name FROM catalogs LIMIT 1"; $res = mysql_query($query, $id); if(!$res) exit(mysql_error()); $row = mysql_fetch_object($res); echo $row -> id_catalog; echo $row -> name; //mysql_free_result($res)
резултат изобразен в браузъра
1Процесори
до нови срещи ^.^
0 Response to "Различия на mysql_fetch_xxx() в PHP"
Публикуване на коментар