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

Mi "Class" de Conexion a Bases de Datos.. Terminada

Estas en el tema de Mi "Class" de Conexion a Bases de Datos.. Terminada en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Bueno, resulta que yo hice una clase que se conecta a bases de datos... El problema lo tengo cuando quiero hacer que la clase pueda ...
  #1 (permalink)  
Antiguo 21/02/2005, 17:56
Avatar de nitrouz  
Fecha de Ingreso: agosto-2003
Ubicación: Buenos Aires, Argentina
Mensajes: 78
Antigüedad: 21 años, 4 meses
Puntos: 0
Sonrisa Mi "Class" de Conexion a Bases de Datos.. Terminada

Bueno, resulta que yo hice una clase que se conecta a bases de datos...
El problema lo tengo cuando quiero hacer que la clase pueda hacer varias consultas para esto quiero usar un vector del siguiente modo...

Código PHP:
function consulta($consulta
{
    if(empty(
$consulta)) { die("La consulta no puede estar vacía"); }
$this->queryID[$this->queryV] = mysql_query($consulta,$this->conID);
if(!
$this->queryID[$this->queryV]) 
{
die(
"<b>Error al ejecutar la consulta:</b> \"".$consulta."\"<br><b>MySQL dice:</b> ".mysql_error($this->conID));

else 

if(
$this->debug) echo "Se ejecuto la consulta <b>\"$consulta\"</b> con exito. Numero de Consulta: ".$this->queryV."<br>"
$this->$queryV++; 
}
return 
$this->queryID[$this->queryV];

La parte que quiero resaltar es esta...

Código PHP:
$this->queryID[$this->queryV] = mysql_query($consulta,$this->conID); 
Cannot use a scalar value as an array
Y cuando hago eso me sale... Cannot use a scalar value as an array

Porque es esto ?? Alguien sabe?
__________________
Cristian Conedera
Mi Web: BothMedia.com, Diseño y Desarrollo
Mi Blog: nitrousBLOG*

Última edición por nitrouz; 22/02/2005 a las 12:26
  #2 (permalink)  
Antiguo 21/02/2005, 20:59
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 21 años, 3 meses
Puntos: 41
¿Qué valor trae por defecto "queryID"?
Porque al parecer ya trae un valor (y no es una array).
De todos modos, te recomiendo inicializarlo como un array:
Puedes hacerlo en la declaración de atributos
var queryID = array();

O dentro del constructor/inicializador
$this->queryID = array();

Saludos

Última edición por jpinedo; 21/02/2005 a las 21:02
  #3 (permalink)  
Antiguo 22/02/2005, 09:42
Avatar de nitrouz  
Fecha de Ingreso: agosto-2003
Ubicación: Buenos Aires, Argentina
Mensajes: 78
Antigüedad: 21 años, 4 meses
Puntos: 0
Excelente, me sirvio!
Gracias!

Ahora tengo otra duda

Código PHP:
function consulta($consulta,$ident $this->queryV
Se puede hacer eso?... Porque me sale error

$ident = $this->queryV...

O si o si tiene que se un valor constante... o sea

$ident = 1;

Gracias denuevo!
__________________
Cristian Conedera
Mi Web: BothMedia.com, Diseño y Desarrollo
Mi Blog: nitrousBLOG*
  #4 (permalink)  
Antiguo 22/02/2005, 10:30
Avatar de nitrouz  
Fecha de Ingreso: agosto-2003
Ubicación: Buenos Aires, Argentina
Mensajes: 78
Antigüedad: 21 años, 4 meses
Puntos: 0
Ya lo solucione así... nose si es la mejor forma


Código PHP:
  function consulta($consulta,$ident=NULL
  {
    if(empty(
$ident)) $ident $this->queryV
Saludos!
__________________
Cristian Conedera
Mi Web: BothMedia.com, Diseño y Desarrollo
Mi Blog: nitrousBLOG*
  #5 (permalink)  
Antiguo 22/02/2005, 10:52
 
Fecha de Ingreso: septiembre-2001
Ubicación: Monterrey
Mensajes: 663
Antigüedad: 23 años, 3 meses
Puntos: 6
Es correcta tu solucion, recuerda que los valores por defecto en los parametros de una funcion son constantes, no pueden ser variables.
  #6 (permalink)  
Antiguo 22/02/2005, 12:23
Avatar de nitrouz  
Fecha de Ingreso: agosto-2003
Ubicación: Buenos Aires, Argentina
Mensajes: 78
Antigüedad: 21 años, 4 meses
Puntos: 0
Mi Clase de conexion a Bases de Datos

Código PHP:
######################################
# Clase de Conexion a Base de Datos  #
# Cristian Conedera      #
# http://www.nitrous.com.ar/   #
######################################
class dbCon {
  
//Atributos de conexion
  
var $host;
  var 
$user;
  var 
$pass;
  var 
$db;
  
  
//Identificadores de Conexion
  
var $conID 0;
  var 
$queryID = array();
  var 
$campo;
  var 
$row = array();
  
  
// Modo de Debug
  
var $debug 0;
  var 
$debugLOG;
  
  
// Constructor
  
function dbCon ($host="localhost",$user="root",$pass="",$db="")
  { 
    
$this->host $host;
 
$this->user $user;
 
$this->pass $pass;
 
$this->db $db;
  }  
  
  
// Conexion a la base de datos
  
function conectar($host,$user,$pass,$db)
  { 
    if(
$host=="" || $user=="" || $db=="") die("No se ingresaron todos los datos de conexión<br>");
    
$this->host $host;
    
$this->user $user;
    
$this->pass $pass;
    
$this->db $db;
 
    
$this->conID = @mysql_connect($this->host,$this->user,$this->pass);
 if(!
$this->conID) {
   die(
"<b>Error al conectar al Servidor MySQL: </b>".mysql_error());
 } else { if(
$this->debug) echo "Se realizo la conexion con exito (".$this->host.",".$this->user.",".$this->pass.")<br>"; }
 
mysql_select_db($this->db,$this->conID);
 
 if(
$this->debug) echo "Se selecciono la base de datos <b>".$this->db."</b><br>"#debug
 
 
return $this->conID;
  }
  
  
// Hacer consulta
  
function consulta ($consulta,$ident=NULL
  {
    if(empty(
$ident)) { die("El identificador de consulta no puede estar vacío"); }
    if(empty(
$consulta)) { die("La consulta no puede estar vacía"); }
 
$this->queryID[$ident] = mysql_query($consulta,$this->conID);
  if(!
$this->queryID[$ident]) 
  {
   die(
"<b>Error al ejecutar la consulta:</b> \"".$consulta."\"<br><b>MySQL dice:</b> ".mysql_error($this->conID));
  } 
   else 
  { 
   if(
$this->debug) echo "Se ejecuto la consulta<b> \"$consulta\"</b> con el ID: <b>$ident</b> exitósamente.<br>"
  }
 return 
$this->queryID[$ident];
  }
  
  
// Cuenta numero de registros
  
function numreg($ident=NULL
  { 
    if(!
$this->check_ident($ident)) { die("El identificador esta vacío o no es válido"); }
 if(
$this->debug) echo "Se solicito el numero de registros de <b>$ident</b><br>"#debug
 
return mysql_num_rows($this->queryID[$ident]);
  }
  
// Cuenta numero de campos
  
function numcampos($ident=NULL
  {
    if(!
$this->check_ident($ident)) { die("El identificador esta vacío o no es válido"); }
 if(
$this->debug) echo "Se solicito el numero de campos  de <b>$ident</b><br>"#debug
 
return mysql_num_fields($this->queryID);
  }  
  
  
// Muestra el contenido de un campo del registro especificado por $offset
  
function busca($campo,$offset=0,$ident=NULL)
  {
    if(!
$this->check_ident($ident)) { die("El identificador esta vacío o no es válido"); }
    if(
$this->debug) echo "Se solicito el contenido del campo <b>\"$campo\"</b> registro nº <b>$offset</b> de la consulta <b>$ident</b><br>"#debug
 
$temp = @mysql_result($this->queryID[$ident],$offset,$campo);
 if(!
$temp) die("El campo $campo o el registro $offset no existe");
 return 
$temp;
  }
  
  function 
recorre($ident=NULL)
  {
   if(!
$this->check_ident($ident)) { die("El identificador esta vacío o no es válido"); }
   
$this->row[$ident] = mysql_fetch_array($this->queryID[$ident]);
   return 
$this->row[$ident];
  }
  
  
// Muestra el contenido de un campo dentro de una consulta con mysql_fetch_array();
  
function campo($campo,$ident=NULL)
  {
   if(!
$this->check_ident($ident)) { die("El identificador esta vacío o no es válido"); }
   if(!
array_key_exists($campo,$this->row[$ident])) die("No existe el campo solicitado");
   return 
$this->row[$ident][$campo];
  }
  
  
  
// Libera los resultados del Query
  
function liberar($ident=NULL)
  {
   if(!
$this->check_ident($ident)) { die("El identificador esta vacío o no es válido"); }
   if(
$this->debug) echo "Se liberaron los resultados de la consulta $ident<br>"#debug
   
return mysql_free_result($this->queryID[$ident]);
  }
  
  
// Cierra Base de Datos
  
function cerrar()
  {
   if(
$this->debug) echo "Se cerro la conexion con la base de datos<br>"#debug
   
return mysql_close($this->conID);
  }
  
  function 
check_ident($ident=NULL)
  { 
   
$valido 1;
   if(empty(
$ident)) $valido 0;
   else 
     if(!
array_key_exists($ident,$this->queryID))
   
$valido 0;
   return 
$valido;
  } 

Aún le falta perfeccionar un poco los mensajes del Debug.
Y creo que va a haber problema (no lo chequee todavía) con la función campo() cuando queramos recorrer dos arrays de Bases de Datos con loops anidados.
No es la mejor clase, pero es la primera que hago...

Cualquier sugerencia es bienvenida
__________________
Cristian Conedera
Mi Web: BothMedia.com, Diseño y Desarrollo
Mi Blog: nitrousBLOG*

Última edición por nitrouz; 22/02/2005 a las 22:13
  #7 (permalink)  
Antiguo 22/02/2005, 13:10
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 23 años
Puntos: 129
Como sugerencia .. crea métodos para obtener tus "mensajes" .. así sacaras de la classe todo "echo" y demás que originan esa salida ("vista"?) forzosa al usar la classe.

De esta manera se pueden hacer cosas como crear un log a un archivo (sin tener que forzosamente mostrarlos en "pantalla") .. tener esos mensajes de error en vários idiomas .. etc.

Así separas más la capa de "lógica (negocios?)" de la "presentación"

Un saludo,
  #8 (permalink)  
Antiguo 22/02/2005, 13:16
Avatar de nitrouz  
Fecha de Ingreso: agosto-2003
Ubicación: Buenos Aires, Argentina
Mensajes: 78
Antigüedad: 21 años, 4 meses
Puntos: 0
Como haría esto?
Guardando todos los mensajes en una variable?

o esa...

$debug+="Se consulto la base de datos\n";

algo así ?
__________________
Cristian Conedera
Mi Web: BothMedia.com, Diseño y Desarrollo
Mi Blog: nitrousBLOG*
  #9 (permalink)  
Antiguo 22/02/2005, 21:39
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 21 años, 3 meses
Puntos: 41
Para el tema de errores.
Podrías hacer que los métodos guarden el error presentado en un atributo (¿$this->error?) y ejecuten un: "return false".
El código que utilice esta clase se encargará de decdir si mostrar errores o no (y cómo).
Si llaman a un método y este devuelve "false", entonces sabrá que hay un error.

A partir de PHP5 ya se soporta el manejo de excepciones, con lo que se facilita la tarea de manejar errores.

También sería bueno que pongas un código de cómo funcionaría tu clase.
Por ejemplo, no veo por qué tu constructor pide los datos de conexión y el método conectar() los vuelve a pedir. Creo que el constructor debería llamar automáticamente al método conectar() y enviarle los parámetros, aunque si ya está guardados en atributos, no sería necesario que los pida, simplemente debería tomarlos:
mysql_connect($this->host, $this->user, $this->pass);

Saludos
  #10 (permalink)  
Antiguo 22/02/2005, 22:11
Avatar de nitrouz  
Fecha de Ingreso: agosto-2003
Ubicación: Buenos Aires, Argentina
Mensajes: 78
Antigüedad: 21 años, 4 meses
Puntos: 0
Es verdad, tienes razón Se me pasó...
Así que si yo creo un objeto de conexion, losdatos los pongo directamente y luego ya se conectaría automaticamente al crear el objeto nice... Buena idea! Ahorramos un par de lineas de código...

(Modifique el código de la clase para que pueda ejecutar varias consultas con el mismo objeto Si quieren verlo lo edite en la respuesta anterior. No lo agregué aca así no se hace muy largo el post )

Actualmente lo estoy usando con el siguiente código...

Código PHP:
$dbcon = new dbCon;
$dbcon->conectar($host,$user,$pass,$db);
$dbcon->consulta("SELECT * FROM news ORDER BY new_date DESC LIMIT 0,6","main");
while(
$dbcon->recorre("main")) {
     echo 
$dbcon->campo("new_date","main");
}
$dbcon->liberar("main");
$dbcon->cerrar(); 
Pero con lo que me dijo jpinedo creo que solo bastaría esto...

Código PHP:
$dbcon = new dbCon($host,$user,$pass,$db);
$dbcon->consulta("SELECT * FROM news ORDER BY new_date DESC LIMIT 0,6","main");
while(
$dbcon->recorre("main")) {
     echo 
$dbcon->campo("new_date","main");
}
$dbcon->liberar("main");
$dbcon->cerrar(); 
Que me recomiendan? que le haga un metodo para conectar a varias DB o es recomendable que cree otro objeto directamente?

Saludos!
__________________
Cristian Conedera
Mi Web: BothMedia.com, Diseño y Desarrollo
Mi Blog: nitrousBLOG*
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 01:56.