Foros del Web » Programando para Internet » PHP »

Problema con funcion casera

Estas en el tema de Problema con funcion casera en el foro de PHP en Foros del Web. buenas gentes, veran, cree una funcion para reemplazar a mysqli_multi_query() ya que esta no me sirve como trabaja para lo que yo nesesito, las tablas ...
  #1 (permalink)  
Antiguo 29/11/2012, 09:23
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 7 meses
Puntos: 320
Pregunta Problema con funcion casera

buenas gentes, veran, cree una funcion para reemplazar a mysqli_multi_query() ya que esta no me sirve como trabaja para lo que yo nesesito, las tablas mysql son innobdb y mi problema es con el tema del commit y el rollback que no logro que anden :

la funcion que hise es esta:

Código PHP:
Ver original
  1. Function Mysqli_Query_Multi($CXNMYSQL,$CON){
  2.         $EST = 'OK';       
  3.         $CON = Trim($CON);
  4.         If (Substr($CON,-1) == ';') { $CON = Substr($CON,0,-1); }
  5.         Mysqli_Query($CXNMYSQL,'START TRANSACTION;');      
  6.         Foreach ($CON As $POS => $INS) {
  7.             $RES[$POS] = Mysqli_Query($CXNMYSQL,$INS);
  8.             If (!$RES[$POS]) { $EST = 'BAD'; }
  9.         }
  10.         If ($EST == 'BAD') {
  11.             Mysqli_Query($CXNMYSQL,'ROLLBACK');
  12.             $RES = False;
  13.         } Else {
  14.             Mysqli_Query($CXNMYSQL,'COMMIT');
  15.         }
  16.         Return($RES);
  17.     }
recibe la conexion ya hecha a la base de datos, y el grupo de consultas separadas por ; como es habitual.

el resultado seria "OK" o "BAD" segun el estado de las transacciones, y en caso de ser "BAD" deveria revertir (con rollback) las transacciones. el problema que tengo es que si hay algun error en una consulta, las demas se ejecutan. cuando deverian revertirse todas alguna ayudita?
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #2 (permalink)  
Antiguo 29/11/2012, 09:28
Avatar de mauled  
Fecha de Ingreso: marzo-2005
Ubicación: Cd. de México.
Mensajes: 3.001
Antigüedad: 19 años, 9 meses
Puntos: 33
Respuesta: Problema con funcion casera

Pues lo que haría es ya no seguir ejecutando el foreach en caso de que alla habido un problema.
Código PHP:
foreach //...
$RES[$POS] = Mysqli_Query($CXNMYSQL,$INS);
 If (!
$RES[$POS]) 

  
$EST 'BAD';
   break; 
// salimos de foreach

Saludos.
  #3 (permalink)  
Antiguo 29/11/2012, 09:38
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 7 meses
Puntos: 320
Respuesta: Problema con funcion casera

hola mauled, gracias por tu respuesta, ya he agregado el break que en efecto ayuda mucho si el error ocurre a mitad del ciclo, pero si la consulta que falla es la ultima, no se revierten las anteriores, y si falla en el medio tampoco se revierten las primeras que ejecuto :( ese es el problema que tengo
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #4 (permalink)  
Antiguo 29/11/2012, 10:01
Avatar de mauled  
Fecha de Ingreso: marzo-2005
Ubicación: Cd. de México.
Mensajes: 3.001
Antigüedad: 19 años, 9 meses
Puntos: 33
Respuesta: Problema con funcion casera

Pues debería de hacerlo. mmm dentro de tu variable $CON es donde traes tu "queries"? o mandas a ejecutar esta función varias veces?
  #5 (permalink)  
Antiguo 29/11/2012, 10:17
Avatar de h2swider  
Fecha de Ingreso: julio-2007
Ubicación: Ciudad de Buenos Aires
Mensajes: 932
Antigüedad: 17 años, 4 meses
Puntos: 194
Respuesta: Problema con funcion casera

El problema es que envias y ejecutas una consulta a la vez. Es natural que no puedas corregir lo anterior. $CXNMYSQL deberia ser un array de querys, y entonces ir ejecutando una a una, y recien al final luego de haber ejecutado todas, tirar el commit o el Rollback, me explico?
__________________
Codifica siempre como si la persona que finalmente mantedra tu código sea un psicópata violento que sabe donde vives
  #6 (permalink)  
Antiguo 29/11/2012, 10:21
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 11 meses
Puntos: 845
Respuesta: Problema con funcion casera

Intenta seteando a false el autocommit http://www.php.net/manual/en/mysqli.autocommit.php y ten cuidado con el nombre de las funciones, el case te va a dar problemas en sistemas *nix.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #7 (permalink)  
Antiguo 29/11/2012, 11:11
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 7 meses
Puntos: 320
Respuesta: Problema con funcion casera

h2swider y mauled en $CON llega x ejemplo:

INSERT INTO ..... ; UPDATE table SET ....; INSERT INTO ..... ; UPDATE table SET .... ; DELETE FROM ...... ;

y asi separadas por ; varias juntas en un solo string, por eso las separo por ; y luego hago un for. agradesco sus respuestas y la solucion la encontre con el link de masterpuppet y un poco mas de conocimiento de Mysqli XD aqui dejo la funcion que anda de 10 por si alguien le interesa:

Código PHP:
Ver original
  1. Function Mysqli_Query_Multi($CXNMYSQL,$CON){
  2.         $EST = 'OK';       
  3.         $CON = Trim($CON);
  4.         If (Substr($CON,-1) == ';') { $CON = Substr($CON,0,-1); }
  5.         Mysqli_Autocommit($CXNMYSQL, False);       
  6.         Foreach ($CON As $POS => $INS) {
  7.             $RES[$POS] = Mysqli_Query($CXNMYSQL,$INS);
  8.             If (!$RES[$POS]) { $EST = 'BAD'; Break; }
  9.         }
  10.         If ($EST == 'BAD') {
  11.             Mysqli_Rollback($CXNMYSQL);
  12.             $RES = False;
  13.         } Else {
  14.             Mysqli_Commit($CXNMYSQL);
  15.         }
  16.         Return($RES);
  17.     }

la ventaja de usarla frente a la nativa, es que esta si todo sale bien devuelve un array de resultados, y se pueden hacer varios select sin relacion entre ellos en simultaneo y luego trbajarlos por un subindice (que es para lo que la uso ) gracias a todos.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Etiquetas: casera, funcion, mysql, sql, tabla
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 14:10.