Ver Mensaje Individual
  #15 (permalink)  
Antiguo 05/04/2010, 12:11
Avatar de neodani
neodani
 
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 2 meses
Puntos: 20
Respuesta: Duda con clase mysql, saber si se ejecuta 2 veces la consulta

Muchas gracias a ambos por las aclaraciones

Estoy intentando entender toda la clase de pies a cabeza, he añadido nuevos métodos y la estoy "documentando", pero hay algunas funciones que no acabo de entender por completo.

A continuación la clase al completo y un ejemplo de implementación.

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($servidor, $user, $password, $db){
  12.     // Implementación del patrón SINGLETON para no repetir instancias
  13.         if (is_null (self::$_singleton)) {
  14.             self::$_singleton = new DataBase($servidor, $user, $password, $db);
  15.         }
  16.         return self::$_singleton;
  17.     }
  18.  
  19.     private function __construct($servidor, $user, $password, $db){
  20.     // Conecta al servidor
  21.         $this->conexion = mysql_connect($servidor, $user, $password);
  22.         if (!is_resource($this->conexion)) {
  23.             die('No se pudo conectar a la base de datos: ' . mysql_error());
  24.         }
  25.      // Selecciona la base de datos
  26.         $db_selected = mysql_select_db($db, $this->conexion);
  27.         if (!$db_selected) {
  28.             die ('No se pudo seleccionar la base de datos: ' . mysql_error());
  29.         }
  30.         $this->queries = 0;
  31.         $this->resource = null;
  32.     }
  33.  
  34.     public function execute(){
  35.         if (!is_resource($this->resource)) {
  36.             if(!($this->resource = mysql_query($this->sql, $this->conexion))){
  37.                 return null;
  38.             }
  39.         }
  40.         $this->queries++;
  41.         return $this->resource;
  42.     }
  43.  
  44.     public function alter(){
  45.         if(!($this->resource = mysql_query($this->sql, $this->conexion))){
  46.             return false;
  47.         }
  48.         return true;
  49.     }
  50.  
  51.     public function getArrayResult(){
  52.     // Devuelve un array asociativo de la consulta (por nombres de campo en vez de por indice de campo)
  53.         if (!($cur = $this->execute())){
  54.             return null;
  55.         }
  56.         $array = array();
  57.         while ($row = @mysql_fetch_object($cur)){
  58.             $array[] = $row;
  59.         }
  60.         return $array;
  61.     }
  62.    
  63.     public function setQuery($sql){
  64.     // Carga la consulta SQL
  65.         if(empty($sql)){
  66.             return false;
  67.         }
  68.         $this->sql = $sql;
  69.         return true;
  70.     }
  71.  
  72.     public function freeResults(){
  73.         // Libera el resultado de la memoria y continua con el script
  74.         mysql_free_result($this->resource);
  75.         return true;
  76.     }
  77.  
  78.     public function loadObject(){
  79.         if ($cur = $this->execute()){
  80.             if ($object = mysql_fetch_object($cur)){
  81.                 mysql_free_result($cur);
  82.                 return $object;
  83.             }
  84.             else {
  85.                 return null;
  86.             }
  87.         }
  88.         else {
  89.             return false;
  90.         }
  91.     }
  92.    
  93.     public function getNumFilas(){
  94.         // Devuelve el numero total de filas (horizontal) de la consulta
  95.         return mysql_num_rows($this->resource);
  96.     }
  97.     function getNumColumnas(){
  98.         // Devuelve el numero total de columnas (vertical) de la consulta
  99.         return mysql_num_fields($this->resource);
  100.     }
  101.     public function getTotalConsultas(){
  102.         // Devuelve el numero total de consultas realizadas
  103.         return $this->queries;  
  104.     }
  105.    
  106.     public function depura($data){
  107.     // Funcion para evitar el SQL INJECTION
  108.         // Elimina los espacios en blanco
  109.         $data = trim($data);
  110.         // Aplicará stripslashes si está habilitado magic_quotes_gpc
  111.         if(get_magic_quotes_gpc())
  112.         {
  113.             $data = stripslashes($data);
  114.         }
  115.         // Hace falta una conexión a mySQL para usar esta funcion
  116.         $data = mysql_real_escape_string($data);
  117.         return $data;
  118.     }
  119.  
  120.  
  121.     public function getUltimoID(){
  122.         if(!($this->resource = mysql_query(mysql_insert_id(), $this->conexion))){
  123.             return false;
  124.         }
  125.         $this->queries++;
  126.         return $this->resource;
  127.     }
  128.    
  129.     public function fetch_array(){  
  130.         return mysql_fetch_array($this->resource);  
  131.     }
  132.    
  133.     function __destruct(){
  134.         // Libera el resultado de la memoria y cierra la conexión
  135.         mysql_free_result($this->resource);
  136.         mysql_close($this->conexion);
  137.     }
  138. }
  139. ?>

Implementación
Código PHP:
Ver original
  1. <?php
  2. include('class-mysql.php');
  3.  
  4. // Hacemos la conexión
  5. $db = DataBase::getInstance('localhost','root','password','hmgroupcat');
  6.  
  7. // Prueba de valores
  8. $valor1=1;
  9. $valor2='2009-10-06 19:03:49';
  10.  
  11. $valor1=$db->depura($valor1);
  12. $valor2=$db->depura($valor2);
  13.  
  14. // Hacemos la consulta segura:
  15. $query = sprintf("SELECT ID,post_date,post_content FROM wp_posts WHERE ID='%s' OR post_date='%s'",
  16.     $valor1, $valor2);
  17. $db->setQuery($query);
  18.  
  19. // La ejecutamos y al mismo tiempo obtenemos un arreglo de objetos
  20. // con los campos especificados en la consulta como propiedades.
  21. $datos = $db->getArrayResult();
  22.  
  23. //$datos = $db->fetch_array();
  24. //echo $db->getUltimoID();
  25.  
  26. // Otro ejemplo de depuración de datos de entrada
  27. $_POST['username']='n-1"\/%aDan';
  28. $_POST['password']='23/""\1235a*!';
  29. echo $username = $db->depura($_POST['username']);
  30. echo "<br/>";
  31. echo $password = $db->depura($_POST['password']);
  32.  
  33. echo $db->getNumFilas();
  34. echo "<br/>";
  35. echo $db->getNumColumnas();
  36. echo "<br/>";
  37. echo $db->getTotalConsultas();
  38.  
  39. echo "<pre>";
  40. print_r($datos);
  41. echo "</pre>";
  42.  
  43. // Los imprimimos directamente en pantalla...
  44. /*foreach($datos as $campo){
  45.     echo 'ID: '.$campo->ID;
  46.     echo 'Nombre: '.$campo->post_name;
  47.     echo 'Grupo: '.$campo->post_status;
  48.     echo '<br />';
  49. }
  50. */
  51. ?>

Y ahora las TRES funciones que me gustaría que me explicarais que es lo que hacen...

Código PHP:
Ver original
  1. public function execute(){
  2.         if (!is_resource($this->resource)) {
  3.             if(!($this->resource = mysql_query($this->sql, $this->conexion))){
  4.                 return null;
  5.             }
  6.         }
  7.         $this->queries++;
  8.         return $this->resource;
  9.     }
  10.  
  11.     public function alter(){
  12.         if(!($this->resource = mysql_query($this->sql, $this->conexion))){
  13.             return false;
  14.         }
  15.         return true;
  16.     }
  17. public function loadObject(){
  18.         if ($cur = $this->execute()){
  19.             if ($object = mysql_fetch_object($cur)){
  20.                 mysql_free_result($cur);
  21.                 return $object;
  22.             }
  23.             else {
  24.                 return null;
  25.             }
  26.         }
  27.         else {
  28.             return false;
  29.         }
  30.     }

Esta no he conseguido que funcione:

Código PHP:
Ver original
  1. public function getUltimoID(){
  2.         if(!($this->resource = mysql_query(mysql_insert_id(), $this->conexion))){
  3.             return false;
  4.         }
  5.         $this->queries++;
  6.         return $this->resource;
  7.     }

Y esta de aquí function getArrayResult() pensaba que se podría hacer de la siguiente manera pero no funciona, es muy diferente?

Código PHP:
Ver original
  1. public function fetch_array(){  
  2.         return mysql_fetch_array($this->resource);  
  3.     }

Muchas gracias de antemano!