lunedì 1 agosto 2011

Php: una comoda libreria per interagire con MySql

Pubblico una comoda libreria da utilizzarsi per interagire con un database MySql. Fa parte del codice di Opencart che, come al solito, si rivela per me fonte di ottimo codice Php. Nella realtà sarebbe un driver, ossia un codice specifico per DBMS; Opencart in realtà usa una classe wrapper (chiamata db.php) non interessandosi dell'implementazione. A seconda del DBMS utilizzato, viene incluso un driver oppure un altro (ad esempio, MySql.php oppure Mssql.php e così via).
Dopo questa precisazione, diamo una occhiata al codice:
<?php
final class MySQL {
 private $connection;

 public function __construct($hostname, $username, $password, $database) {
  if (!$this->connection = mysql_connect($hostname, $username, $password)) {
   exit('Error: Could not make a database connection using ' . $username . '@' . $hostname);
  }

  if (!mysql_select_db($database, $this->connection)) {
   exit('Error: Could not connect to database ' . $database);
  }

  mysql_query("SET NAMES 'utf8'", $this->connection);
  mysql_query("SET CHARACTER SET utf8", $this->connection);
  mysql_query("SET CHARACTER_SET_CONNECTION=utf8", $this->connection);
  mysql_query("SET SQL_MODE = ''", $this->connection);
 }

 public function query($sql) {
  $resource = mysql_query($sql, $this->connection);

  if ($resource) {
   if (is_resource($resource)) {
    $i = 0;
     
    $data = array();

    while ($result = mysql_fetch_assoc($resource)) {
     $data[$i] = $result;
      
     $i++;
    }

    mysql_free_result($resource);

    $query = new stdClass();
    $query->row = isset($data[0]) ? $data[0] : array();
    $query->rows = $data;
    $query->num_rows = $i;

    unset($data);

    return $query;
   } else {
    return TRUE;
   }
  } else {
   exit('Error: ' . mysql_error($this->connection) . '<br />Error No: ' . mysql_errno($this->connection) . '<br />' . $sql);
  }
 }

 public function escape($value) {
  return mysql_real_escape_string($value, $this->connection);
 }

 public function countAffected() {
  return mysql_affected_rows($this->connection);
 }

 public function getLastId() {
  return mysql_insert_id($this->connection);
 }

 public function __destruct() {
  mysql_close($this->connection);
 }
}
?>
Notate il costruttore (che si occupa di creare la connessione) ma soprattutto il distruttore (__destruct) che avrà il compito di chiudere la connessione (cosa che, diciamolo, viene spesso dimenticata).
L'utilizzo di questa classe è semplice e immediato:
//creo l'oggetto con i parametri desiderati 
$db = new MySql("localhost","user","password","test_db");
//ottengo il risultato della query
$result = $db->query("SELECT * FROM users");
//se il numero di righe è maggiore di zero
if($result->num_rows) { 
//Ciclo nelle righe del risultato stampando il campo "name"
   foreach ($result->rows as $user_row) {
      echo $user_row['name'];
   }
}

Nessun commento: