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

Call to a member function fetch()

Estas en el tema de Call to a member function fetch() en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola amigos. Estoy recien empezando con POO en PHP, me parece muy interesante. Les cuento, tengo dos clases creadas utilizando PDO, una es para manejar ...
  #1 (permalink)  
Antiguo 21/07/2008, 14:58
 
Fecha de Ingreso: febrero-2003
Ubicación: La serena
Mensajes: 144
Antigüedad: 21 años, 3 meses
Puntos: 0
Call to a member function fetch()

Hola amigos. Estoy recien empezando con POO en PHP, me parece muy interesante.
Les cuento, tengo dos clases creadas utilizando PDO, una es para manejar la base de datos. (conecta_bd.php)
Código PHP:
<?
class Capa_datos {
    public static 
$db;        
    function 
conectaDb()
    {
        try {
            
$db = new PDO('mysql:dbname=datos;host=xxx.xx.xx.xxx''admin''xxxxx');
            
$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERYTRUE);
            return(
$db);
        } catch (
PDOException $e) {
            print 
"<p>Error: No puede conectarse con la base de datos." $e->getMessage() ." </p>\n";    
            exit();
        }
    }
    
     function 
consulta($query){
        
$instancia=$this->conectaDb();
          
$res=$instancia->query($query); 
        return(
$res);
    }
    
    function 
ejecuta_query($query){    
        
        
$instancia2=$this->conectaDb();
        
$count=$instancia2->exec($query); 
        return(
$count);
        
    }    
    
}

?>
y otra que entre otras cosas busca la existencia del valor de un campo que en la base esta marcado como "SI" (validador.php)

Código PHP:
 <?php    
include('class/conecta_bd.php');
class 
Validador{        
    private 
$ins_db;
    
    public function 
__construct(){
        
$ins_db=null;
    }

    function 
find_existe($id,$campo_id$tabla$campo_buscado)
    
/*busca la existencia (SI) en el campo señalado
     * donde $id representa el valor clave, $tabla: la tabla donde se busca
     * $campo_id es el nombre del campo clave y $campo_buscado es el nombre del campo que desemos evaluar    
     */

    
{
        
$ok=false;
        
$ins_db = new Capa_datos;
        
$str_sql "select $campo_buscado from $tabla where $campo_id = $id";                
        unset (
$result);
        
$result=$ins_db->consulta($str_sql);
        
$rows $result->fetch();
        
$dato $rows[0];
        if (
$dato=='SI'){
            
$ok=true;
        }
        return(
$ok);
    }    
}  
?>
el tema que tengo 2 programas que realizan la misma funcion. buscar si los registros estan marcados con un SI o NO. (asi esta la BD de origen :) )

estos programas llaman a validador.php que a su vez llama a conecta_bd.php

Ej.
Código PHP:
<?php
/*verificación de procedimiento 1*/
include ('class/validador.php');
$db = new Capa_datos;
$vl = new Validador;
$result=$db->consulta("SELECT * FROM inconcistencia_general where PROCED_TERM = '003'");
    foreach (
$result as $valor) {
        
$id=$valor[0];    
        
        
$var_rut=$valor[3];    
        
        echo 
$id;
            
        unset(
$errores);
        
$cont_error=0;
        
             
        
$sent $vl->find_existe($id,'ID','inconcistencia_general',CAMPO1');                
        if ($sent==false){
            $cont_error++;
            $errores[$cont_error]='
no registra ....';
        }
        $vl->NULL;


        $cita_js = $vl->find_existe($id,'
ID','inconcistencia_general','CAMPO2);                                                                       
        if (
$cita_js==false){
            
$cont_error++;
            
$errores[$cont_error]='No registra constancia 2';
        }
        
        
        
/*asi repite estas validaciones varias veces*/
        
        
if ($cont_error>0){
            echo 
"se econtraron $cont_error errores en el RUT $valor[3];";
            
$str_error='"'.implode(",",$errores).'"'
            
$sql "INSERT INTO `reporte_inconcistencia` ";
            
$sql.= "(`N1`, `N2`, `N3`, `N4`, `N5`, `error`)";
            
$sql.= "VALUES ('$var_rut', '', '', '', '', '$str_error')";
            
$cont=$db->ejecuta_query($sql);
            echo 
$sql;    
        echo 
'<br>';    
        }
    }

$db->NULL;


?>
el otro script es similar lo tengo separado ya que se ejecutaran indistintamente.

Código PHP:
<?php
include ('class/validador.php');
$db = new Capa_datos;
$val = new Validador;
$result=$db->consulta("SELECT * FROM inconcistencia_general where PROCED = '002'");

    foreach (
$result as $valor) {
        
$id=$valor[0];    
        
        
$var_rut=$valor[3];    
            
        unset(
$errores);
        
$cont_error=0;
        
        
        
$sent $val->find_existe($id,'ID','inconcistencia_general','CAMPO1');        
        
        
        if (
$sent==false){
            
$cont_error++;
            
$errores[$cont_error]='describe error 1...';
        }
        
$cita $val->find_existe($id,'ID','inconcistencia_general','CAMPO2');        
        if (
$cita==false){
            
$cont_error++;
            
$errores[$cont_error]='describe error 2...';
        }
        
            

        if (
$cont_error>0){
            echo 
"se econtraron $cont_error errores en el ruc $valor[3];";
            
$str_error='"'.implode(",",$errores).'"'
            
$sql "INSERT INTO `reporte_inconcistencia` ";
            
$sql.= "(`rut`, `n1`, `n2`, `n3`, `n4`, `error`)";
            
$sql.= "VALUES ('$var_rut', '', '', '', '', '$str_error')";

            
$cont=$db->ejecuta_query($sql);
            echo 
$sql;
    
        echo 
'<br>';    
        }
        


        
    }


$db->NULL;


?>
bueno. el tema esta en que el segundo script corre perfectamente valida e ingresa los resultados a una tabla, y el primero , siendo a mi juicio practicamente igual me arroja el error
Call to a member function fetch()
me pueden orientar para ver si el problema es en la creacion de las clase o que ?

saludos y se agradece.
__________________
Hoy dia aprendí algo nuevo.
  #2 (permalink)  
Antiguo 21/07/2008, 19:14
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años
Puntos: 32
Respuesta: Call to a member function fetch()

La verdad estaría bueno que simplificaras la exposición, ya que uno a veces anda cansado y no le da el cerebro para hacer todo el seguimiento y ejecutar el código (faltaría más).

Si no te tomas el tiempo para simplificar tu propio problema, mucho menos alguien se tomará el tiempo para entender y contestar el problema de otro.

Por lo pronto te digo:
  • El código no es igual, ya que uno da error y el otro no (aunque te suene a tontería, es parte del testing tener claro estos conceptos)
  • ¿En qué línea exacta te da el error?
  • ¿cuales son las líneas de código que dan error?
  • Revisa el diseño, decide si Capa_datos es de "tipo" PDO o Persistencia, de ser así, ahí deberías hacer una herencia.

Anexo
  • Elimina los atributos globales
  • Estás creando una nueva conexión cada vez que quieres hacer algo, solo crea en el constructor una vez y luego solicita la conexión existente
  • Usa nomenclatura estándar, usa camelcase
__________________
Blog phpsenior.com Cursos a Distancia surforce.com

Última edición por enriqueplace; 21/07/2008 a las 19:16 Razón: redacción
  #3 (permalink)  
Antiguo 21/07/2008, 22:20
 
Fecha de Ingreso: febrero-2003
Ubicación: La serena
Mensajes: 144
Antigüedad: 21 años, 3 meses
Puntos: 0
Respuesta: Call to a member function fetch()

Primero que nada, se agradece por contestar, he leido tus post y me han servido mucho para orientarme, llevo pocos dias con php5 y puse todo el codigo para sea evaluado en contecto. Voya seguir tus consejos para acotar el problema solo al error.
Si es posible, ¿me podrias poner un ejemplo de como hacer solo una apertura de base de datos en el constructor?

Ademas no me quedo muy claro la diferencia entre PDO y persistencia, voy a googlear un poco mas.

saludos
y gracias otra vez
__________________
Hoy dia aprendí algo nuevo.
  #4 (permalink)  
Antiguo 22/07/2008, 07:59
 
Fecha de Ingreso: febrero-2003
Ubicación: La serena
Mensajes: 144
Antigüedad: 21 años, 3 meses
Puntos: 0
Respuesta: Call to a member function fetch()

Ok segui los consejos de enriqueplace
cambie la conexion al constructor y revise bien los archivos. Habia un problema en la construcción de una query en un objeto y no era problemas de las clases

Se agradece la respuesta.
__________________
Hoy dia aprendí algo nuevo.
  #5 (permalink)  
Antiguo 22/07/2008, 08:36
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años
Puntos: 32
Respuesta: Call to a member function fetch()

Puff... que alegría haber seguido la premisa de no responder tan rápido, ya que muchas veces el propio usuario encuentra la respuesta antes

Abrazos!
__________________
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 17:03.