Profruit banner

Умен звънец в openHAB

16 декември 2023

Телефонът е винаги с мен и сега, където и да се намирам получавам известие от openHAB, че някой е позвънил и чака пред вратата. А ако ме няма вкъщи става ясно часа и датата на последното позвъняване.

Tasmota Multipress

30 септември 2023

Идеята е Sonoff Touch T1 US 2 в салона, да управлява освен своето осветление и това в кухнята, а още вентилатора.

DIY 12V 1A WiFi Router UPS

22 април 2023

При поредно прекъсване на захранването вкъщи, батерията на нoтбука и двата UPS автоматично превключват на аварийно захранване и едновременно полита съобщение за конфуза

Zigbee2MQTT клониране

21 януари 2023

... как да клонираме съществуваща настройка на Zigbee2MQTT без да се налага последвало интервю на zigbee-устройствата.

LD2410 - бюджетен датчик присъствие в openHAB

11 февруари 2023

Цената на HLK-LD2410 зададе име на поредната тема в моя блог. С негова помощ се постига "народен" датчик присъствие в домашната автоматизация. . ...

choice mysql_fetch function
Снимката горе замисля начинаещия PHP програмист относно правилен избор на една от следните функции:
  1. mysql_fetch_array()
  2. mysql_fetch_assoc()
  3. mysql_fetch_row()
  4. 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, 'Твърди дискове');

Визуално получаваме следното:

table

Създаваме файл 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Процесори 






до нови срещи   ^.^
22.08.2012 profruit 

|

0 Response to "Различия на mysql_fetch_xxx() в PHP"

Публикуване на коментар

Този блог е реинкарнация на първите ми опити за споделяне в нета. На времето започнах с къси разкази на преживяното. После се обезсмисли и превърнах блога си в системно радио. Пиша единствено неща, които карат душата ми да живее: openHAB, Ubuntu, Споделено и т.н. Това е моето системно радио, разбирате ли? Моята вълна и вие сте на нея сега.

Архив на блога