A legutolsó upgrade alkalmával frissült az Apache és a PHP is a gépemen. Kubuntut használok, így jelenleg a 13.10-es került a gépre. Épp egy régi project javításán dolgoztam, mikor megtörtént a frissítés, felkerült a PHP 5.5
Régebben olvastam, hogy ki fog kerülni a mysql a PHP-ból, de ezt az információt valahogy teljesen félretettem. Most mikor felfrissítettem a rendszert, visszaállítgattam a virtuális hostokat, és beállítottam az apache-ot, folytatni akartam a munkát. Egy baromi aranyos üzenet várt a hibakezelőmben:
Unknown error type: [8192] mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead
Error on line 14 in file /home/leoamros/public_html/xy_domain.hu/engine/core.php
"Hupsz. Ez meg mi?" Felkiáltás előtt még végig futott az agyamban, hogy minden jól lett-e beállítva. Persze, hisz ez már ilyenkor rutin feladat. Újra olvasva a hibaüzenetet, beugrott a régebbi cikk, hogy ki fog kerülni a mysql, helyette a mysqli vagy a PDO lesz.
Eddig nem is lenne gond, mivel (a motor, amit használok) már egy ideje PDO-val megy. Csak a régi projectekkel van gond, amik a motor előtt készültek, mint az a program is, amivel éppen dolgoztam.
Régebben a saját dolgom könnyítésére 3 function
volt, amit használtam: mq = mysql_query
, mf = mysql_fetch_array
és mr = mysql_real_escape_string
. Jah és az mqf = mf(mq());
ez csak arra volt, hogy egyetlen sort lekérdezzek :)
Így a megoldás sem volt nehéz, nem kellett 100 helyen átírni a queryket és a mysql-es dolgokat. Akkoriban még az objektumok nem nagyon voltak képben :) így csak simán át kellett írni a core.php-t
mysql_connect
helyett mysqli_connect
lett
Egyetlen sorban le lehet tudni a kapcsolódást, mivel itt 4. paraméterként megadhatjuk az adatbázis nevét is.
tehát:
$sql=mysql_connect('host','user','pass');
mysql_select_db('database');
helyett:
$sql=mysqli_connect('host','user','pass','database');
került a csatlakozáshoz.
Aztán változott a mysql_query is egy kicsit:
mysql_query($query);
helyett most már meg kell adni, ha nem objektumként használjuk a mysqli-t, azt hogy melyik kapcsolathoz futtatjuk a queryt:
mysqli_query($sql,$query);
Sokat nem változott a dolog :) csak egy változóval több lett.
Ugyanez van mysql_real_escape_string
nél
$var=mysql_real_escape_string($string);
helyett:
$var=mysqli_real_escape_string($sql,$string);
Én mysql_fetch_array
-t használtam, így nekem kissé ez is változott:
$arr=mysql_fetch_array($result);
helyett:
$arr=mysql_fetch_array($result, MYSQLI_ASSOC);
Itt már nem kell a kapcsolatot is átadni, csak a mysqli_query visszatérését. A második paraméter opcionális (nem kötelező), ezzel a kapott tömb felépítését tudjuk megváltoztatni. Alapértelmezetten MYSQLI_BOTH értékkel fut.
Átadható második paraméter:
MYSQLI_ASSOC: ebben az esetben a kapott tömb a lekérdezésben szereplő oszlopok neveit kapja meg indexként. Ha két oszlopnak (JOIN esetén) ugyanaz a neve, akkor automatikusan az utolsóban lévő értéket kapja meg a változó. Ilyenkor vagy aliast kell megadni, vagy számozott tömbként kell lekérdezni az adatokat.
MYSQLI_NUM: ez a fent említett számozott tömb. Ilyenkor a lekérdezés sorrendjében csak numerikus indexekkel ellátott tömböt kapunk vissza.
MYSQLI_BOTH: ez pedig a fenti 2 mód kombinálása. Tehát az adatokat numerikus és asszociatív index-szel is elérhetjük.
És még egy dolog van, ami fontos lehet az a mysql_set_charset
mysql_set_charset('UTF8');
helyett:
mysqli_set_charset($sql,'UTF8');
Tehát itt is át kell adnunk a kapcsolatot.
Persze, aki objektum orientáltan készített eddig is programokat, annak a dokumentációban van részletes leírás mind a MySQLi-hez és a PDO-hoz is!