Úprava PHP skriptů pro MySQL 4.1 (mysqli)
Včera jsem psal o tom, že skripty psané pro MySQL 4.0 (mysql
PHP
rozšíření) nejsou
kompatibilní s MySQL 4.1 a vyšší (mysqli
PHP rozšíření). Nicméně,
úprava aktuálních PHP skriptů tak, aby byly funkční s libovolnou verzí MySQL
a PHP, je vcelku triviální.
Upravil jsem pro použití MySQL 4.1.6-gamma i manuály pro kompilaci a instalaci Apache, MySQL a PHP:
- Instalace Apache 2.0.52, MySQL 4.6.1-gamma a PHP 5.0.2 na Windows,
- Kompilace Apache 2.0.52, MySQL 4.6.1-gamma a PHP 5.0.2 na Linuxu,
- Compile from source Apache 2.0.52, MySQL 4.6.1-gamma and PHP 5.0.2 on Linux.
Pro BLOG:CMS jsem použil tuto jednoduchou úpravu skriptů:
// pokud neni podpora pro mysqli, tak // ji nadefinujeme, dale pouzivejte ve // Vasich skriptech jen mysqli_funkce if (!function_exists("mysqli_connect")) { function mysqli_connect($host,$user,$password) { global $activedb; $activedb = mysql_connect($host,$user,$password); } function mysqli_select_db(&$activedb,$dbname) { mysql_select_db($dbname,$activedb) or die(mysql_error($activedb)); } function mysqli_query(&$activedb,$query) { return mysql_query($query,$activedb); } function mysqli_error(&$resource) { mysql_error($resource); } function mysqli_close(&$activedb) { mysql_close($activedb); } function mysqli_fetch_object(&$resource){ return mysql_fetch_object($resource); } function mysqli_fetch_assoc(&$resource){ return mysql_fetch_assoc($resource); } function mysqli_fetch_array(&$resource){ return mysql_fetch_array($resource); } function mysqli_fetch_row(&$resource){ return mysql_fetch_row($resource); } function mysqli_num_rows(&$resource){ return mysql_num_rows($resource); } function mysqli_free_result(&$resource){ mysql_free_result($resource); } function mysqli_insert_id(&$activedb){ return mysql_insert_id(); } function mysqli_num_fields(&$result){ return mysql_num_fields($result); } function mysqli_field_name(&$result, $j){ return mysql_field_name($result, $j); } function mysqli_affected_rows(&$resource){ return mysql_affected_rows($resource); } } // pripojeni k DB function sql_connect() { global $activedb; $activedb = @mysqli_connect($h,$u,$p); } // odpojeni od DB function sql_disconnect() { global $activedb; @mysqli_close($activedb); } // tuto funkci volejte misto mysqli_query function sql_query($query) { global $activedb; $result = @mysqli_query($activedb,$query); return $result; } // pokud query vraci jeden vysledek, // nazvany result, pouzijte tuto funkci function quickQuery($query) { $r = sql_query($query); if ($obj = mysqli_fetch_object($r)) return $obj->result; else return ''; }
Vlastní kód pro zjištění položek článku 1
potom může vypadat
takto (a bude funkční pro MySQL 4.0 i 4.1):
sql_connect('localhost','user','heslo'); $q=sql_query('select * from items where id=1'); if ($o=mysqli_fetch_object($q)) { // zpracovani ... } sql_disconnect();
Rovněž jedna důležitá věc - pokud máte dosud ve svých skriptech použito mysql_result
,
což je taková pomalá šílenost, tak ji nahraďte pomocí mysqli_fetch_object
,
protože v PHP 5 není mysql_result
podporováno, a označeno za zastaralé.
Mimochodem, mysqli
podporuje v PHP 5 i objektový přístup, vypadá
to potom mnohem elegantněji i bez jakýchkoliv Vašich doplňkových funkcí:
$db = new mysqli('localhost','user','heslo'); $q = $db->query('select * from items where id=1'); if ($o = $q->fetch_object()){ // zpracovani ... } $db->close();
Hezké, ne? Nicméně, toto bude fungovat jen s PHP 5.0.x a MySQL 4.1.x ;-)
slo by to udelat i jednoduse?
if (function_exists("mysqli_connect"))
{
function mysql_connect($host,$user,$password) {
global $activedb;
$activedb = mysqli_connect($host,$user,$password);
}
....
tzn obracene abych nemusel prepisovat vsude mysql_... na mysqli_...
jeste jedna poznamka //odpojeni od DB a //pripojeni k DB v clanku sou stejne...asi nejaky prehlidnuti ;)
[1] nešlo, protože pokud máš instalováno mysql i mysqli extension, což je/bude docela časté, mysql extension pro MySQL 4.1 stejně není kompatibilní....
Hm, mě se to moc nelíbí. Pokud vím, tak rozšíření mysql slouží k přístupu k MySQL databázím 4.0.x a starším, zatímco mysqli pouze 4.1 a novějším, protože komunikuje jiným protokolem.
Takže pokud modul PHP bude zkompilován s oběma, ale uživatel bude používat starší databázi, tak má problém.
Lepší by bylo použít mezivrstvu, které byste při připojování ještě navíc řekli, jestli chcete mysql nebo mysqli.
Ten objektový přístup vypadá perfektně, ale nějak jsem tam nezaznamenal výběr tabulky??? Můžeš to prosím doplnit?