MySQLi/MySQL és a PHP 5.5

img

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

Amik változtak:

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_stringné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!