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

Error de foreach al instanciar un metodo en otro metodo usando PDO

Estas en el tema de Error de foreach al instanciar un metodo en otro metodo usando PDO en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola buenas dias, ayer me pase mas de una hora testeando un script que me a mi parecer esta mal uso PDO y me sale ...
  #1 (permalink)  
Antiguo 14/01/2011, 08:51
 
Fecha de Ingreso: febrero-2006
Mensajes: 44
Antigüedad: 18 años, 1 mes
Puntos: 0
Error de foreach al instanciar un metodo en otro metodo usando PDO

Hola buenas dias, ayer me pase mas de una hora testeando un script que me a mi parecer esta mal uso PDO y me sale este error en un foreach que supuestamente la logica de programacion esta bien, pero igual me sale error y no se en que me equivoco: dentro de cita() invoco a objetivosCIta() de esta forma:
Código PHP:
include(TO."CitaTO.php");
include(
TO."AccionTO.php");
include(
MODEL."ConexionBD.php");
class 
CitaModel{

    
    function 
cita($data){
         try {
             if(
$data['day']<10)
                 
$data['day'] = '0'.$data['day'];
            
$fecha $data['year'].$data['month'].$data['day'];
            
$db=ConexionBD::getConexion();
            
$sql="  SELECT e.cal_id,e.cal_time,e.cal_name, e.cal_date, e.cal_description, ce.cal_Estado FROM webcal_entry  e
                    INNER JOIN webcal_entry_user eu
                    ON e.cal_id = eu.cal_id
                    LEFT JOIN  webcal_close_entry ce
                    ON ce.cal_entry = e.cal_id
                    WHERE eu.cal_status = 'A'
                    AND eu.cal_login = '"
.$data['login']."'
                    AND cal_date = '$fecha'
            ORDER BY cal_time"
;

            
$arrCita=array();
            foreach(
$db->query($sql) as $row) {
               
$cita = new CitaTO();
                    
$cita->setIdEntry($row['cal_id']);
                    
$cita->setLogin($row['id_eje']);
                    
$cita->setDescripcion($row['cal_description']);
                    
$cita->setEstado($row['cal_Estado']);
                    
$cita->setFecha($row['cal_date']);
                    
$cita->setNombre($row['cal_name']);
                    
$cita->setHora($this->display_hora($row['cal_time']));
                    
//if()
                    
$cita->setObjetivos($this->objetivosCita(array('id_cita'=>$row['cal_id'])));
                    
$arrCita[] = $cita;
            }

            return 
$arrCita;
        }catch( 
Exception $e){
            
$msg mysql_error();
            
error_log($msg."\n\n"3"../log/error.log");
            throw 
$e;
        }

    }

    function 
display_hora($time '') {
        
$hour intval($time 10000);
        
$min abs(( $time 100 ) &#37; 100);
        
if ($time && $min 0)
            
$hour--;
        while (
$hour 0) {
            
$hour += 24;
        }
        while (
$hour 23) {
            
$hour -= 24;
        }
        
$t_format '12';
        if (
$t_format == '12') {
             
$hour $hour 5;
            
$ampm =     $hour >= 12 'pm' 'am';
            
$hour %= 12;
            if (
$hour == 0)
                
$hour 12;            
            
$ret sprintf("%d:%02d%s"$hour$min$ampm);
        } 
        return 
$ret;
    }

    public function 
objetivosCita($data){
        
//print_r($data);
        //exit;
        
try {
            
$dba=ConexionBD::getConexion();
            
$cita $data['id_cita'];
           
// if($cita!=""){
            
$sql="SELECT DISTINCT ac.Desc_action FROM webcal_actions AS ac
                    INNER JOIN webcal_asignaaction AS aa
                    ON aa.id_Action = ac.id_Action
                    WHERE aa.cal_entry = '$cita'"
;
                
//echo $sql;

                
$arrAccion=array();
                foreach(
$dba->query($sql) as $rows) {
                    
$objAcTO = new AccionTO();
                    
$objAcTO->setDescripcion($rows["Desc_action"]);
                    
$arrAccion[]=$objAcTO;
                }
                return 
$arrAccion;
            
//}
        
}catch( Exception $e){
            
$msg mysql_error();
            
error_log($msg."\n\n"3"../log/error.log");
            throw 
$e;
        }
    }

Y EL error que me sale es

Código:
Warning: Invalid argument supplied for foreach() in C:\wamp\www\WebCalendar2\model\CitaModel.php on line 94

se refiere a la linea del foreach
Código PHP:
  foreach($dba->query($sql) as $rows

Última edición por raztafari123; 14/01/2011 a las 09:36
  #2 (permalink)  
Antiguo 14/01/2011, 09:50
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Error de foreach al instanciar un metodo en otro metodo usando PDO

Pues sin ver lo que tu método $dba->query($sql) hace es muy difícil ayudarte, si bien el mensaje es el correcto, te esta diciendo que lo que regrese tu función $dba->query() no es un array/iterador que puedas usar en un foreach.

Saludos.
  #3 (permalink)  
Antiguo 14/01/2011, 10:22
 
Fecha de Ingreso: febrero-2006
Mensajes: 44
Antigüedad: 18 años, 1 mes
Puntos: 0
Respuesta: Error de foreach al instanciar un metodo en otro metodo usando PDO

Cita:
Iniciado por GatorV Ver Mensaje
Pues sin ver lo que tu método $dba->query($sql) hace es muy difícil ayudarte, si bien el mensaje es el correcto, te esta diciendo que lo que regrese tu función $dba->query() no es un array/iterador que puedas usar en un foreach.

Saludos.
ejecuta una sentencia SQL en una sola llamada de función
query()
es una funcion nativa PDO
http://php.net/manual/es/pdo.query.php

revisa si deseas, haber si me puedes ayudar mas
  #4 (permalink)  
Antiguo 14/01/2011, 10:29
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Error de foreach al instanciar un metodo en otro metodo usando PDO

Leiste la doc ? devuelve false ante un error, es seguramente lo que esta pasando, igualmente deberias utilizar, prepare.
  #5 (permalink)  
Antiguo 14/01/2011, 10:30
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Error de foreach al instanciar un metodo en otro metodo usando PDO

Imprime tu query y ejecutala en tu gestor DBA para que veas si el query generado esta correctamente formado, igual deberías de primero asignar el valor a otra variable y comparar el número de rows retornado ya que en el caso que no te devuelva rows te daría false.

Saludos.
  #6 (permalink)  
Antiguo 14/01/2011, 10:33
 
Fecha de Ingreso: febrero-2006
Mensajes: 44
Antigüedad: 18 años, 1 mes
Puntos: 0
Respuesta: Error de foreach al instanciar un metodo en otro metodo usando PDO

Cita:
Iniciado por GatorV Ver Mensaje
Imprime tu query y ejecutala en tu gestor DBA para que veas si el query generado esta correctamente formado, igual deberías de primero asignar el valor a otra variable y comparar el número de rows retornado ya que en el caso que no te devuelva rows te daría false.

Saludos.
ya hice eso el query (sql) si me ejecuta con con exito en mi gestor y cuando imprimo
$dba->query($sql) ya sea por print_r() o count() e inclusive echo no me sale nada

Saludos.
  #7 (permalink)  
Antiguo 14/01/2011, 10:42
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Error de foreach al instanciar un metodo en otro metodo usando PDO

Como te comento verifica el valor devuelto:
Código PHP:
Ver original
  1. $result = $dba->query($sql);
  2. var_dump($result->rowCount());

Te regresa más de 1?
  #8 (permalink)  
Antiguo 14/01/2011, 11:01
 
Fecha de Ingreso: febrero-2006
Mensajes: 44
Antigüedad: 18 años, 1 mes
Puntos: 0
Respuesta: Error de foreach al instanciar un metodo en otro metodo usando PDO

Cita:
Iniciado por GatorV Ver Mensaje
Como te comento verifica el valor devuelto:
Código PHP:
Ver original
  1. $result = $dba->query($sql);
  2. var_dump($result->rowCount());

Te regresa más de 1?
me sale error no reconoce rowCount()


Código:
Call to a member function rowCount()
  #9 (permalink)  
Antiguo 14/01/2011, 11:05
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Error de foreach al instanciar un metodo en otro metodo usando PDO

En ese caso haz un var_dump($result) para que veas que tipo de dato es $result.

Saludos.
  #10 (permalink)  
Antiguo 14/01/2011, 11:06
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Error de foreach al instanciar un metodo en otro metodo usando PDO

Deberías postear la clase ConexionDB.
  #11 (permalink)  
Antiguo 14/01/2011, 11:07
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Error de foreach al instanciar un metodo en otro metodo usando PDO

También asegurarte que estes pasandole el parámetro a PDO para que lance las excepciones y así puedas ver los errores.
  #12 (permalink)  
Antiguo 14/01/2011, 11:07
 
Fecha de Ingreso: febrero-2006
Mensajes: 44
Antigüedad: 18 años, 1 mes
Puntos: 0
Respuesta: Error de foreach al instanciar un metodo en otro metodo usando PDO

Cita:
Iniciado por GatorV Ver Mensaje
En ese caso haz un var_dump($result) para que veas que tipo de dato es $result.

Saludos.
ME RETORNA
Código PHP:
bool(false
  #13 (permalink)  
Antiguo 14/01/2011, 11:23
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Error de foreach al instanciar un metodo en otro metodo usando PDO

En ese caso hay un error con tu query, y como te comenté más arriba debes específicarle a PDO que te indique lanze una excepción para que la puedas ver.
  #14 (permalink)  
Antiguo 14/01/2011, 13:35
 
Fecha de Ingreso: febrero-2006
Mensajes: 44
Antigüedad: 18 años, 1 mes
Puntos: 0
Respuesta: Error de foreach al instanciar un metodo en otro metodo usando PDO

Cita:
Iniciado por GatorV Ver Mensaje
En ese caso hay un error con tu query, y como te comenté más arriba debes específicarle a PDO que te indique lanze una excepción para que la puedas ver.
bueno probe con un query simple y no me funciona tampoco, y como le especifico a a PDO que me lanze las excepciones?? disculpa pero no se gracias
  #15 (permalink)  
Antiguo 14/01/2011, 13:42
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Error de foreach al instanciar un metodo en otro metodo usando PDO

http://php.net/manual/en/pdo.setattribute.php, es mas si buscas en el link que vos pasaste http://php.net/manual/es/pdo.query.php en los comentarios vas a ver como se hace.

Etiquetas: foreach, metodo, pdo
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 13:50.