Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

clase conexión a MYSQL

Estas en el tema de clase conexión a MYSQL en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Les dejo esta clase por si les sirve, se aceptan comentarios Código PHP: <?php /*  * Created on 25/01/2010  * Euler Sánchez Gómez  *    */   class  ConexionMYSQL  {     private  $servidor ...
  #1 (permalink)  
Antiguo 26/01/2010, 10:48
 
Fecha de Ingreso: enero-2009
Mensajes: 455
Antigüedad: 15 años, 9 meses
Puntos: 11
clase conexión a MYSQL

Les dejo esta clase por si les sirve, se aceptan comentarios

Código PHP:
<?php
/*
 * Created on 25/01/2010
 * Euler Sánchez Gómez
 *  
 */
 
class ConexionMYSQL {

    private 
$servidor;
    private 
$user;
    private 
$password;
    private 
$db;
    
public function 
__construct ($servidor$user$password$db) {
    
    
$this->servidor=$servidor;
    
$this->user=$user;
    
$this->password=$password;
    
$this->db=$db;
}

public function 
conectarMYSQL(){
    
    if (
$this->enlace=mysql_connect($this->servidor,$this->user,$this->password)){
        
        if(
mysql_select_db($this->db,$this->enlace)) {
            echo 
"Conexión exitosa";
        }
        else{
            echo 
"Error";
            echo 
mysql_error();
        }
    }
    else{
        echo 
"Error";
        echo 
mysql_error();
    }
}    

public function 
sqlQuery($query){
    
$query addslashes($query);
    
$result mysql_query($query,$this->enlace);
        
        if(
$result)
        {
            return 
$result;
            
//$num = mysql_num_rows($result);
            //return $num;
        
}
        else 
        {
            echo 
"Error";
        } 
        
}

public function 
getData($linkQuery){
    
    
$n=mysql_num_fields($linkQuery);
    
//echo $n;
    
    
$arrayNames=array();
    for(
$i 0$i $n$i++)
    {
            
$arrayNames[] = mysql_fetch_field($linkQuery)->name;
            
//echo $arrayNames[$i];
    
}
    
    
$par=array();
    while (
$row mysql_fetch_array($linkQuery)){
        foreach(
$arrayNames as $nombre){
            
$par[$nombre] = $row[$nombre];
        }
        
$data[] = $par;
    }
    return 
$data;
    
    
}

public function 
CloseConexion() {
        
mysql_close($this->enlace);
}


}
 
?>
y el archivo de ejemplo es

Código PHP:
<?php
 
include ("./class_MYSQL_conexion.php");

$a = new ConexionMYSQL ("localhost","root","my_password","my_database");

$a->conectarMYSQL();

$query="SELECT * from users";

$r=$a->sqlQuery($query);

$p=$a->getData($r);

print_r ($p);


?>
De esta forma les imprimira el resultado del query en un arreglo.
  #2 (permalink)  
Antiguo 01/02/2010, 10:03
Avatar de xcoltx  
Fecha de Ingreso: diciembre-2008
Mensajes: 65
Antigüedad: 15 años, 11 meses
Puntos: 0
Respuesta: clase conexión a MYSQL

gracias.. la pude implementar sin problemas :D
  #3 (permalink)  
Antiguo 01/02/2010, 11:45
 
Fecha de Ingreso: octubre-2009
Mensajes: 240
Antigüedad: 15 años, 1 mes
Puntos: 6
Respuesta: clase conexión a MYSQL

Te falta declarar el atributo 'enlace'.

Código PHP:
    private $servidor
    private 
$user
    private 
$password
    private 
$db
    private 
$enlace
Además yo utilizaría mysql_real_escape_string.

Desde el punto de vista POO me parece que está muy bien.

Última edición por principianteZF; 01/02/2010 a las 12:01
  #4 (permalink)  
Antiguo 01/02/2010, 12:21
Avatar de jackson666  
Fecha de Ingreso: noviembre-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 1.971
Antigüedad: 15 años
Puntos: 65
Respuesta: clase conexión a MYSQL

Esta muy bien =)
Como consejo, convendria cambiar esta parte

Código PHP:
Ver original
  1. public function CloseConexion() {
  2.         mysql_close($this->enlace);
  3. }

Por esta otra:
Código PHP:
Ver original
  1. public function __destruct() {
  2.         @mysql_close($this->enlace);
  3. }

Y ademas, como te mencionaron antes olvidate de declarar el atributo enlace
__________________
HV Studio
Diseño y desarrollo web
  #5 (permalink)  
Antiguo 01/02/2010, 12:38
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: clase conexión a MYSQL

@jackson666: Es de mala practica suprimir mensajes, es mejor comprobar si el objeto es un recurso y cerrarlo:
Código PHP:
Ver original
  1. if (is_resource($this->enlace)) {
  2.        mysql_close($this->enlace);
  3. }

Saludos.
  #6 (permalink)  
Antiguo 02/02/2010, 16:00
 
Fecha de Ingreso: enero-2009
Mensajes: 455
Antigüedad: 15 años, 9 meses
Puntos: 11
Respuesta: clase conexión a MYSQL

Cita:
gracias.. la pude implementar sin problemas :D
bien

Cita:
Te falta declarar el atributo 'enlace'.
tienes razon, falto declararlo

Cita:
Es de mala practica suprimir mensajes, es mejor comprobar si el objeto es un recurso y cerrarlo:
eso no lo sabia, gracias!
  #7 (permalink)  
Antiguo 09/02/2010, 15:40
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: clase conexión a MYSQL

Buenas,

¿Es importante que la clase tenga el patrón singleton?

En un post anterior se hacía referencia...

http://www.forosdelweb.com/f68/clase...-mysql-575609/

pero no conseguí que me funcionase la clase. Me da el error "Driver not found"

Cómo incorporamos este patrón en la clase de eulerss

Salu2!
  #8 (permalink)  
Antiguo 09/02/2010, 15:47
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: clase conexión a MYSQL

No es importante ni necesario, puede funcionar perfectamente sin Singleton, la idea del Singleton es manejar solo una instancia de la clase de forma global.

Incorporarla es simple, solamente implementas el patrón por ejemplo:
Código PHP:
Ver original
  1. class Singleton {
  2.          private static $_instance = null;
  3.  
  4.          public static function getInstance($settings = array())
  5.          {
  6.                     if (!(self::$_instance instanceof Singleton)) {
  7.                             self::$_instance = new self($settings);
  8.                     }
  9.  
  10.                     return self::$_instance;
  11.          }
  12. }

Saludos.
  #9 (permalink)  
Antiguo 09/02/2010, 16:43
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: clase conexión a MYSQL

Cita:
Iniciado por GatorV Ver Mensaje
No es importante ni necesario, puede funcionar perfectamente sin Singleton, la idea del Singleton es manejar solo una instancia de la clase de forma global.

Incorporarla es simple, solamente implementas el patrón por ejemplo:
Código PHP:
Ver original
  1. class Singleton {
  2.          private static $_instance = null;
  3.  
  4.          public static function getInstance($settings = array())
  5.          {
  6.                     if (!(self::$_instance instanceof Singleton)) {
  7.                             self::$_instance = new self($settings);
  8.                     }
  9.  
  10.                     return self::$_instance;
  11.          }
  12. }

Saludos.
Es decir que no se puede usar la clase dos veces en el mismo script, porque serían 2 instancias?

O que no se puede usar esta linea dos veces sin cerrar la instancia actual?

$db = DataBase::getInstance();

Cuando aparece esto dentro de la clase...

function __destruct(){
@mysql_free_result($this->resource);
@mysql_close($this->conexion);
}

¿Es que automáticamente sin ejecutar nada mas, se autodestruye o hay que llamar a esos constructores y destructures en el script que utilice la clase?
Me refiero como cierras la conexión, lo hace implicitamente con ese trozo de código dentro de la clase?

Muchas gracias
  #10 (permalink)  
Antiguo 09/02/2010, 19:12
Avatar de maturano  
Fecha de Ingreso: enero-2010
Ubicación: /home/
Mensajes: 537
Antigüedad: 14 años, 10 meses
Puntos: 36
Respuesta: clase conexión a MYSQL

Cita:
Iniciado por neodani Ver Mensaje
Es decir que no se puede usar la clase dos veces en el mismo script, porque serían 2 instancias?

O que no se puede usar esta linea dos veces sin cerrar la instancia actual?

$db = DataBase::getInstance();
La idea del patrón singleton es utilizar una sola instancia de la misma clase. En este caso se está manejando una conexión a la BD, es útil aquí para mantener una sola conexión.

Sin el patrón singleton, pudieras tener un código como este en diferentes partes de tu aplicación:
Código PHP:
Ver original
  1. <?php
  2.  
  3. $db = new Clase_BaseDeDatos();
  4. $db->conectar('...');
  5. $db->ejecutar('...');

Cada que harías eso estarías creando una nueva conexión, algo sin mucho sentido cuando, la mayoría de veces, siempre trabajas sobre la misma Base de Datos. Con sigleton, sino existiera conexión la crearías, de existir recuperas ese mismo recurso; de eso se trata.

www.php.net/singleton

Cita:
Iniciado por neodani Ver Mensaje
Cuando aparece esto dentro de la clase...

function __destruct(){
@mysql_free_result($this->resource);
@mysql_close($this->conexion);
}

¿Es que automáticamente sin ejecutar nada mas, se autodestruye o hay que llamar a esos constructores y destructures en el script que utilice la clase?
Me refiero como cierras la conexión, lo hace implicitamente con ese trozo de código dentro de la clase?
Los constructures y destructores son métodos especiales que se ejecutan automáticamente cuando creas y destruyes un objeto respectivamente.

Esa porción de código se ejecutaría al finalizar el script, porque así es el comportamiento de PHP, libera de memoria las variables utilizadas. También podrías borrar la variable manualmente si ya no la necesitarías.

Código PHP:
Ver original
  1. <?php
  2.  
  3. // En tú código necesitas trabajar con alguna BD, entonces ...
  4.  
  5. $db = new Clase_BaseDeDatos();
  6. $db->ejecutar('...');
  7.  
  8. // Ya no trabajarás más con la BD
  9. unset($db);
  10. // Al destruir el objeto, se cerró automáticamente la conexión.

www.php.net/destruct
__________________
I ♥ The Music!
  #11 (permalink)  
Antiguo 10/02/2010, 00:45
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 8 meses
Puntos: 20
Respuesta: clase conexión a MYSQL

Excelente explicación, gracias por la aclaración maturano

Entonces para introducir los datos de conexión a la base de datos no se puede pasar fuera del script que llama a la clase no?

Como se trata de un constructor hay que poner los datos de conexión directamente en la definición de la clase?


Código PHP:
Ver original
  1. private function __construct(){
  2.         $this->conexion = @mysql_connect('localhost', 'root', 'pass23525');
  3.         mysql_select_db('mibasedatos', $this->conexion);
  4.         $this->queries = 0;
  5.         $this->resource = null;
  6.     }

Muchas gracias de antemano!
  #12 (permalink)  
Antiguo 10/02/2010, 01:59
Avatar de maturano  
Fecha de Ingreso: enero-2010
Ubicación: /home/
Mensajes: 537
Antigüedad: 14 años, 10 meses
Puntos: 36
Respuesta: clase conexión a MYSQL

Cita:
Iniciado por neodani Ver Mensaje
Como se trata de un constructor hay que poner los datos de conexión directamente en la definición de la clase?


Código PHP:
Ver original
  1. private function __construct(){
  2.         $this->conexion = @mysql_connect('localhost', 'root', 'pass23525');
  3.         mysql_select_db('mibasedatos', $this->conexion);
  4.         $this->queries = 0;
  5.         $this->resource = null;
  6.     }
Puede hacerse, más no es una obligación y tendría un gran defecto hacerlo de esa manera: tu código no es reusable.

Querrás ocupar tu clase en otro proyecto, en otra aplicación que trabaja con otra base de datos, tienes la opción de copiar el archivo y editarlo adaptando los datos para tu nueva conexión, pero ¿qué pasa cuando detectes que hay un problema en tu código?; tendrás que editar todos los archivos; DRY.


El constructor no deja de ser un método, e igual puede aceptar parámetros. Así está definida la clase que aquí se presentó (origen de este tema), detente un momento a ver su definición. Como el método se ejecuta automáticamente, los parámetros son pasados al momento de instanciar la clase, ese es el único detalle.


En términos generales, el constructor es un recurso para "cumplir los requisitos mínimos del objeto". En el caso de una clase que representa una Base de datos, lo mínimo que necesitas son los datos para realizar la conexión, esa información es entonces candidata a ser requerida por el constructor.

Código PHP:
Ver original
  1. <?php
  2. // Incluyes la clase de donde quiera que esté
  3. require 'Clase_BaseDeDatos.php';
  4.  
  5. // Instancias pasando la información que utilizará para conectarse
  6. $db = new Clase_BaseDeDatos('usuario', 'contraseña', 'baseDatos');
Ve que puedes hacer lo mismo en cualquier proyecto (claro, que se encuentre en la misma máquina) pasando diferentes parámetros para que cada uno trabaje con su propia conexión. Utilizas el mismo código, en caso de alguna modificación, todo quien usa esa clase se vería beneficiado (o afectado ).

Por favor, lee los enlaces que he estado dejando.
__________________
I ♥ The Music!

Última edición por maturano; 10/02/2010 a las 02:05
  #13 (permalink)  
Antiguo 10/02/2010, 18:50
Avatar de hschimpf  
Fecha de Ingreso: junio-2009
Ubicación: in the World Wide Web
Mensajes: 140
Antigüedad: 15 años, 5 meses
Puntos: 17
De acuerdo Respuesta: clase conexión a MYSQL

Comparto tambien una clase que desarrolle hace un tiempo con el fin de facilitar el acceso a datos de servidores MySQL.
Pueden consultar la documentacion online ya que se encuentra en los servidores de Google Code.
Cualquier aporte al desarrollo de las clases es bienvenido!
Aqui les dejo el enlace del proyecto:
http://code.google.com/p/phpclassesrepository/

Saludos!

Última edición por hschimpf; 10/02/2010 a las 20:05 Razón: el url quedo entre las eliquetas [noparse]
  #14 (permalink)  
Antiguo 15/02/2010, 13:53
 
Fecha de Ingreso: enero-2009
Mensajes: 455
Antigüedad: 15 años, 9 meses
Puntos: 11
Respuesta: clase conexión a MYSQL

Cita:
Comparto tambien una clase que desarrolle hace un tiempo con el fin de facilitar el acceso a datos de servidores MySQL.
Pueden consultar la documentacion online ya que se encuentra en los servidores de Google Code.
Cualquier aporte al desarrollo de las clases es bienvenido!
Aqui les dejo el enlace del proyecto:
http://code.google.com/p/phpclassesrepository/

Saludos!
perfecto, mcuhas gracias,

una duda con toda esta discusión del singleton, si hago esto
Código PHP:
$a = new ConexionMYSQL ("localhost","root","my_password","my_database");

$a->conectarMYSQL();

$query="SELECT * from users";

$r=$a->sqlQuery($query);

$p=$a->getData($r);

print_r ($p);

[
B]$a->CloseConexion();[/B
es necesario incluir el singleton? es decir, incluyo cada vez que uso la clase al final el cierre de la conexión

saludos!
  #15 (permalink)  
Antiguo 18/02/2010, 05:42
 
Fecha de Ingreso: enero-2010
Ubicación: Sevilla
Mensajes: 202
Antigüedad: 14 años, 10 meses
Puntos: 5
Respuesta: clase conexión a MYSQL

El singleton no es necesario, pero es recomendable si quieres asegurarte de que solo haya una instancia de esa clase.

Realmente lo que hace un singleton es que cuando solicitas una nueva clase de conexión comprueba si ya hay una creada.

Si no la hay la crea y la devuelve . Si ya existe la devuelve, sin crear otra.

Mi recomendación es que la cadena de conexión la leas de un fichero de configuración, así si cambias de servidor o el nombre de la base de datos solo tienes que modificar la cadena en un sitio (el fichero).

saludos
  #16 (permalink)  
Antiguo 18/02/2010, 07:38
Avatar de Smolky  
Fecha de Ingreso: mayo-2006
Ubicación: Cartagena
Mensajes: 177
Antigüedad: 18 años, 6 meses
Puntos: 14
Respuesta: clase conexión a MYSQL

Hola y gracias por el aporte. Está muy interesante

Quizás un consejo que puedo darte para hacer el código aún más universal es el uso de excepciones para comprobar las pre y post-condiciones del código y así, además, cada persona puede personalizar los mensajes de error sin tener que modificar el código que nos pasas.
__________________
No hay cuerda desafinada sino músico progresivo
  #17 (permalink)  
Antiguo 18/02/2010, 10:50
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 10 meses
Puntos: 9
Respuesta: clase conexión a MYSQL

se le puede agregar seguridad al método sqlQuery() algo como el sprintf() y el mysql_real_escape_string()? y sería necesario otro método para "sanar" las cadenas de los valores de un query???
__________________
Quitenme la vida pero no la bebida.
  #18 (permalink)  
Antiguo 18/02/2010, 12:13
Avatar de jackson666  
Fecha de Ingreso: noviembre-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 1.971
Antigüedad: 15 años
Puntos: 65
Respuesta: clase conexión a MYSQL

Cita:
Iniciado por cesarpunk Ver Mensaje
se le puede agregar seguridad al método sqlQuery() algo como el sprintf() y el mysql_real_escape_string()? y sería necesario otro método para "sanar" las cadenas de los valores de un query???
Código PHP:
class MySQL{

# Propiedades, bla bla bla

private $secure false;

public function 
__construct(){}

public function 
setSecure($string){
    if(
is_string($string)){
        
$this->secure true;
        return 
mysql_real_escape_string($string);
     }
}

public function 
query($query){
    if(
is_string($query)){
        if(
$this->secure){
            return 
mysql_query($query$this->link);
        }else{
            echo 
"Esta consulta no es segura!";
        }
    }

}


Algo asi? Si, se podria... Y se usaria de esta forma:

Código PHP:
$db = new MySQL(/* bla bla bla */);

$foo $_POST['bar'];

$db->setSecure($foo);

# bla bla bla 
__________________
HV Studio
Diseño y desarrollo web
  #19 (permalink)  
Antiguo 18/02/2010, 15:26
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 10 meses
Puntos: 9
Respuesta: clase conexión a MYSQL

gracias por responder, agregue estos métodos a la clase:

Código PHP:
     public function set_secure($string){
             if(
is_string($string)){
                
$this->secure true;
                return 
mysql_real_escape_string(stripslashes(trim($string)));
            }  
     } 

     public function 
ejecutar($sql){
            if(
is_string($sql)){
                if(
$this->secure){
                    
$this->stmt=mysql_query($sql,$this->link) or die(mysql_error());
                    return 
$this->stmt
                }else{    
                    exit(
'La consulta ejecutada está prohibida');
                }
            }  
     } 
Pero cuando hago un simple :

$sql='SELECT * FROM productos';
$stmt=$bd->ejecutar($sql);

siempre me devuelve que "la consulta es prohibida..."
__________________
Quitenme la vida pero no la bebida.
  #20 (permalink)  
Antiguo 18/02/2010, 15:55
 
Fecha de Ingreso: febrero-2009
Mensajes: 218
Antigüedad: 15 años, 8 meses
Puntos: 9
Respuesta: clase conexión a MYSQL

El atributo 'secure', el valor es false?
en el metodo set_secure lo haces 'true' pero en el metodo ejecutar no llamas a set_secure, entonces queda 'false', fijate si es eso.
  #21 (permalink)  
Antiguo 18/02/2010, 17:20
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 10 meses
Puntos: 9
Respuesta: clase conexión a MYSQL

por defecto está en "false" , y en ese query de ejemplo no invoco al metodo set_secure, por lo cual la variable secure sigue en false... para que esté en "true" tendría que haber cadenas (por ejemplo de un form) que vayan el query para usar el metodo set_secure().

Que debo hacer cuando no tenga cadenas para "sanar" y sólo sean querys simples.
__________________
Quitenme la vida pero no la bebida.
  #22 (permalink)  
Antiguo 18/02/2010, 17:46
 
Fecha de Ingreso: febrero-2009
Mensajes: 218
Antigüedad: 15 años, 8 meses
Puntos: 9
Respuesta: clase conexión a MYSQL

Por eso te decia, que no estaba incluido el set_secure dentro de ejecutar.
Lo que podrias hacer es algo como esto.
Código PHP:
public function ejecutar($sql){ 
            
$sql=$this->set_secure($sql);       //linea agregada
            
if(is_string($sql)){ 
                if(
$this->secure){ 
                    
$this->stmt=mysql_query($sql,$this->link) or die(mysql_error()); 
                    return 
$this->stmt;  
                }else{     
                    exit(
'La consulta ejecutada está prohibida'); 
                } 
            }   
     } 
asi siempre vas a "sanar" aunque sea un query simple (ademas te convierte en 'true' el atributo 'secure', y no tenes que llamar al metodo set_secure por separado.
  #23 (permalink)  
Antiguo 18/02/2010, 18:49
Avatar de jackson666  
Fecha de Ingreso: noviembre-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 1.971
Antigüedad: 15 años
Puntos: 65
Respuesta: clase conexión a MYSQL

Cita:
Iniciado por fernandozunni Ver Mensaje
Por eso te decia, que no estaba incluido el set_secure dentro de ejecutar.
Lo que podrias hacer es algo como esto.
Código PHP:
public function ejecutar($sql){ 
            
$sql=$this->set_secure($sql);       //linea agregada
            
if(is_string($sql)){ 
                if(
$this->secure){ 
                    
$this->stmt=mysql_query($sql,$this->link) or die(mysql_error()); 
                    return 
$this->stmt;  
                }else{     
                    exit(
'La consulta ejecutada está prohibida'); 
                } 
            }   
     } 
asi siempre vas a "sanar" aunque sea un query simple (ademas te convierte en 'true' el atributo 'secure', y no tenes que llamar al metodo set_secure por separado.
Pero esto no serviria! Porque estarias escapando la consulta entera, cosa que te generaria un error en la consulta!

La idea del metodo setSecure() es usar mysql_real_escape_string() para un dato en particular, un dato que el usuario va a ingresar y se supone puede contener codigo malintencionado.

Pero si las consultas las vas a ejecutar vos, para que queres agregar seguridad?
Lo que se puede hacer, es agregarle un parametro por defecto al metodo setSecure, asi

Código PHP:
public function setSecure($string="foo"){

    if(
is_string($string)){
       
$this->secure true;
       return 
mysql_real_escape_string($string);
    }


Que no se si serviria de mucho... ya que si te olvidas de usarlo la consulta se ejecutaria igual...
__________________
HV Studio
Diseño y desarrollo web
  #24 (permalink)  
Antiguo 19/02/2010, 09:21
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 10 meses
Puntos: 9
Respuesta: clase conexión a MYSQL

mi idea era hacer que esa funcion ejecutar() sirva tanto para cuando yo haga un query o tanto para cuando un usuario ingrese algún parametro de consulta o inserción , etc.
__________________
Quitenme la vida pero no la bebida.
  #25 (permalink)  
Antiguo 19/02/2010, 09:33
Avatar de jackson666  
Fecha de Ingreso: noviembre-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 1.971
Antigüedad: 15 años
Puntos: 65
Respuesta: clase conexión a MYSQL

Lo que mas te conviene es usar mysql_real_escape_string() cuando traes el dato... Asi

Código PHP:
# Previa instancia y conexion
$foo mysql_real_escape_string($_POST['dato']);
$db->ejecutar("SELECT * FROM tabla WHERE algo = '$foo';"); 
__________________
HV Studio
Diseño y desarrollo web
  #26 (permalink)  
Antiguo 19/02/2010, 10:26
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 10 meses
Puntos: 9
Respuesta: clase conexión a MYSQL

sip, eso mismo estaba pensando, parece un poco complicado generalizarlo en un método. Gracias
__________________
Quitenme la vida pero no la bebida.
  #27 (permalink)  
Antiguo 19/02/2010, 10:41
Avatar de jackson666  
Fecha de Ingreso: noviembre-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 1.971
Antigüedad: 15 años
Puntos: 65
Respuesta: clase conexión a MYSQL

En realidad no, solo que te tendrias que acostumbrar a usar el metodo setSecure(), podrias "mentirte" a vos mismo haciendo

Código PHP:
# Antes de hacer la consulta

$db->setSecure('un string cualquiera');

$db->query("SELECT ..."); // se ejecuta =) 
Lo cual no es muuuuy recomendable, no por problemas de seguridad, sino que te lo olvidaste de usar y fuiste =P
__________________
HV Studio
Diseño y desarrollo web
  #28 (permalink)  
Antiguo 19/02/2010, 11:23
Avatar de cesarpunk  
Fecha de Ingreso: enero-2008
Ubicación: Lima
Mensajes: 943
Antigüedad: 16 años, 10 meses
Puntos: 9
Respuesta: clase conexión a MYSQL

entonces bastaria con hacer un

$db->setSecure($_POST['nombre']);
$db->setSecure($_POST['mensaje']);

$db->query("SELECT ...");

y listo? .... gracias!
__________________
Quitenme la vida pero no la bebida.
  #29 (permalink)  
Antiguo 19/02/2010, 11:42
 
Fecha de Ingreso: enero-2009
Mensajes: 455
Antigüedad: 15 años, 9 meses
Puntos: 11
Respuesta: clase conexión a MYSQL

Cita:
El singleton no es necesario, pero es recomendable si quieres asegurarte de que solo haya una instancia de esa clase.

Realmente lo que hace un singleton es que cuando solicitas una nueva clase de conexión comprueba si ya hay una creada.

Si no la hay la crea y la devuelve . Si ya existe la devuelve, sin crear otra.

Mi recomendación es que la cadena de conexión la leas de un fichero de configuración, así si cambias de servidor o el nombre de la base de datos solo tienes que modificar la cadena en un sitio (el fichero).

saludos
gracias por la aclaración

Cita:
Hola y gracias por el aporte. Está muy interesante

Quizás un consejo que puedo darte para hacer el código aún más universal es el uso de excepciones para comprobar las pre y post-condiciones del código y así, además, cada persona puede personalizar los mensajes de error sin tener que modificar el código que nos pasas.
totalmente de acuerdo contigo, faltaría manejar las excepciones

Cita:
Pero esto no serviria! Porque estarias escapando la consulta entera, cosa que te generaria un error en la consulta!

La idea del metodo setSecure() es usar mysql_real_escape_string() para un dato en particular, un dato que el usuario va a ingresar y se supone puede contener codigo malintencionado.

Pero si las consultas las vas a ejecutar vos, para que queres agregar seguridad?

totalmente de acuerdo contigo, alas consultas propias no haría falta agregarles la seguridad

Cita:
entonces bastaria con hacer un

$db->setSecure($_POST['nombre']);
$db->setSecure($_POST['mensaje']);

$db->query("SELECT ...");

y listo? .... gracias!
exacto, bataria solamente con eso

saludos

Etiquetas: singleton
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 11:30.