Úprava PHP skriptů pro MySQL 4.1 (mysqli)

MyEgo.cz

home foto blogy mywindows.cz kontakt

Úprava PHP skriptů pro MySQL 4.1 (mysqli)

PHP 18.10.04

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 ;-)


Komentáře

  1. 1 Rozi 18.10.04, 10:10:08
    FB

    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 ;)

  2. 2 Radek Hulán 18.10.04, 01:10:09
    FB

    [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í....

  3. 3 llook 19.10.04, 02:10:10
    FB

    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.

  4. 4 mmilan 24.06.05, 01:06:33
    FB

    Ten objektový přístup vypadá perfektně, ale nějak jsem tam nezaznamenal výběr tabulky??? Můžeš to prosím doplnit?