Foros del Web » Programando para Internet » PHP »

Simplificar consulta a MySQL

Estas en el tema de Simplificar consulta a MySQL en el foro de PHP en Foros del Web. Buenos días a todos, Hace un tiempo empecé de 0 con esto del PHP y MySQL, y ahora que ya tengo mi aplicación en funcionamiento ...
  #1 (permalink)  
Antiguo 09/10/2009, 03:25
 
Fecha de Ingreso: julio-2003
Mensajes: 65
Antigüedad: 20 años, 9 meses
Puntos: 0
Simplificar consulta a MySQL

Buenos días a todos,

Hace un tiempo empecé de 0 con esto del PHP y MySQL, y ahora que ya tengo mi aplicación en funcionamiento y con bastantes buenos resultados, me gustaría pegarle un repaso y mejorar cosas, entre ellas simplificar ciertas partes del código porque al principio hice cosas muy a lo bestia, que son dificiles de entender o mantener.

Ahora me asalta la duda de si hay algún modo de simplificar las consultas a base de datos. Utilizo la forma en que Dreamweaver las crea:

Código PHP:
mysql_select_db($database_MySQL$MySQL);
$query_Recordset1 "SELECT * FROM compras WHERE fecha_estimada<='$fecha' AND alerta='0' AND estado='1'";
$Recordset1 mysql_query($query_Recordset1$MySQL) or die(mysql_error());
$row_Recordset1 mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 mysql_num_rows($Recordset1); 
Claro hay páginas en las que tengo un montón de consultas y ya suma bastante líneas de código. Se me ocurre que quizás con una función o una clase pueda dejarlo en algo como:

Código PHP:
$row_Recordset1 consulta ("SELECT * FROM compras WHERE fecha_estimada<='$fecha' AND alerta='0' AND estado='1'"); 
Que opinais? me podéis aconsejar en este sentido?

GRACIAS
  #2 (permalink)  
Antiguo 09/10/2009, 04:14
 
Fecha de Ingreso: junio-2007
Mensajes: 70
Antigüedad: 16 años, 10 meses
Puntos: 2
Respuesta: Simplificar consulta a MySQL

Puedes crear una clase con las consultas que necesites hacer en cada clase.

Te puedes crear un archivo de configuración, conf.inc.ini, en el que guardes los datos sobre la conexión, como host, user y pass, y en el constructor de la clase cargues estos datos.

Luego en cada método de la clases abres una conexión, realizas la consulta, cierras la conexión y devuelves los resultados, y tienes tu código más limpio!

Incluso puedes realizar varias clases, dependiendo del tipo de consultas. Por ejemplo en una puedes agrupar todas las consultas que se realicen sobre ususarios, en otras sobre una hipotética agenda, en otra sobre ficheros, etc etc!

=)
  #3 (permalink)  
Antiguo 09/10/2009, 04:15
 
Fecha de Ingreso: septiembre-2009
Ubicación: Neuquén
Mensajes: 142
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: Simplificar consulta a MySQL

Si, hay muchas forma de simplificar y mejorar los codigos...

Tambien no se si has necesitado extraer datos de 2 o varias tablas, pero en esos casos para no hacer tantas consultas necesitarias leer sobre INNER JOIN, LEFT JOIN y RIGHT JOIN

Y clases hay varias, yo me hice una mas o menos simple que utilizo para mis trabajos, y no tengo problemas en pasartela.
Saludos
  #4 (permalink)  
Antiguo 09/10/2009, 04:49
 
Fecha de Ingreso: julio-2003
Mensajes: 65
Antigüedad: 20 años, 9 meses
Puntos: 0
Respuesta: Simplificar consulta a MySQL

Gracias por vuestra rápida respuesta,

En cuanto al INNER JOIN, LEFT JOIN y RIGHT JOIN, los he utilizado alguna vez pero con tablas relacionadas, entiendo que no se pueden utilizar para unir varias consultas a tablas que no tienen ninguna relación, no?

Si me podriais facilitar algún ejemplo me sería muy util porque todavía ando perdido con esto de las clases, métodos, constructores...

Gracias
  #5 (permalink)  
Antiguo 09/10/2009, 05:28
 
Fecha de Ingreso: septiembre-2009
Ubicación: Neuquén
Mensajes: 142
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: Simplificar consulta a MySQL

Bueno, mira, te muestro como facilita mucho el uso de la clase que yo utilizo para apps. simples...

Esta es la clase:
Código php:
Ver original
  1. <?php
  2.  
  3. /**
  4.  * MySQL Management Class
  5.  *
  6.  * @author Diego P. M. Baltar <www.estilodg.com>
  7.  * @package SimpleMySQL
  8.  */
  9. class SimpleMySQL
  10. {
  11.     /**
  12.      * Link identifier
  13.      *
  14.      * @access public
  15.      * @var resource
  16.      */
  17.     public $link = null;
  18.    
  19.     /**
  20.      * Selected database
  21.      *
  22.      * @access public
  23.      * @var string
  24.      */
  25.     public $database = null;
  26.    
  27.     /**
  28.      * Query result resource
  29.      *
  30.      * @access public
  31.      * @var resource
  32.      */
  33.     public $result = null;
  34.    
  35.     /**
  36.      * Query result data
  37.      *
  38.      * @access public
  39.      * @var array
  40.      */
  41.     public $query_result = array();
  42.    
  43.     /**
  44.      * Query error
  45.      *
  46.      * @access public
  47.      * @var boolean
  48.      */
  49.     public $query_error = false;
  50.    
  51.     /**
  52.      * Selected rows
  53.      *
  54.      * @access public
  55.      * @var integer
  56.      */
  57.     public $rows = null;
  58.    
  59.     /**
  60.      * Number of affected rows
  61.      *
  62.      * @access public
  63.      * @var integer
  64.      */
  65.     public $affected_rows = null;
  66.    
  67.     /**
  68.      * Last inserted id
  69.      *
  70.      * @access public
  71.      * @var integer
  72.      */
  73.     public $last_id = null;
  74.    
  75.     /**
  76.      * MySQL connection state
  77.      *
  78.      * @access public
  79.      * @var boolean
  80.      */
  81.     public $ready = false;
  82.    
  83.     /**
  84.      * Database tables
  85.      */
  86.     private $tables = array();
  87.    
  88.     public function __construct($hostname = 'localhost', $username = 'root', $password = '')
  89.     {
  90.         return $this->connect($hostname, $username, $password);
  91.     }
  92.    
  93.     public function __destruct()
  94.     {
  95.         return true;
  96.     }
  97.    
  98.     /**
  99.      * MySQL connect
  100.      *
  101.      * @param string $hostname MySQL server address/ip(port)
  102.      * @param string $username MySQL username
  103.      * @param string $password MySQL password
  104.      * @return boolean
  105.      */
  106.     private function connect($hostname,$username,$password)
  107.     {
  108.         $this->link = @mysql_connect($hostname, $username, $password, true);
  109.         if (!$this->link) return exit(mysql_error($this->link));
  110.         else return $this->ready = true;
  111.     }
  112.    
  113.     /**
  114.      * MySQL select database
  115.      *
  116.      * @param string $database MySQL database name to use
  117.      * @return boolean
  118.      */
  119.     public function select_db($database = '')
  120.     {
  121.         if (!$this->link) return exit(mysql_error($this->link));
  122.         else if (!@mysql_select_db($database)) {
  123.             $this->ready = false;
  124.             return exit(mysql_error($this->link));
  125.         }
  126.         else $this->database = $database;
  127.         return true;
  128.     }
  129.    
  130.     /**
  131.      * MySQL query
  132.      *
  133.      * @param string $sentence MySQL query sentence
  134.      * @return integer Number of selected rows
  135.      */
  136.     public function query($sentence = '')
  137.     {
  138.         if (!$this->link) return exit(mysql_error($this->link));
  139.         $this->result = @mysql_query($sentence, $this->link);
  140.         if (!$this->result) {
  141.             $this->query_error = true;
  142.             return exit(mysql_error($this->link));
  143.         }
  144.        
  145.         $this->affected_rows = mysql_affected_rows($this->link);
  146.        
  147.         if (preg_match('/^\s*(insert|replace)(.+)/is',$sentence)) $this->last_id = mysql_insert_id($this->link);
  148.        
  149.         if (preg_match('/^\s*(select|replace)(.+)/is',$sentence))
  150.         {
  151.             $rows = 0;
  152.             while ($row = mysql_fetch_object($this->result)) {
  153.                 $this->query_result[$rows] = $row;
  154.                 ++$rows;
  155.             }
  156.         }
  157.        
  158.         @mysql_free_result($this->result);
  159.        
  160.         if ($this->query_error) $this->query_error = false;
  161.        
  162.         $this->rows = $rows;
  163.         return true;
  164.     }
  165.    
  166.     /**
  167.      * Clean cached query result
  168.      *
  169.      * @access public
  170.      * @return void
  171.      */
  172.     public function clean()
  173.     {
  174.         $this->query_error = false;
  175.         $this->query_result = array();
  176.         $this->affected_rows = null;
  177.     }
  178.    
  179.     /**
  180.      * Espaces a string
  181.      *
  182.      * @access public
  183.      * @param string $string
  184.      * @return string
  185.      */
  186.     public function escape($string)
  187.     {
  188.         if (!$this->link) return exit(mysql_error($this->link));
  189.         $string = stripslashes($string);
  190.         return @mysql_real_escape_string($string, $this->link) ;
  191.     }
  192. }
  193.  
  194. ?>

Ahora te voy a mostrar un ejemplo de como la utilizo, desde la conexion hasta obtener datos de alguna tabla, por ej. de una tipica tabla de noticias:

noticias [ id, titulo, fecha, contenido ]

Código php:
Ver original
  1. <?php
  2.  
  3. // Crear el objecto (conectandose a la base de datos)
  4. $SimpleMySQL = new SimpleMySQL('localhost', 'root', 'pasword');
  5.  
  6. // Seleccionar la base de datos
  7. $SimpleMySQL->select_db('base_de_datos');
  8.  
  9. // Ejecutar consulta MySQl
  10. $SimpleMySQL->query("SELECT * FROM noticias");
  11.  
  12. // Devolver mensaje de error si no hay resultados
  13. if ($SimpleMySQL->affected_rows < 1) return print 'No hay contenidos de noticias';
  14. else {
  15.         // $SimpleMySQL->query_result es un array con los resultados
  16.         // traidos con mysql_fetch_object()
  17.         foreach ($SimpleMySQL->query_result as $row) {
  18.                 print '<h1>' .$row->titulo. '. ' .$row->titulo. '</h1>';
  19.                 print '<h4>' .$row->fecha. '</h4>';
  20.                 print '<div>' .$row->contenido. '</div>';
  21.         }
  22. }
  23.  
  24. // Limpiar resultados para poder ejecutar nuevas consultas
  25. $SimpleMySQL->clean();
  26.  
  27. ?>

Espero que te sea util, saludos.
  #6 (permalink)  
Antiguo 09/10/2009, 05:40
 
Fecha de Ingreso: julio-2003
Mensajes: 65
Antigüedad: 20 años, 9 meses
Puntos: 0
Respuesta: Simplificar consulta a MySQL

Muchísimas gracias! me va a venir perfecto para hacerme una idea.

Una primera duda... en mi caso siempre me conecto a la misma BBDD, se podría dejar en la clase esta parte?:

Código PHP:
// Crear el objecto (conectandose a la base de datos)
$SimpleMySQL = new SimpleMySQL('localhost''root''pasword'); 
// Seleccionar la base de datos
$SimpleMySQL->select_db('base_de_datos'); 
Saludos
  #7 (permalink)  
Antiguo 11/10/2009, 16:40
 
Fecha de Ingreso: septiembre-2009
Ubicación: Neuquén
Mensajes: 142
Antigüedad: 14 años, 6 meses
Puntos: 12
Respuesta: Simplificar consulta a MySQL

Como dejar en la clase esa parte xD? jeje no entendi :p
  #8 (permalink)  
Antiguo 12/10/2009, 03:55
 
Fecha de Ingreso: julio-2003
Mensajes: 65
Antigüedad: 20 años, 9 meses
Puntos: 0
Respuesta: Simplificar consulta a MySQL

Hola,

Me refiero a no tener que meter los datos de conexion y la BBDD en cada consulta, si siempre son los mismos...

Saludos
  #9 (permalink)  
Antiguo 12/10/2009, 04:09
 
Fecha de Ingreso: abril-2008
Mensajes: 453
Antigüedad: 16 años
Puntos: 16
Respuesta: Simplificar consulta a MySQL

Cita:
Iniciado por BorjaSan Ver Mensaje
Hola,

Me refiero a no tener que meter los datos de conexion y la BBDD en cada consulta, si siempre son los mismos...

Saludos
hola como andas, podrias modificar los metodos __construct y connect; agregarle un parametro mas que sea la base de datos

ej:
Código php:
Ver original
  1. <?php
  2.  
  3. #
  4. public function __construct($hostname = 'localhost', $username = 'root', $password = '',$db="default-db")
  5.  
  6.     {
  7.        
  8.         return $this->connect($hostname, $username, $password,$db);
  9.  
  10.     }
  11.  
  12.  
  13. private function connect($hostname,$username,$password,$db)
  14.  
  15.     {
  16.  
  17.         $this->link = @mysql_connect($hostname, $username, $password, true);
  18.  
  19.         if (!$this->link) return exit(mysql_error($this->link));
  20.  
  21.         else $this->select_db($db);return $this->ready = true;
  22.  
  23.     }

o... podrias crea una global (mejor que modificar el funcionamiento de la clase)
config_db.php
Código php:
Ver original
  1. include 'class/SimpleMySQL.php';
  2. global $SimpleMySQL;
  3. $SimpleMySQL = new SimpleMySQL('localhost', 'root', 'pasword');
  4. $SimpleMySQL->select_db('base_de_datos');

index.php
Código php:
Ver original
  1. include 'config_db'.php:
  2. global $SimpleMySQL;
  3.  
  4. $SimpleMySQL->query("SELECT * FROM noticias");
  5. //etc
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:40.