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

Fatal error: limpiar buffer de consulta PDO

Estas en el tema de Fatal error: limpiar buffer de consulta PDO en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola como estan estoy haciendo un sistemita y en un procedimiento donde muestro los datos del empleado y tambien su departamento(cargandolo en un combobox) me ...
  #1 (permalink)  
Antiguo 19/12/2010, 20:28
Avatar de Drknow  
Fecha de Ingreso: febrero-2008
Mensajes: 121
Antigüedad: 16 años, 10 meses
Puntos: 1
Exclamación Fatal error: limpiar buffer de consulta PDO

Hola como estan estoy haciendo un sistemita y en un procedimiento donde muestro los datos del empleado y tambien su departamento(cargandolo en un combobox) me sale un error pues sale en el momento en que se ejecuta un procedimiento almacenado :

Este error se muestra cuando uso appserver, yo trabajo en modulos separados apache, mysql, php pero el docente lo revisa en appserver. -.- !

ERROR :
Código HTML:
Ver original
  1.  

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.' in C:\AppServ\www\GestRecHuman\persistencia\Departame ntoDAOMySQL.php:17 Stack trace: #0 C:\AppServ\www\GestRecHuman\persistencia\Departame ntoDAOMySQL.php(17): PDO->query('CALL SPgetAllDe...') #1 C:\AppServ\www\GestRecHuman\dominio\DepartamentoSe rvice.php(31): DepartamentoDAOMySQL->getAllDepartamentos() #2 C:\AppServ\www\GestRecHuman\dominio\DepartamentoFa cade.php(24): DepartamentoService->getAllDepartamentos() #3 C:\AppServ\www\GestRecHuman\presentacion\Modificar Empleado.php(88): DepartamentoFacade::listarDepartamentos() #4 C:\AppServ\www\GestRecHuman\presentacion\Modificar Empleado.php(118): ModificarEmpleado::main() #5 {main} thrown in C:\AppServ\www\GestRecHuman\persistencia\Departame ntoDAOMySQL.php on line 17


Estos son mis procesos

mi conexion es un singleton...

mi funcion que muestra un empleado

Código PHP:
Ver original
  1. public function getEmpleadoById($empno)
  2.     {
  3.     $empleado = NULL;
  4.     $query = 'CALL SPgetEmpleadoById(?)';
  5.     try {
  6.             $cn = ConnectionManager::getInstance();
  7.             $rs = $cn->prepare($query);
  8.             $rs->bindParam(1, $empno);
  9.            
  10.             $rs->execute();
  11.                 if ($emp = $rs->fetch(PDO::FETCH_OBJ)) {
  12.                     $empleado = new Empleado($emp->empno, $emp->ename, $emp->job, $emp->mgr, $emp->hiredate, $emp->sal, $emp->comm, $emp->deptno);
  13.                 }
  14.                     $rs->closeCursor();
  15.  
  16.                     $cn = null;
  17.     } catch (PDOException $ex) {
  18.             throw $ex;
  19.     }
  20.     return $empleado;
  21.     }

mi function que muestra los departamentos

Código PHP:
 public function getAllDepartamentos()
    {
        
$departamentos = array();
        
$query 'CALL SPgetAllDepartamentos()';
    try {
            
$cn ConnectionManager::getInstance();
            
$rs $cn->query($query); // e tratado con prepare y es igual
            
$rs->execute(); // aqui me muestra el error PDO
                
while ($dep $rs->fetch(PDO::FETCH_OBJ)) {
                    
$departamentos[] = new Departamento($dep->deptno,$dep->dname,$dep->loc);
        }
                    
$rs->closeCursor();
                    
$cn NULL;
    } catch (
PDOException $ex) {
            throw 
$ex;
    }
            return 
$departamentos;

    } 
cuando los llamo me muestra el error que les mostre
La verdad no se que hacer !!!

Saludos
  #2 (permalink)  
Antiguo 19/12/2010, 21:41
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años, 8 meses
Puntos: 461
Respuesta: Fatal error: limpiar buffer de consulta PDO

Pues es extraño que en tu maquina funcione y en la del profesor no?? sera que el appserver del profesor no tiene activada la extencion de PDO?? has en la computadora de tu profesor phpinfo(INFO_MODULES); y ve si tiene la extension de PDO habilitada, otra cosa ya saliendome un poco del tema el uso de singleton para las clases de base de datos no esta recomendado fijate aca yo estaba creando una clase para la conexion y me dieron muchas ideas, saludos
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #3 (permalink)  
Antiguo 19/12/2010, 21:52
 
Fecha de Ingreso: mayo-2005
Mensajes: 201
Antigüedad: 19 años, 6 meses
Puntos: 2
Respuesta: Fatal error: limpiar buffer de consulta PDO

Código PHP:
Ver original
  1. $cn->setAttribute(PDO_MYSQL_ATTR_USE_BUFFERED_QUERY, 1);

Coloca eso despues del Connection Manager si no funciona eso prueba usando el fetchAll ese problema sucede en las versiones 5.0.x de MySQL.
__________________
Saludos!
Mty-NL..
  #4 (permalink)  
Antiguo 20/12/2010, 23:08
Avatar de Drknow  
Fecha de Ingreso: febrero-2008
Mensajes: 121
Antigüedad: 16 años, 10 meses
Puntos: 1
De acuerdo Respuesta: Fatal error: limpiar buffer de consulta PDO

si creo que es problema de las versiones hoy hable con el profesor
las versiones antiguas no detectan algunos errores de PDO(es la version que tengo en modulos separados apache,php,mysql) como el appserver tiene versiones mas recientes...

voy a checkear como me va
  #5 (permalink)  
Antiguo 21/12/2010, 06:05
Avatar de historiasdemaria  
Fecha de Ingreso: septiembre-2010
Ubicación: www
Mensajes: 433
Antigüedad: 14 años, 2 meses
Puntos: 54
Respuesta: Fatal error: limpiar buffer de consulta PDO

Yo he visto este error a veces, y hay varias posibilidades:

- un error sql de base
- se le acaba la memoria

Las posibles soluciones pasan por

* Poner el atributo use_buffered_queries=true
* Utilizar fetchAll ( recuperar todo de una vez y no en cada linea del while)
* Optimizar las queries al maximo e instalar la ultima version de MySql
  #6 (permalink)  
Antiguo 27/01/2011, 15:12
Avatar de Drknow  
Fecha de Ingreso: febrero-2008
Mensajes: 121
Antigüedad: 16 años, 10 meses
Puntos: 1
Pregunta Respuesta: Fatal error: limpiar buffer de consulta PDO

aun estoy en las mismas lo he dejado pero ahora quiero que salga pero aun nada...

como limpio el buffer de consulta pues estoy usando un singleton y en la misma pagina hago 3 consultas, todo sale ok pero al final de la pagina me imprime este error el apache, al ultimo hago un insertInto de auditoria pues este no se llega a ejecutar

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.' in C:\www\webs\GestRecHuman\persistencia\OperacionDAO MySQL.php:54 Stack trace: #0 C:\www\webs\GestRecHuman\persistencia\OperacionDAO MySQL.php(54): PDOStatement->execute() #1 C:\www\webs\GestRecHuman\dominio\OperacionService. php(36): OperacionDAOMySQL->insertOperacion(Object(Operacion)) #2 C:\www\webs\GestRecHuman\dominio\OperacionFacade.p hp(64): OperacionService->insertOperacion(Object(Operacion)) #3 C:\www\webs\GestRecHuman\presentacion\VistaEmplead o.php(85): OperacionFacade::guardarOperacion(Object(Operacion )) #4 C:\www\webs\GestRecHuman\presentacion\VistaEmplead o.php(88): VistaEmpleado::main() #5 {main} thrown in C:\www\webs\GestRecHuman\persistencia\OperacionDAO MySQL.php on line 54



Código PHP:

    
public function insertOperacion(Operacion $operacion)
    {
        
$flag FALSE;
    
$query 'CALL SPinsertOperacion(?, ?, ?, ?, ?, ?)';
    try {
            
$cn ConnectionManager::getInstance();
           
// $cn->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY , true);
            
$st $cn->prepare($query);
            
$st->bindParam(1$operacion->getIdOperacion());
            
$st->bindParam(2$operacion->getQuery());
            
$st->bindParam(3$operacion->getTable());
            
$st->bindParam(4$operacion->getOperationDate());
            
$st->bindParam(5$operacion->getIdUser());
            
$st->bindParam(6$operacion->getUserIdUser());
            
$st->execute(); /* linea 54 */
            
$flag TRUE;
            
$st NULL;
            
$cn NULL;
    } catch (
PDOException $ex) {
            throw 
$ex;
    }
            return 
$flag;

    } 

no se si se puede tener mas de un setAttribute en la conexion

Código PHP:
// es un singleton
    
public static function getInstance()
    {
       if (
self::$_instance == null) {

            try {
            
self::$_instance = new PDO(self::$_urlself::$_userself::$_password);
                
self::$_instance->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
           
                
self::$_instance->setAttribute(PDO::ATTR_CASEPDO::CASE_LOWER);
                         
self::$_instance->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);

                        } catch (
PDOException $ex) {
                
self::$_instance null;
                throw 
$ex;
            }
        }

           return 
self::$_instance;
    } 
  #7 (permalink)  
Antiguo 27/01/2011, 21:25
Avatar de Drknow  
Fecha de Ingreso: febrero-2008
Mensajes: 121
Antigüedad: 16 años, 10 meses
Puntos: 1
Exclamación Respuesta: Fatal error: limpiar buffer de consulta PDO

quite los setAttribute

y solo agregue
$cn->setAttribute(PDO_MYSQL_ATTR_USE_BUFFERED_QUERY, 1);

todo ok, pero me muestra esto

Fatal error: Call to a member function fetch() on a non-object in C:\www\webs\GestRecHuman\persistencia\Departamento DAOMySQL.php on line 18

Código PHP:

 
public function getAllDepartamentos()
    {
        
$departamentos = array();
        
$query 'CALL SPgetAllDepartamentos()';
    try {
            
$cn ConnectionManager::getInstance();
            
$rs $cn->query($query);
                while (
$dep $rs->fetch(PDO::FETCH_OBJ)) { // aqui el error
                    
$departamentos[] = new Departamento($dep->deptno,$dep->dname,$dep->loc);

                }
                    
$rs->closeCursor();
                    
$cn NULL;
    } catch (
PDOException $ex) {
            throw 
$ex;
    }
            return 
$departamentos;

    } 

Etiquetas: buffer, fatal, limpiar, 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 00:48.