Skok na hlavní obsah webu.

PHP: Třída MySQL

Již dlouho programuji v PHP a jako každého programátora i mě nebaví programovat tytéž věci stále dokola. A tak, když stále pracuji s MySQL tak si práci chci maximálně zjednodušit. Proto vznikla třída MySQL, která se stará o styk s databází.

Poslední verze třídy je 1.6. Dle mého názoru má dobré prostředky pro ladění. Vypisuje hlášky o tom, co se podařilo a co ne. Vypisuje i data vrácená z DB pomocí PHP funkce print_r(). Při vytváření třídy se nastaví výchozí hodnoty zda zobrazovat debug hlášky a zda zobrazovat errory DB. Pro jednoduchost lze debug při programování zapnout volitelnym parametrem u funkce Query() pro konkrétní SQL příkaz. V praxi jsem si tím zjednodužšil život. Je ohodně rychlejší za SQL příkaz do funkce připsat true než složitě vypisovat vrácená data. A asi poslední zvláštností je, že Query() vrací už asociované pole. Možná se vám zdá neefektivní ve třídě vytvořit pole se všemi daty a poté jej opět nějak zpracovávat, ale v praxi jsem se s problémy zatím nesetkal např že by nestačila paměť a to už pak zase je otázka optimálního SQL dotazu. A navíc, tímto způsobem je to univerzálnější. Například do budoucna lze napsat jinou třídu se stejnými funkcemi pro jinou DB nebo dokonce v ní ručně spravovat soubory.

Zde je jednoduchý příklad použití:

<?php
  
// vlozim tridu
  
include "myslq.clas.php";

  
// vytvorim instanci tridy s debug a errro hlaskami
  
$db = new CMySQL(1,1);

  
// pripojim se k MySQL
  
$db->Connect("server", "user", "pass", "db");

  
// vykonam dotaz se debug vypisem
  
$db->Query("SELECT * FROM tabulka", 1);

  
// odpojim se od MySQL
  
$db->Close();
?>


Třída má ještě pár šikovných funkcí. Více se dozvíte ze zdrojového kódu:

<?php

  
/*
   *  Autor: PHX
   *  Datum: 7.7.2005
   *  Popis: Trida pro komunikaci s MySQL
   *
   *  Version: 1.6
   *  -----------------------------
   *  Filename: mysql.class.php
   *  Copyright: (c) PHX 2005
   *  -----------------------------
   *
   *  Zakladni TRIDA pro praci s MySQL
   *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   *
   *  GLOBALNI PROMENNE:
   *    spojeni - id spojeni
   *         db - jmeno DB
   *     dotazu - pocet dotazu na DB
   *      debug - nastaveni DEBUGU
   *      error - nastaveni ERROR
   *   affected - pocet ovlivnenych radku
   *       rows - pocet zaznamu ve vysledku
   *
   *
   *  - CMySQL([debug], [error])
   *        -> debug zapina/vypina DEBUG (vychozi je OFF)
   *        -> error zapina/vypina vypis MySQL erroru (vychozi je OFF)
   *
   *  - Connect(server, user, pass, db)
   *        -> vraci 0 ci 1
   *
   *  - Query(query, [debug])
   *        -> vraci vysledek v poli ci 0
   *        -> debug docasne zapina vypis ladicich hlasek
   *
   *  - GetLastID()
   *        -> vraci ID zaznamu vlozeneho do DB pomoci INSERT ...
   *
   *  - DBList()
   *        -> vrati pole s nazvy Databasi
   *
   *  - TableList([databaze])
   *        -> vrati pole s nazvy tabulek v Databati
   *
   */

  
class CMySQL
  
{
    var
$version=1.6;

    var
$spojeni;
    var
$db;
    var
$dotazu=0;
    var
$debug;
    var
$error;
    var
$affected;
    var
$rows;

/******************************************************************************/

    
function CMySQL($debug=0, $error=0) {
      
$this->debug = $debug;
      
$this->error = $error;
      
$error = ($error)? "ON" : "OFF";
      if(
$this->debug) echo "<pre>CMySQL_Debug: Debuging ON, Error report {$error}, Version CMySQL is {$this->version}</pre>\n";
    }

/******************************************************************************/

    
function Connect($server, $user, $pass, $db) {
      
$this->db = $db;
      
$this->spojeni = @MySQL_Connect($server, $user, $pass);
      if(
$this->spojeni) {
        if(
$this->debug) echo "<pre>CMySQL_Debug: Connected to DB '{$server}' as '{$user}'</pre>\n";
        if(@
mysql_select_db($db)) {
          if(
$this->debug) echo "<pre>CMySQL_Debug: Selected TABLE {$db}</pre>\n";
          return
1;
        }
        else {
          echo
"<pre>CMySQL.Connect(): Nepodarilo se vybrat databazi</pre>\n";
          if(
$this->error) echo "<pre>MySQL error nb. " . mysql_errno($this->spojeni) . ": " . mysql_error($this->spojeni) . "</pre>\n";
          if(
$this->debug) echo "<pre>SERVER: {$server}<br>USER: {$user}</pre>\n";
          return
0;
        }
      }
      else {
        echo
"<pre>CMySQL.Connect(): Nepodailo se pipojit k DB</pre>\n";
        if(
$this->error) echo "<pre>MySQL error nb. " . mysql_errno($this->spojeni) . ": " . mysql_error($this->spojeni) . "</pre>\n";
        if(
$this->debug) echo "<pre>CMySQL_Debug: DB: '{$server}' as '{$user}'</pre>\n";
        return
0;
      }
    }

/******************************************************************************/

    
function Query($query, $debug=-1) {
      if(
$debug==-1) $debug = $this->debug;
      
$debug_old = $this->debug;
      
$this->debug = $debug;
      if(
$this->debug) echo "<pre>CMySQL_Debug: Query nb.{$this->dotazu}: {$query}</pre>\n";
      if(!
$this->spojeni) {
        echo
"<pre>CMySQL.Query(): DB neni pripojena</pre>\n";
        if(
$this->error) echo "<pre>MySQL error nb. " . mysql_errno($this->spojeni) . ": " . mysql_error($this->spojeni) . "</pre>\n";
        
$this->debug = $debug_old;
        return
0;
      }
      
$this->dotazu++;
      
$vysledek = MySQL_Query($query, $this->spojeni);
      if(
$vysledek) {
        
$this->affected = @MySQL_Affected_Rows($this->spojeni);
        
$this->rows     = @MySQL_Num_Rows($vysledek);
        if(
$this->debug) echo "<pre>Affected: {$this->affected}\nRows: {$this->rows}</pre>\n";

        if(
strtoupper(substr($query,0,strlen('SELECT')))=='SELECT') {
          
$data=array();
          while(
$row=MySQL_Fetch_Assoc($vysledek)) $data[]=$row;

          if(
$this->debug) {
            echo
"<pre>";
            
print_r($data);
            echo
"</pre>";
          }
          
mysql_free_result($vysledek);
          
$this->debug = $debug_old;
          return
$data;
        }
        else {
          
$this->debug = $debug_old;
          return
1;
        }
      }
      else {
        echo
"<pre>MySQL.Query(): Chybny dotaz na DB</pre>\n";
        if(
$this->error) echo "<pre>MySQL error nb. " . mysql_errno($this->spojeni) . ": " . mysql_error($this->spojeni) . "</pre>\n";
        
$this->rows=0;
        
$this->affected=0;
        
$this->debug = $debug_old;
        return
0;
      }
    }

/******************************************************************************/

    
function GetLastId() {
      return
MySQL_Insert_ID();
    }

/******************************************************************************/

    
function DBList() {
      
$db = MySQL_List_DBs($this->spojeni);
      for(
$a=0; $a<MySQL_Num_Rows($db); $a++) {
        
$data[$a] = MySQL_DB_Name($db,$a);
      }
      return
$data;
    }

/******************************************************************************/

    
function TableList($db=0) {
      if(!
$db) $db=$this->db;
      
$tables=MySQL_List_Tables($db, $this->spojeni);
      for(
$a=0; $a<MySQL_Num_Rows($tables); $a++) {
        
$data[$a]=MySQL_TableName($tables,$a);
      }
      return
$data;
    }

/******************************************************************************/

    
function Close() {
      if(
$this->debug) echo "<pre>CMySQL_Debug: Disconnected from DB with {$this->dotazu} request</pre>\n";
      return @
MySQL_Close($this->spojeni);
    }
  }
?>

Autor: PHX | Vyšel: 07.07.2005 20:19:04 | Zobrazení: 3228