Foros del Web » Programando para Internet » PHP »

PHP OO Validar ejecución de un SP en php

Estas en el tema de Validar ejecución de un SP en php en el foro de PHP en Foros del Web. Buenas, Tengo mi clase usuario la cual llama a un Stored Procedure en mysql, me gustaría verificar si se ha ejecutado correctamente. Lo he probado ...
  #1 (permalink)  
Antiguo 06/10/2010, 13:47
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 2 meses
Puntos: 20
Validar ejecución de un SP en php

Buenas,

Tengo mi clase usuario la cual llama a un Stored Procedure en mysql, me gustaría verificar si se ha ejecutado correctamente.

Lo he probado de la siguiente forma pero ni forzando errores en los parametros de entrada me muestra ningún error. Lo único eso sí, que la transacción no se ejecuta.

Probé con try y catch dentro y fuera de la función pero nada, no me muestra ningún error. Sin embargo cuando cojo la consulta y la pongo en la consola mysql si que hay errores.

Código PHP:
Ver original
  1. public function addNewUser($nombre,$usuario,$password,$correo,$pais,$birthday,$sexo,$userReferido){
  2.        
  3.         $this->_nombre=$nombre;
  4.         $this->_usuario=$usuario;
  5.         $this->_password=$password;
  6.         $this->_correo=$correo;
  7.         $this->_pais=$pais;
  8.         $this->_birthday=$birthday;
  9.         $this->_sexo=$sexo;
  10.         $this->_userReferido=$userReferido;
  11.         $this->_userKey = $this->randomKeygen($length=10);
  12.         $this->_ip=getRealIP();
  13.                
  14.         try{
  15.             $query = "CALL sp_nuevoUsuario (:user_login,:user_pass,:user_activation_key,:user_name,:user_mail,:user_birthday,:user_sexo,:user_pais,:ip)";
  16.             $comando = $this->_con->prepare($query);
  17.             $comando->execute(array(':user_login'=>$this->_usuario,
  18.                                     ':user_pass'=>$this->_password,
  19.                                     ':user_activation_key'=>$this->_userKey,
  20.                                     ':user_name'=>$this->_nombre,
  21.                                     ':user_mail'=>$this->_correo,
  22.                                     ':user_birthday'=>$this->_birthday,
  23.                                     ':user_sexo'=>$this->_sexo,
  24.                                     ':user_pais'=>$this->_pais,
  25.                                     ':ip'=>$this->_ip));
  26.         } catch (Exception $e) {
  27.             echo $e->getMessage();
  28.             echo "<br/>Ocurrio un error";
  29.             exit;
  30.         }
  31.     }
  32.  
  33. //Valores de ejemplo (tras rellenar formulario de registro)
  34. $nombre='Dani';
  35. $usuario='neodani';
  36. $password='12345';
  37. $pais='error'; /* FORZANDO EL ERROR SOLO SOPORTA INT */
  38. $birthday='1985-12-21';
  39. $sexo='H';
  40. $userReferido='';
  41.  
  42. try{
  43.     $userTest->addNewUser($nombre,$usuario,$password,$correo,$pais,$birthday,$sexo,$userReferido);
  44. } catch (Exception $e) {
  45.     echo $e->getMessage();
  46.     echo "<br/>Ocurrio un error";
  47.     exit;
  48. }

¿Sabéis cómo debo hacerlo? ¿Hago algo mal?

Muchas gracias de antemano
  #2 (permalink)  
Antiguo 06/10/2010, 14:01
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Validar ejecución de un SP en php

Con PDOStatement::rowCount puedes obtener el número de filas afectadas, si es mayor a 1, la consulta fue éxitosa, si es menor a 1, en ese caso no se insertaron los datos.

Saludos.
  #3 (permalink)  
Antiguo 06/10/2010, 14:35
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 2 meses
Puntos: 20
Respuesta: Validar ejecución de un SP en php

Cita:
Iniciado por GatorV Ver Mensaje
Con PDOStatement::rowCount puedes obtener el número de filas afectadas, si es mayor a 1, la consulta fue éxitosa, si es menor a 1, en ese caso no se insertaron los datos.

Saludos.
Lo probé y esté bien el SP o no, siempre me retorna 0

Puede ser porque se trata de un Stored Procedure?

o puede ser un bug por la versión de PHP 5.3.0 que tengo instalada?
http://ubuntuforums.org/showthread.php?t=1131203
http://efreedom.com/Question/1-76976...orking-PHP-526

Muchas gracias de antemano
  #4 (permalink)  
Antiguo 06/10/2010, 15:13
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Validar ejecución de un SP en php

Desconozco cual pueda ser la razón.

Saludos.
  #5 (permalink)  
Antiguo 07/10/2010, 12:23
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 2 meses
Puntos: 20
Respuesta: Validar ejecución de un SP en php

Buenas,

Tras varias pruebas empiracas he podido comprobar que el problema es del Stored Procedure, ya que con consultas normales si que funciona.

Código PHP:
Ver original
  1. <?php
  2. require_once('BD/DB_config_reader.class.php');
  3. require_once('BD/MyPDO.class.php');
  4. require_once('BD/Registry.class.php');
  5.  
  6. $db_master = dbFactory::create('BD/bd_master.ini');
  7. //$query = "SELECT pais_id, pais FROM tbl_paises";
  8. //$query = "INSERT INTO tbl_paises (pais) VALUES ('maravillas')";
  9. $query = "CALL sp_nuevoUsuario ('dani999','12345','asfasfs','Juanito','[email protected]','1985-2-3','H',70,'129.65.54.61')";
  10. $comando = $db_master->prepare($query);
  11. $comando->execute();
  12. echo $comando->rowCount();
  13.  
  14. ?>

Os muestro el SP, por si me podéis decir si es culpa de algo del código

Código SQL:
Ver original
  1. DELIMITER $$
  2.  
  3. DROP PROCEDURE IF EXISTS `mentes_estrategas`.`sp_nuevoUsuario` $$
  4. CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_nuevoUsuario`(
  5.   IN vuser_login VARCHAR(25),
  6.   IN vuser_pass VARCHAR(30),
  7.   IN vuser_activation_key VARCHAR(40),
  8.   IN vuser_name VARCHAR(30),
  9.   IN vuser_mail VARCHAR(45),
  10.   IN vuser_birthday DATE,
  11.   IN vuser_sexo CHAR(1),
  12.   IN vuser_pais SMALLINT,
  13.   IN vip_registro VARCHAR(15))
  14. BEGIN
  15.  
  16. START TRANSACTION;
  17.  
  18.   INSERT INTO tbl_user(
  19.     user_login,
  20.     user_pass,
  21.     user_activation_key)
  22.   VALUES(
  23.     vuser_login,
  24.     vuser_pass,
  25.     vuser_activation_key);
  26.  
  27.   INSERT INTO tbl_user_personal(
  28.     user_id,
  29.     user_name,
  30.     user_mail,
  31.     user_birthday,
  32.     user_sexo,
  33.     user_pais)
  34.   VALUES (
  35.     (SELECT LAST_INSERT_ID()),
  36.     vuser_name,
  37.     vuser_mail,
  38.     vuser_birthday,
  39.     vuser_sexo,
  40.     vuser_pais);
  41.  
  42.   INSERT INTO tbl_registro (
  43.     user_id,
  44.     fecha_registro,
  45.     ip_registro)
  46.   VALUES (
  47.     (SELECT LAST_INSERT_ID()),
  48.     NOW(),
  49.     vip_registro);
  50.  
  51. COMMIT;
  52.  
  53. END $$
  54.  
  55. DELIMITER ;

¿Alguien puede probar si con la clase PDO al ejecutar un SP luego cuando hace un rowCount() si le funciona bien, y aparece un número > 0?

Ya no se que más mirar :S

Muchas gracias de antemano
  #6 (permalink)  
Antiguo 07/10/2010, 14:20
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 2 meses
Puntos: 20
Respuesta: Validar ejecución de un SP en php

Creo que ya sé porqué no funciona el echo $comando->rowCount(); tras un Stored Procedure, y es que si lo ejecuto en la consola mysql me dice

No resultset returned

Por eso cuando cuento las filas afectadas me dice siempre 0.

¿Puede ser esto no? Se os ocurre alguna solución?

Muchas gracias de antemano!
  #7 (permalink)  
Antiguo 07/10/2010, 16:01
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 21 años
Puntos: 60
Respuesta: Validar ejecución de un SP en php

Yo cuando hago un SP retorno el ultimo Registro insertado despues del Commit

Código PHP:
COMMIT;
select LAST_INSERT_ID() as lastInsert
Y tu condición la haces con esto

Código PHP:
$valor $comando->fetchAll();
$valor[0]['lastInsert'//Aqui contiene el ID insertado o bien un 0 o indefinido sino se inserta nada en la DB 
__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador
  #8 (permalink)  
Antiguo 08/10/2010, 10:03
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 2 meses
Puntos: 20
Respuesta: Validar ejecución de un SP en php

Cita:
Iniciado por _ssx Ver Mensaje
Yo cuando hago un SP retorno el ultimo Registro insertado despues del Commit

Código PHP:
COMMIT;
select LAST_INSERT_ID() as lastInsert
Y tu condición la haces con esto

Código PHP:
$valor $comando->fetchAll();
$valor[0]['lastInsert'//Aqui contiene el ID insertado o bien un 0 o indefinido sino se inserta nada en la DB 
Gracias _ssx, esa era mi plan B, realizar una consulta a ver si el usuario se había insertado correctamente.

Pero despues de probar y probar, he descubierto porque no me mostraba ninguna excepción el try y catch y era porque no había definido los atributos del PDO

$db_master->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


Código PHP:
Ver original
  1. <?php
  2. require_once('BD/DB_config_reader.class.php');
  3. require_once('BD/MyPDO.class.php');
  4. require_once('BD/Registry.class.php');
  5.  
  6. $db_master = dbFactory::create('BD/bd_master.ini');
  7. $db_master->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  8.  
  9. try {
  10.     $query = "CALL sp_nuevoUsuario ('dani999','12345','asfasfs','Juanito','[email protected]','1985-2-3','H',70,'129.65.54.61')";
  11.     $comando = $db_master->prepare($query);
  12.     $comando->execute();
  13. }
  14. catch (Exception $e) {
  15.     // Mostrar si algo ha emitido una excepción en nuestro bloque
  16.     echo '<p>No se ha podido completar la transacción</p>';
  17.     echo $e->getMessage();
  18. }
  19.  
  20. ?>

Saludos!

Etiquetas: Ninguno
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:35.