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

Error con mysql_fetch_array?

Estas en el tema de Error con mysql_fetch_array? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola conoci este foro por el blog de enrique. Espero que me puedan dar una mano con este dilema... Mi clase hace una conexion con ...
  #1 (permalink)  
Antiguo 20/07/2008, 02:32
 
Fecha de Ingreso: julio-2008
Ubicación: Maldonado
Mensajes: 27
Antigüedad: 15 años, 9 meses
Puntos: 0
Busqueda Error con mysql_fetch_array?

Hola conoci este foro por el blog de enrique.

Espero que me puedan dar una mano con este dilema...
Mi clase hace una conexion con una base de datos, realiza consultas, cuenta numero de registros y columnas, entre otros metodos.
Cita:
<?php
class ServidorBaseDatos
{
private $servidor;
private $usuario;
private $pass;
private $baseDatos;
private $consulta;

function __construct($servidor, $usuario, $pass, $baseDatos)
{
$this->servidor = $servidor;
$this->usuario = $usuario;
$this->pass = $pass;
$this->baseDatos = $base_datos;
$this->conectarBaseBatos();
}
private function conectarBaseDatos();
{
$this->descriptor = mysql_connect($this->servidor, $this->usuario, $this->pass);
mysql_connect_database($baseDatos, $this->descriptor);
}
public function consulta($consulta)
{
$this->resultado = mysql_query($consulta, $this->descriptor);
}
public function extraerRegistro()
{
if ($fila = mysql_fetch_array($this->resultado, MYSQL_ASSOC))
{
return $fila;

}else{
return false;
}
}
public function numeroFilas()
{
return mysql_num_rows($this->resultado);
}
public function numeroColumnas()
{
return mysql_num_fields($this->descriptor);
}
public function filasAfectadas()
{
return mysql_affected_rows($this->descriptor);
}
public function ultimaFila()
{
return mysql_insert_id($this->descriptor);
}
}
?>
Bien, ahora tengo el siguiente problema: cuando quiero extraer la consulta y almacenarla en un array con el metodo extraer registro, el interprete de php me devuelve un warning diciendo que el argumento pasado ($this->resultado, en este caso) no es un recurso valido de MySQL, textualmente seria:Warning: mysql_fetch_array() supplied argument is not a valid MySQL result resource in line 30.
Esta es una de mis primeras clases, asi que por favor tenganme paciencia ;)
Saludos y a las ordenes!!!
  #2 (permalink)  
Antiguo 20/07/2008, 07:40
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años
Puntos: 32
Respuesta: Error con mysql_fetch_array?

Cita:
Iniciado por Wenaptic Ver Mensaje
Hola conoci este foro por el blog de enrique.

Espero que me puedan dar una mano con este dilema...
Mi clase hace una conexion con una base de datos, realiza consultas, cuenta numero de registros y columnas, entre otros metodos.

Bien, ahora tengo el siguiente problema: cuando quiero extraer la consulta y almacenarla en un array con el metodo extraer registro, el interprete de php me devuelve un warning diciendo que el argumento pasado ($this->resultado, en este caso) no es un recurso valido de MySQL, textualmente seria:Warning: mysql_fetch_array() supplied argument is not a valid MySQL result resource in line 30.
Esta es una de mis primeras clases, asi que por favor tenganme paciencia ;)
Saludos y a las ordenes!!!
Que tal Wenaptic

Por lo pronto me gustaría que colocaras el código de ejemplo que usas para probar la clase.

Hasta el momento lo que vi mal fue
  • Desde el constructor recibes por parámetro una variable base_datos que no es la misma que asignas al atributo baseDatos.
  • El atributo de resultado no lo defines al inicio de la clase (aunque no debería suceder nada, ya que lo crearía dinámicamente).
  • private function conectarBaseDatos(); tiene un ; demás al final
  • mysql_connect_database($baseDatos, $this->descriptor); está llamando a una variable $baseDatos y no a un atributo $this->baseDatos
  • Tienes un solo "=" en vez de "==" en el if ($fila = mysql_fetch_array($this->resultado, MYSQL_ASSOC))

Te sugiero usar un IDE como Eclipse (o Zend Studio en su versión comercial), ya que te avisan cuando suceden este tipo de distracciones.

Te paso en limpio las correcciones rápidas que hice (ojo, no lo probé, tampoco estoy seguro al 100% si es lo que esperas que haga):

Código PHP:
<?php
class ServidorBaseDatos
{
    private 
$servidor;
    private 
$usuario;
    private 
$pass;
    private 
$baseDatos;
    private 
$consulta;
        private 
$resultado;

    function 
__construct($servidor$usuario$pass$base_datos)
    {
        
$this->servidor $servidor;
        
$this->usuario $usuario;
        
$this->pass $pass;
        
$this->baseDatos $base_datos;
        
$this->conectarBaseBatos();
    }
    private function 
conectarBaseDatos()
    {
        
$this->descriptor mysql_connect($this->servidor$this->usuario$this->pass);
        
mysql_connect_database($this->baseDatos$this->descriptor);
    }
    public function 
consulta($consulta)
    {
        
$this->resultado mysql_query($consulta$this->descriptor);
    }
    public function 
extraerRegistro()
    {
        
$fila mysql_fetch_array($this->resultadoMYSQL_ASSOC);
        if ( isset(
$fila) ){
            return 
$fila;
        }else{
            return 
false;
        }
    }
    public function 
numeroFilas()
    {
        return 
mysql_num_rows($this->resultado);
    }
    public function 
numeroColumnas()
    {
        return 
mysql_num_fields($this->descriptor);
    }
    public function 
filasAfectadas()
    {
        return 
mysql_affected_rows($this->descriptor);
    }
    public function 
ultimaFila()
    {
        return 
mysql_insert_id($this->descriptor);
    }
}
?>
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #3 (permalink)  
Antiguo 20/07/2008, 14:45
 
Fecha de Ingreso: julio-2008
Ubicación: Maldonado
Mensajes: 27
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Error con mysql_fetch_array?

Muchas gracias enrique por tu pronta respuesta!
Los errores que destacastes ya los corregi y el problema sigue estando :(
Un ejemplo de uso de la clase es la siguiente:
actualiza.php
Este script actualiza un registro
Código PHP:
<?php
require_once(mysql.class.php);
$servidor "localhost";
$usuario "root";
$pass "password";
$baseDatos "Compras";
$consulta "SELECT id_usuario FROM Usuario WHERE nombre = 'Luis Miguel'";
$usuario = new ServidorBaseDatos($servidor$usuario$pass$baseDatos);
$usuario->consulta($consulta);
$fila $usuario->extraerRegistro();
$idUsuario $fila["idUsuario"];
$actualizar "UPDATE Usuario SET cuenta = 9999 WHERE idUsuario = 'id_usuario'";
$usuario->consulta($actualizar);
?>
Por cierto ahora estoy leyendo que para trabajar con base de datos lo mejor es usar mysqli o PEAR DB. ¿Que opinas al respecto?
Un saludo y gracias de vuelta!!
  #4 (permalink)  
Antiguo 20/07/2008, 17:31
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años
Puntos: 32
Respuesta: Error con mysql_fetch_array?

Sé metódico y revisa exactamente donde es que sale el error, si lo hace en un punto particular o en todos, también revisa qué valores tienen los atributos una vez que sucede el problema.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #5 (permalink)  
Antiguo 20/07/2008, 17:33
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años
Puntos: 32
Respuesta: Error con mysql_fetch_array?

A su vez, realiza un var_dump de $fila, pues me parece que no lo estás usando correctamente.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #6 (permalink)  
Antiguo 20/07/2008, 23:14
 
Fecha de Ingreso: julio-2008
Ubicación: Maldonado
Mensajes: 27
Antigüedad: 15 años, 9 meses
Puntos: 0
De acuerdo Respuesta: Error con mysql_fetch_array?

Al fin!!! lo pude solucionar, a parte de las fe de erratas que me mande al transcribir la clase al post, enumero las correcciones:
1 - la variable fila estaba mal instanciada (pensamiento procedural), gracias Enrique!
cambie $fila por $this->registro
2 - agregue "or die ($Sql.mysql_error()."");" al metodo consulta para detallar el tipo de error, quedando en evidencia que el error esta en la consulta SQL.
Ahora dejo la clase y el ejemplo de uso, por si alguien le interesa:
mysql.class.php
Código PHP:
<?php
class ServidorBaseDatos
{
    private 
$servidor;
    private 
$usuario;
    private 
$pass;
    private 
$baseDatos;
    private 
$consulta;
    private 
$resultado;
    private 
$registro;

    function 
__construct($servidor$usuario$pass$baseDatos)
    {
        
$this->servidor $servidor;
        
$this->usuario $usuario;
        
$this->pass $pass;
        
$this->baseDatos $baseDatos;
        
$this->conectarBaseDatos();
    }
    private function 
conectarBaseDatos()
    {
        
$this->descriptor mysql_connect($this->servidor$this->usuario$this->pass);
        
mysql_select_db($this->baseDatos$this->descriptor);
    }
    public function 
consulta($consulta)
    {
        
$this->resultado mysql_query($consulta$this->descriptor) or die ($Sql.mysql_error()."");
    }
    public function 
extraerRegistro()
    {
        
$this->registro mysql_fetch_array($this->resultadoMYSQL_ASSOC);
        
    }
    public function 
numeroFilas()
    {
        return 
mysql_num_rows($this->resultado);
    }
    public function 
numeroColumnas()
    {
        return 
mysql_num_fields($this->descriptor);
    }
    public function 
filasAfectadas()
    {
        return 
mysql_affected_rows($this->descriptor);
    }
    public function 
ultimaFila()
    {
        return 
mysql_insert_id($this->descriptor);
    }
}
?>
Ejemplo:
Código PHP:
<?php
require_once("mysql.class.php");
$servidor "localhost";
$usuario "root";
$pass "m4k8ts";
$baseDatos "Compras";
$consulta "SELECT idUsuario FROM Usuario WHERE nombre = 'Luis'";
$usuario = new ServidorBaseDatos($servidor$usuario$pass$baseDatos);
$usuario->consulta($consulta);
$registro $usuario->extraerRegistro();
$idUsuario $registro["idUsuario"];
$actualizar "UPDATE Usuario SET apellido = 'Tigre' WHERE idUsuario = '".$idUsuario."'";
$usuario->consulta($actualizar);
?>
Autocontestacion:
En cuanto a la opinion sobre PEAR DB y mysqli...
El primero esta obsoleto segun la documentacion de PEAR, hay un nuevo modulo que ocupa su lugar y mysqli hace lo mismo que mi clase y mas, seguramente use esta extension en un futuro cercano, mañana

Gracias nuevamente Enrique por el salvavidas

Última edición por Wenaptic; 20/07/2008 a las 23:53
  #7 (permalink)  
Antiguo 21/07/2008, 18:26
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años
Puntos: 32
Respuesta: Error con mysql_fetch_array?

Cita:
2 - agregue "or die ($Sql.mysql_error()."");" al metodo consulta para detallar el tipo de error, quedando en evidencia que el error esta en la consulta SQL.
Bueno, la "programación defensiva" es fundamental para ahorrarte bastante tiempo.

Otras sugerencias con respecto al código:

Código PHP:
require_once('Mysql.php');

$usuario = new ServidorBaseDatos();
$usuario->consulta($consulta);
$sql "SELECT idUsuario FROM Usuario WHERE nombre = 'Luis'";

$registro $usuario->extraerRegistro();
$idUsuario $registro["idUsuario"];
$actualizar "UPDATE Usuario SET apellido = 'Tigre' WHERE idUsuario = '".$idUsuario."'";
$usuario->consulta($actualizar); 
La información de conexión -en esta etapa- sería recomendable que la dejaras fija dentro de la clase Base de Datos (o como una constante). Si quieres cambiarla, define entonces atributos privados con valores por defecto y desde el constructor o con setter/getter permite cambiar los datos de conexión (si así decides que debería ser el diseño).

La siguiente etapa podría ser crear un archivo único de configuración con constantes y que la clase las incluya.

Posteriormente, podrías evolucionar a:
  • Crear una clase genérica BaseDeDatos y una particular MySQL, si mañana necesitas PostreSQL solo crearás esta clase y tu sistema solo dependerá de la clase genérica
  • Crear una clase "representante" para la persistencia, es decir, una clase UsuarioPresistente donde tenga las operaciones concretas (grabar, recuperar, etc) y que use la clase BaseDeDatos para hacer las operaciones de "bajo nivel" (insert, delete, etc). Así, tu clase Usuario -> UsuarioPersistente -> BaseDeDatos -> Mysql
  • Finalmente, empezar a dividir tu sistema en capas, 3 al menos, donde todo esto último sería de la capa de persistencia, y tu clase de dominio Usuario se comunica con una clase "fachada" PersistenciaFachada.
  • etc.

Hay un trecho -que no es complicado- que puedes recorrer e ir aprendiendo.

Cita:
En cuanto a la opinion sobre PEAR DB y mysqli...
El primero esta obsoleto segun la documentacion de PEAR, hay un nuevo modulo que ocupa su lugar y mysqli hace lo mismo que mi clase y mas, seguramente use esta extension en un futuro cercano, mañana
En sí, sin importar qué uses a bajo nivel, es recomendable que tu sistema tenga una "capa de abstracción" propia. Es decir, es más seguro que tu sistema dependa de tu clase BaseDeDatos y que internamente uses sentencias de PHP, y si mañana cambias de sistema, por una clase de Pear o otro producto, tu sistema seguirá funcionado con el mínimo de cambio, ya que el "foco de cambio" está contenido en esa clase.

Cita:
Gracias nuevamente Enrique por el salvavidas
De nada, a las órdenes.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
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 16:28.