Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Error al usar PDO - beginTransaction

Estas en el tema de Error al usar PDO - beginTransaction en el foro de PHP en Foros del Web. Hola ha todos como están verán estoy tratando de hacer una Transaccion con PDO pero me muestra el siguiente error @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver ...
  #1 (permalink)  
Antiguo 21/03/2016, 12:38
 
Fecha de Ingreso: abril-2015
Mensajes: 304
Antigüedad: 9 años
Puntos: 2
Error al usar PDO - beginTransaction

Hola ha todos como están verán estoy tratando de hacer una Transaccion con PDO pero me muestra el siguiente error
Código PHP:
Ver original
  1. 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.NULL
mi consulta es la siguiente
Código PHP:
Ver original
  1. public static function registrar_seguimiento($nsp_data,$nsp_data_pv) {
  2.         try {
  3.             $cnBD = Conexion::getConexion();
  4.             $cnBD->beginTransaction();
  5.             $query_registrar = $cnBD->prepare('CALL sp_seguimiento_pap_registrar(?,?,?,?,?,?,?,?,?,?)');
  6.             $query_registrar->bindParam(1,$nsp_data["nsp_usuario"],PDO::PARAM_INT,11);
  7.             $query_registrar->bindParam(2,date("Y-m-d",strtotime($nsp_data["nsp_fecha_requerimiento"])),PDO::PARAM_STR);
  8.             $query_registrar->bindParam(3,date("Y-m-d",strtotime($nsp_data["nsp_fecha_ultimo_contacto"])),PDO::PARAM_STR);
  9.             $query_registrar->bindParam(4,date("Y-m-d",strtotime($nsp_data["nsp_fecha_proximo_contacto"])),PDO::PARAM_STR);
  10.             $query_registrar->bindParam(5,$nsp_data["nsp_contacto"],PDO::PARAM_INT,11);
  11.             $query_registrar->bindParam(6,$nsp_data["nsp_estatus"],PDO::PARAM_INT,11);
  12.             $query_registrar->bindParam(7,$nsp_data["nsp_actividad"],PDO::PARAM_INT,11);
  13.             $query_registrar->bindParam(8,$nsp_data["nsp_referencia"],PDO::PARAM_INT,11);
  14.             $query_registrar->bindParam(9,$nsp_data["nsp_unidad_negocio"],PDO::PARAM_INT,11);
  15.             $query_registrar->bindParam(10,trim($nsp_data["nsp_observaciones"]),PDO::PARAM_STR,500);
  16.             $query_registrar->execute();
  17.             $result = $query_registrar->fetch(PDO::FETCH_ASSOC);
  18.             if (isset($result["ID"])) {
  19.                 $sql = "INSERT INTO seg_pap_servicio(seg_pap_id,jc_servicio_id,seg_pap_programa_id,seg_pap_programa_fecha,seg_pap_valor_venta) VALUES";
  20.                 for ($ni=0;$ni<count($nsp_data_pv);$ni++){
  21.                     $sql.="(".$result["ID"].",".$nsp_data_pv[$ni]['nsp_programa'].",".$nsp_data_pv[$ni]['nps_campana_programa'].",".$nsp_data_pv[$ni]['nsp_periodo_programa'].",'".$nsp_data_pv[$ni]['nsp_valor_venta']."'),";
  22.                 }
  23.                 $sql = substr($sql,0,strlen($sql)-1);
  24.                 $smt = $cnBD->prepare($sql);
  25.                 $smt->bindParam(1,$result["ID"],PDO::PARAM_INT,11);
  26.                 $smt->bindParam(2,$nsp_data_pv["nsp_programa"],PDO::PARAM_INT,11);
  27.                 $smt->bindParam(3,$nsp_data_pv["nps_campana_programa"],PDO::PARAM_INT,11);
  28.                 $smt->bindParam(4,$nsp_data_pv["nsp_periodo_programa"],PDO::PARAM_INT,11);
  29.                 $smt->bindParam(5,$nsp_data_pv["nsp_valor_venta"],PDO::PARAM_STR);
  30.                 $smt->execute();
  31.             }
  32.             $cnBD->commit();
  33.         } catch (PDOException $e) {
  34.             echo $e->getMessage();
  35.             $cnBD->rollback();
  36.         }
  37.     }
mi SP devuelve el id del ultimo registro insertado ayuda
  #2 (permalink)  
Antiguo 21/03/2016, 13:12
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error al usar PDO - beginTransaction

No sólo te está mostrando el error, también te propones dos soluciones.
Por favor, leerlo completo y trata de comprender la idea:

Cita:
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.NULL
TEn en cuenta que cuando usas transacciones, estas tienen imapcto no sólo en los INSERT, sino en los SELECT, y precisamente te está diciendo que no puedes ejecutar queries mientras el resultado sin completar de obtener de otra todavía está en memoria.
Puedes: 1) Recuperar todo, liberando el buffer de un saque, o 2) poner PDO::MYSQL_ATTR_USE_BUFFERED_QUERYen NULL.

Yo te recomiendo por el momento la primera opción
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 21/03/2016, 14:19
 
Fecha de Ingreso: abril-2015
Mensajes: 304
Antigüedad: 9 años
Puntos: 2
Respuesta: Error al usar PDO - beginTransaction

Si entiendo el mensaje de error lo extraño es que cuando cambio esta linea deja de mostrarse el error
Código PHP:
Ver original
  1. $result = $query_registrar->fetch(PDO::FETCH_ASSOC);
  2. //cuando la cambio ha
  3. $result = $query_registrar->fetchAll(PDO::FETCH_ASSOC);
  4. // que segun la documentacion me devuelve un array y en efecto eso es pero tendira que pasarlo por un while o foreach para recuperar solo el valor de la insercion del SP
es por tal motivo que postee el problema
  #4 (permalink)  
Antiguo 21/03/2016, 15:10
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Error al usar PDO - beginTransaction



Me parece que no estás leyendo el mensaje relamente...
Eso es exactamente lo que te está indicando en él:
Cita:
Consider using PDOStatement::fetchAll().
Tienes que entender que en un contexto transaccional, .fetch() pone el registro en un array, y avanza el puntero una línea, sin hacer una interpretacion de lo que hay en ese punto de avance.. El buffer queda activo.
Por su lado fetchAll(), avanza el puntero hasta el final y sí interpreta que terminó, cerrando el buffer.

NO ES LO MISMO.

En el primer caso, aunque no haya más registros, el buffer no ha sido liberado. En el segundo si. y eso es lo que el error te dice.

Cita:
// que segun la documentacion me devuelve un array y en efecto eso es pero tendira que pasarlo por un while o foreach para recuperar solo el valor de la insercion del SP
¿Y cual es el problema de recorrer ese array? SI .fetchAll devuelve un solo registro, seguirá siendo un solo registro (cosa que puedes verificar sin necesidad de recorrerlo), y puedes acceder a su contenido simplemente invocándolo como array de un solo registro.
No te compliques.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 21/03/2016, 15:48
 
Fecha de Ingreso: abril-2015
Mensajes: 304
Antigüedad: 9 años
Puntos: 2
Respuesta: Error al usar PDO - beginTransaction

Bien entiendo lo cambie ha esto
Código PHP:
Ver original
  1. $result = $query_registrar->fetchAll();
y como resultado por la primera insercion me da como resultado
Código PHP:
Ver original
  1. array(1) {
  2.   [0]=>
  3.   array(2) {
  4.     ["seg_pap_id"]=>
  5.     string(3) "184"
  6.     [0]=>
  7.     string(3) "184"
  8.   }
  9. }
y pues no se si estoy bien lo debarie usar asi
Código PHP:
Ver original
  1. if (isset($result["seg_pap_id"])) {
y pues tal vez me este faltando algo mas ya no me muestra cuando le hago un var_dump
NULL
algo mas me ha de estar faltando
  #6 (permalink)  
Antiguo 21/03/2016, 15:49
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Error al usar PDO - beginTransaction

Si tienes esto:
Código PHP:
Ver original
  1. array(1) {
  2.       [0]=>
  3.       array(2) {
  4.         ["seg_pap_id"]=>
  5.         string(3) "184"
  6.         [0]=>
  7.         string(3) "184"
  8.       }
  9.     }

Debes usar eso:
Código PHP:
Ver original
  1. echo $data[0]['seg_pap_id'];

Recuerda que obtienes un array.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 21/03/2016, 16:47
 
Fecha de Ingreso: abril-2015
Mensajes: 304
Antigüedad: 9 años
Puntos: 2
Respuesta: Error al usar PDO - beginTransaction

bueno ahora lo estoy haciendo asi
Código PHP:
Ver original
  1. $result = $query_registrar->fetchAll();
  2.             if (isset($result[0]["seg_pap_id"])) {
  3.                 $sql = "INSERT INTO seg_pap_servicio(seg_pap_id,jc_servicio_id,seg_pap_programa_id,seg_pap_programa_fecha,seg_pap_valor_venta) VALUES";
  4.                 for ($ni=0;$ni<count($nsp_data_pv);$ni++){
  5.                     $sql.="(".$result[0]["seg_pap_id"].",".$nsp_data_pv[$ni]['nsp_programa'].",".$nsp_data_pv[$ni]['nps_campana_programa'].",".$nsp_data_pv[$ni]['nsp_periodo_programa'].",'".$nsp_data_pv[$ni]['nsp_valor_venta']."'),";
  6.                 }
  7.                 $sql = substr($sql,0,strlen($sql)-1);
  8.                 $smt = $cnBD->prepare($sql);
  9.                 $smt->bindParam(1,$result["seg_pap_id"],PDO::PARAM_INT,11);
  10.                 $smt->bindParam(2,$nsp_data_pv["nsp_programa"],PDO::PARAM_INT,11);
  11.                 $smt->bindParam(3,$nsp_data_pv["nps_campana_programa"],PDO::PARAM_INT,11);
  12.                 $smt->bindParam(4,$nsp_data_pv["nsp_periodo_programa"],PDO::PARAM_INT,11);
  13.                 $smt->bindParam(5,$nsp_data_pv["nsp_valor_venta"],PDO::PARAM_STR);
  14.                 $smt->execute();
  15.             }
pero aun continua el problema creo que me falta algo mas porque aun sigue mostrandose el mismo error pues estuve investigando sobre lo que dice el error y encontre esto
Código PHP:
Ver original
  1. $cnBD = Conexion::getConexion();
  2.             $cnBD->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);
no se donde deberia ir
  #8 (permalink)  
Antiguo 21/03/2016, 17:05
 
Fecha de Ingreso: abril-2015
Mensajes: 304
Antigüedad: 9 años
Puntos: 2
Respuesta: Error al usar PDO - beginTransaction

Muchas Gracias a todos al final pude solucionarlo asi me quedo
Código PHP:
Ver original
  1. public static function registrar_seguimiento($nsp_data,$nsp_data_pv) {
  2.         try {
  3.             $cnBD = Conexion::getConexion();
  4.             $cnBD->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY,true);
  5.             $cnBD->beginTransaction();
  6.             $query_registrar = $cnBD->prepare('CALL sp_seguimiento_pap_registrar(?,?,?,?,?,?,?,?,?,?)');
  7.             $query_registrar->bindParam(1,$nsp_data["nsp_usuario"],PDO::PARAM_INT,11);
  8.             $query_registrar->bindParam(2,date("Y-m-d",strtotime($nsp_data["nsp_fecha_requerimiento"])),PDO::PARAM_STR);
  9.             $query_registrar->bindParam(3,date("Y-m-d",strtotime($nsp_data["nsp_fecha_ultimo_contacto"])),PDO::PARAM_STR);
  10.             $query_registrar->bindParam(4,date("Y-m-d",strtotime($nsp_data["nsp_fecha_proximo_contacto"])),PDO::PARAM_STR);
  11.             $query_registrar->bindParam(5,$nsp_data["nsp_contacto"],PDO::PARAM_INT,11);
  12.             $query_registrar->bindParam(6,$nsp_data["nsp_estatus"],PDO::PARAM_INT,11);
  13.             $query_registrar->bindParam(7,$nsp_data["nsp_actividad"],PDO::PARAM_INT,11);
  14.             $query_registrar->bindParam(8,$nsp_data["nsp_referencia"],PDO::PARAM_INT,11);
  15.             $query_registrar->bindParam(9,$nsp_data["nsp_unidad_negocio"],PDO::PARAM_INT,11);
  16.             $query_registrar->bindParam(10,trim($nsp_data["nsp_observaciones"]),PDO::PARAM_STR,500);
  17.             $query_registrar->execute();
  18.             $result = $query_registrar->fetchAll();
  19.             $query_registrar ->closeCursor(); //Cierro el cursor para continuar con el siguiente insert
  20.             if (isset($result[0]["seg_pap_id"])) {
  21.                 $sql = "INSERT INTO seg_pap_servicio(seg_pap_id,jc_servicio_id,seg_pap_programa_id,seg_pap_programa_fecha,seg_pap_valor_venta) VALUES";
  22.                 for ($ni=0;$ni<count($nsp_data_pv);$ni++){
  23.                     $sql.="(".$result[0]["seg_pap_id"].",".$nsp_data_pv[$ni]['nsp_programa'].",".$nsp_data_pv[$ni]['nps_campana_programa'].",".$nsp_data_pv[$ni]['nsp_periodo_programa'].",'".$nsp_data_pv[$ni]['nsp_valor_venta']."'),";
  24.                 }
  25.                 $sql = substr($sql,0,strlen($sql)-1);
  26.                 $smt = $cnBD->prepare($sql);
  27.                 $smt->bindParam(1,$result[0]["seg_pap_id"],PDO::PARAM_INT,11);
  28.                 $smt->bindParam(2,$nsp_data_pv["nsp_programa"],PDO::PARAM_INT,11);
  29.                 $smt->bindParam(3,$nsp_data_pv["nps_campana_programa"],PDO::PARAM_INT,11);
  30.                 $smt->bindParam(4,$nsp_data_pv["nsp_periodo_programa"],PDO::PARAM_INT,11);
  31.                 $smt->bindParam(5,$nsp_data_pv["nsp_valor_venta"],PDO::PARAM_STR);
  32.                 $smt->execute();
  33.             }
  34.             $cnBD->commit();
  35.         } catch (PDOException $e) {
  36.             echo $e->getMessage();
  37.             $cnBD->rollback();
  38.         }
  39.     }
Graciassssssss

Etiquetas: fecha, mysql, pdo, registro, sql, usar
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 11:02.