Ver Mensaje Individual
  #1 (permalink)  
Antiguo 10/02/2010, 16:00
Avatar de neodani
neodani
 
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 2 meses
Puntos: 20
Intentando entender la clase mysql

Buenas,

A raiz del post de nuestro compañero eulerss

http://www.forosdelweb.com/f68/clase...1/#post3275707

Me sale una duda, que para no ensuciar su hilo abro este nuevo hilo, con una nueva clase mysql que utiliza el patron singleton al cual quiero aplicar el último comentario de maturano

class-mysql.php
Código PHP:
Ver original
  1. <?php
  2.  
  3. class DataBase {
  4.  
  5.     private $conexion;
  6.     private $resource;
  7.     private $sql;
  8.     public static $queries;
  9.     private static $_singleton;
  10.  
  11.     public static function getInstance(){
  12.         if (is_null (self::$_singleton)) {
  13.             self::$_singleton = new DataBase();
  14.         }
  15.         return self::$_singleton;
  16.     }
  17.  
  18.     private function __construct($servidor, $user, $password, $db){
  19.         $this->conexion = @mysql_connect($servidor, $user, $password);
  20.         mysql_select_db($db, $this->conexion);
  21.         $this->queries = 0;
  22.         $this->resource = null;
  23.     }
  24.  
  25.     public function execute(){
  26.         if(!($this->resource = mysql_query($this->sql, $this->conexion))){
  27.             return null;
  28.         }
  29.         $this->queries++;
  30.         return $this->resource;
  31.     }
  32.  
  33.     public function alter(){
  34.         if(!($this->resource = mysql_query($this->sql, $this->conexion))){
  35.             return false;
  36.         }
  37.         return true;
  38.     }
  39.  
  40.     public function loadObjectList(){
  41.         if (!($cur = $this->execute())){
  42.             return null;
  43.         }
  44.         $array = array();
  45.         while ($row = @mysql_fetch_object($cur)){
  46.             $array[] = $row;
  47.         }
  48.         return $array;
  49.     }
  50.  
  51.     public function setQuery($sql){
  52.         if(empty($sql)){
  53.             return false;
  54.         }
  55.         $this->sql = $sql;
  56.         return true;
  57.     }
  58.  
  59.     public function freeResults(){
  60.         @mysql_free_result($this->resource);
  61.         return true;
  62.     }
  63.  
  64.     public function loadObject(){
  65.         if ($cur = $this->execute()){
  66.             if ($object = mysql_fetch_object($cur)){
  67.                 @mysql_free_result($cur);
  68.                 return $object;
  69.             }
  70.             else {
  71.                 return null;
  72.             }
  73.         }
  74.         else {
  75.             return false;
  76.         }
  77.     }
  78.  
  79.     function __destruct(){
  80.         @mysql_free_result($this->resource);
  81.         @mysql_close($this->conexion);
  82.     }
  83. }
  84. ?>

Ejemplo script llamando a la clase

Código PHP:
Ver original
  1. <?php
  2. include('class-mysql.php');
  3.  
  4. // Hacemos la conexión
  5. $db = new DataBase('localhost','root','pass12421','mibasededatos');
  6. $db = DataBase::getInstance();
  7.  
  8. // Supongamos que tenemos una tabla de usuarios
  9. // Hacemos la consulta:
  10. $db->setQuery("SELECT * FROM wp_posts");
  11.  
  12. // La ejecutamos y al mismo tiempo obtenemos un arreglo de objetos
  13. // con los campos especificados en la consulta como propiedades.
  14. $usuarios = $db->loadObjectList();
  15.  
  16. // Los imprimimos directamente en pantalla...
  17. foreach($usuarios as $usuario){
  18.     echo 'ID: '.$usuario->ID;
  19.     echo 'Nombre: '.$usuario->post_name;
  20.     echo 'Grupo: '.$usuario->post_status;
  21.     echo '<br />';
  22. }
  23.  
  24. ?>

Tengo que decir que las lineas 18,19 y 20 de la clase no estaban así sino que no se le pasaba ningun parametro... Los he puesto yo para que sea mas reusable. Entonces me preguntaba como llamar a la clase, estoy casi seguro que si no tuviese el patron singleton lo podría hacer así
$db = new DataBase('localhost','root','pass12421','mibaseded atos');

Pero lo tiene y no se como crear la clase y que se aplique el patron singleton... me pierdo un poco.

El error que me da al ejecutar el script, es que revise la linea 5 del script precisamente esta
$db = new DataBase('localhost','root','pass12421','mibaseded atos');

¿Qué me falta para acabar de encajar este rompezabezas?

Muchas gracias de antemano, estoy aprendiendo mucho con vuestros comentarios