Punta de Choros

27 декември 2009

На 2009г й оставаха 120ч съществуване. От календара падна поредния лист с дата 27 декември и към 10.30ч сутринта ме събуди звън от телефона.

Инсталация на Microsoft шрифтове в Ubuntu 16.04

14 януари 2017

нсталация на Microsoft шрифтове в Ubuntu се поражда от идеята браузърите в различните системи, да показват еднакво текстовото съдържанието на интернет страниците.

Ubuntu 16.04 инсталация на USB disk on Key

19 ноември 2016

Арсеналът ми от мобилни компютри съдържа Fujitsu Lifebook AH530. Това е бюджетна машина от 2011г на Intel Core i5-480M процесор и 4GB DDR3 RAM памет.

gparted

Paragon ExtFS for Windows

30 юли 2016

ExtFS for Windows е утилита на Paragon Software разработена през 2013г. Тя представлява решение, предоставящо пълен достъп на четене и на запис до раздели ...

msvcr100.dll is missing Windows 10

04 октомври 2016

Майк Патерсън от Plixer, компания по компютърната сигурност, публикува доклад , че Windows 10 изпраща данни в криптиран вид от вашата машина на всеки пет минути. Той е направил максимума, за да спре изтичането, но системата продължавала да изпраща информация.

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"

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

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

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