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

excepcion en pdo

Estas en el tema de excepcion en pdo en el foro de Frameworks y PHP orientado a objetos en Foros del Web. hola amigos tengo la siguiente situacion necesito mostrar un mensaje de error con la siguiente funcion me conecto a la base de datos y cuando ...
  #1 (permalink)  
Antiguo 31/10/2012, 09:19
 
Fecha de Ingreso: septiembre-2010
Mensajes: 1.853
Antigüedad: 14 años, 2 meses
Puntos: 6
excepcion en pdo

hola amigos tengo la siguiente situacion

necesito mostrar un mensaje de error con la siguiente funcion me conecto a la base de datos y cuando ingreso mal el usuario ya la calve observo el error ose que estoy capturando bien la excepcion hasta ahi todo bien .

Código PHP:
Ver original
  1. public function conectar(){
  2.  
  3.     $usuario = $_POST['usuario'];
  4.     $contrasenia = $_POST['clave'];
  5.  
  6.                
  7.             try {
  8.                  $db = new PDO('pgsql:host=localhost;dbname=volcanoes',$usuario,$contrasenia);
  9.                 }catch(PDOException $e) {
  10.                 //echo $e->getMessage();
  11.                 echo "Usuario y Clave Invalidas";
  12.                 }
  13.                
  14.                 return $db;
  15.         }



ahora requiero caputar la excepcion en
Código PHP:
Ver original
  1. $consulta = $db->prepare("select usu_usuario, usu_clave from usuarios where usu_usuario='$usuario' and usu_clave='$clave' and usu_estado = 1");
  2.             $consulta->execute();
aprosito no envie ningun valor y me aparece el siguiente error

Fatal error: Call to a member function prepare() on a non-object in C:\websites\volcanicos\models\login_Model.php on line 16

y la linea 16 es $consulta = $db->prepare("select ussuario, usu_clave from usuar ....


Código PHP:
Ver original
  1. class Login
  2.     {
  3.        
  4.            
  5.         /*----  Validar Usuarios -----------------------------------------*/
  6.         public function validate_users($db)
  7.         {
  8.        
  9.             $usuario = $_POST['usuario'];
  10.             $clave = $_POST['clave'];
  11.            
  12.                
  13.             $consulta = $db->prepare("select usu_usuario, usu_clave from usuarios where usu_usuario='$usuario' and usu_clave='$clave' and usu_estado = 1");
  14.             $consulta->execute();
  15.            
  16.             $count = $consulta->rowCount();
  17.  
  18.            
  19.            
  20.             while($fila = $consulta->fetch())
  21.             {
  22.            
  23.             $_SESSION['nombre'] = $_POST['usuario'];
  24.             $_SESSION['clave'] = $_POST['clave'];
  25.  
  26.             header("Refresh: 0; URL=/volcanicos/");
  27.             die();
  28.            
  29.             }
  30.            
  31.    
  32.            
  33.              if (!$this->consulta)
  34.                 {
  35.                     $_SESSION['invalidate_user'] = true;
  36.                 }
  37.                
  38.         }
  39. }

por si los datos enviados por post estan vacios utilizo

if (empty($usuario) || empty($clave)) {
echo "No ingreso el Usuario y Contraseña";
}else{.....

como y donde debo de capturar la excepcion , me interesa $consulta = $db->prepare(......

Última edición por Montes28; 31/10/2012 a las 09:44
  #2 (permalink)  
Antiguo 31/10/2012, 10:14
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: excepcion en pdo

Pues en tu bloque catch() ya estas capturando la excepción...
  #3 (permalink)  
Antiguo 31/10/2012, 10:30
 
Fecha de Ingreso: septiembre-2010
Mensajes: 1.853
Antigüedad: 14 años, 2 meses
Puntos: 6
Respuesta: excepcion en pdo

GatorV el error es cuando no se puede realizar la consulta por que los parametros no cumplen

Usuario y Clave Invalidas
Fatal error: Call to a member function prepare() on a non-object in C:\websites\volcanicos\models\login_Model.php on line 21

esta es la linea
$consulta = $db->prepare("select ussuario, usu_clave from usuarios where ussuario='$usuario' and usu_clave='$clave' and usu_estado = 1");
  #4 (permalink)  
Antiguo 31/10/2012, 10:41
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: excepcion en pdo

Pues sí, ya que cachas la excepción y no haces nada más que imprimir un mensaje y aún así regresas el objeto $db que es nulo.

El problema es tú código, tienes que agregar un chequeo antes de usar el objeto $db para que verifiques si es diferente de nulo.
  #5 (permalink)  
Antiguo 31/10/2012, 11:12
 
Fecha de Ingreso: septiembre-2010
Mensajes: 1.853
Antigüedad: 14 años, 2 meses
Puntos: 6
Respuesta: excepcion en pdo

Código PHP:
Ver original
  1. public function conectar(){
  2.  
  3.                 $usuario = $_POST['usuario'];
  4.                 $contrasenia = $_POST['clave'];
  5.  
  6.                
  7.             try {
  8.                  $db = new PDO('pgsql:host=localhost;dbname=volcanoes',$usuario,$contrasenia);
  9.                 }catch(PDOException $e) {
  10.                 //echo $e->getMessage();
  11.                 echo "Usuario y Clave Invalidas";
  12.                 }
  13.                
  14.                 return $db;
  15.         }

Código PHP:
Ver original
  1. if (empty($db)) {
  2.                echo "Consulta fallida";
  3.         }

pero no se como colocar el el try
  #6 (permalink)  
Antiguo 31/10/2012, 11:16
Avatar de abimex
Colaborador
 
Fecha de Ingreso: marzo-2007
Ubicación: ~
Mensajes: 751
Antigüedad: 17 años, 8 meses
Puntos: 137
Respuesta: excepcion en pdo

Código PHP:
Ver original
  1. try {
  2.   $db = new PDO('pgsql:host=localhost;dbname=volcanoes',$usuario,$contrasenia);
  3. }catch(PDOException $e) {
  4.   throw new Exception("Usuario y Clave Invalidas");
  5. }
Ahi lanzas la excepcion con tu mensaje, o simplemente puedes hacer un die
  #7 (permalink)  
Antiguo 31/10/2012, 11:21
 
Fecha de Ingreso: septiembre-2010
Mensajes: 1.853
Antigüedad: 14 años, 2 meses
Puntos: 6
Respuesta: excepcion en pdo

abimex gracias por responder pero obtengo este error

Fatal error: Uncaught exception 'Exception' with message 'Usuario y Clave Invalidas' in C:\websites\volcanicos\models\conexion.php:22 Stack trace: #0 C:\websites\volcanicos\controllers\login_Controlle r.php(18): Conexion->conectar() #1 C:\websites\volcanicos\index.php(64): login_users() #2 {main} thrown in C:\websites\volcanicos\models\conexion.php on line 22

la linea 22 es esta
Código PHP:
Ver original
  1. throw new Exception("Usuario y Clave Invalidas");
  #8 (permalink)  
Antiguo 31/10/2012, 11:22
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: excepcion en pdo

¿pero cual es el caso de cachar la excepción para mandar otra? Eso lo que hace es romper con todo el trace, si lo quieres hacer así al menos pasa la excepción para no perder la original:
Código PHP:
Ver original
  1. try {
  2. * $db = new PDO('pgsql:host=localhost;dbname=volcanoes',$usuario,$contrasenia);
  3. }catch(PDOException $e) {
  4. * throw new Exception("Usuario y Clave Invalidas", 0, $e);
  5. }

Saludos.
  #9 (permalink)  
Antiguo 31/10/2012, 11:28
 
Fecha de Ingreso: septiembre-2010
Mensajes: 1.853
Antigüedad: 14 años, 2 meses
Puntos: 6
Respuesta: excepcion en pdo

GatorV hice lo que indicas y obtengo este error

SQLSTATE[08006] [7] FATAL: la autentificaci�n password fall� para el usuario �gggggg�
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[08006] [7] FATAL: la autentificaci�n password fall� para el usuario �gggggg�' in C:\websites\volcanicos\models\conexion.php:20 Stack trace: #0 C:\websites\volcanicos\models\conexion.php(20): PDO->__construct('pgsql:host=loca...', 'gggggg', 'hoe798cs') #1 C:\websites\volcanicos\controllers\login_Controlle r.php(18): Conexion->conectar() #2 C:\websites\volcanicos\index.php(64): login_users() #3 {main} Next exception 'Exception' with message 'Usuario y Clave Invalidas' in C:\websites\volcanicos\models\conexion.php:25 Stack trace: #0 C:\websites\volcanicos\controllers\login_Controlle r.php(18): Conexion->conectar() #1 C:\websites\volcanicos\index.php(64): login_users() #2 {main} thrown in C:\websites\volcanicos\models\conexion.php on line 25
  #10 (permalink)  
Antiguo 31/10/2012, 12:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: excepcion en pdo

Sí, así no pierdes la excepción original al "cacharla" y agregar una excepción nueva.
  #11 (permalink)  
Antiguo 31/10/2012, 12:39
 
Fecha de Ingreso: septiembre-2010
Mensajes: 1.853
Antigüedad: 14 años, 2 meses
Puntos: 6
Respuesta: excepcion en pdo

GatorV pero te entiendo , hago lo que me indicas y obtengo un errro en del mensaje" lugar de Usuario y Clave Invalidas"

Código PHP:
Ver original
  1. public function conectar(){
  2.  
  3.                 $usuario = $_POST['usuario'];
  4.                 $contrasenia = $_POST['clave'];
  5.  
  6.                
  7.             try {
  8.                  $db = new PDO('pgsql:host=localhost;dbname=volcanoes',$usuario,$contrasenia);
  9.                  
  10.                 }catch(PDOException $e) {
  11.                 echo $e->getMessage();
  12.                 //echo "Usuario y Clave Invalidas";
  13.                 throw new Exception("Usuario y Clave Invalidas", 0, $e);
  14.                 }
  15.                
  16.    
  17.                 return $db;
  18.         }


Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[08006] [7] FATAL: la autentificaci�n password fall� para el usuario �sasasasas�' in C:\websites\volcanicos\models\conexion.php:20 Stack trace: #0 C:\websites\volcanicos\models\conexion.php(20): PDO->__construct('pgsql:host=loca...', 'sasasasas', 'hoe798cs') #1 C:\websites\volcanicos\controllers\login_Controlle r.php(18): Conexion->conectar() #2 C:\websites\volcanicos\index.php(64): login_users() #3 {main} Next exception 'Exception' with message 'Usuario y Clave Invalidas' in C:\websites\volcanicos\models\conexion.php:25 Stack trace: #0 C:\websites\volcanicos\controllers\login_Controlle r.php(18): Conexion->conectar() #1 C:\websites\volcanicos\index.php(64): login_users() #2 {main} thrown in C:\websites\volcanicos\models\conexion.php on line 25

linea 25
Código PHP:
Ver original
  1. throw new Exception("Usuario y Clave Invalidas", 0, $e);
  #12 (permalink)  
Antiguo 31/10/2012, 12:47
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: excepcion en pdo

Claro, yo solo indicaba que lo que dice @abimex de cachar y volver a lanzar con otra excepción no es correcto, ya que pierdes la excepción original y la traza.

Lo correcto es (si vas a cachar/re-lanzar) es incluir la excepción original, así se hace más fácil el debug.

Respecto a tu error, pues es un error de diseño de tu aplicación, ya te indique que debes de comparar el resultado de tu función conectar antes de intentar enviar el objeto a otra clase, puedes usar un if() para comparar el resultado de tu función y en base a eso decidir si entras al segundo bloque o muestras un mensaje de error.

Saludos.
  #13 (permalink)  
Antiguo 31/10/2012, 13:10
 
Fecha de Ingreso: septiembre-2010
Mensajes: 1.853
Antigüedad: 14 años, 2 meses
Puntos: 6
Respuesta: excepcion en pdo

GatorV gracias por ayudarme , y disculpa por mi poco conocimiento , pero intentando creo que seria algo asi


Código PHP:
Ver original
  1. public function conectar(){
  2.  
  3.                 $usuario = $_POST['usuario'];
  4.                 $contrasenia = $_POST['clave'];
  5.  
  6.                
  7.             try {
  8.                  $db = new PDO('pgsql:host=localhost;dbname=volcanoes',$usuario,$contrasenia);
  9.                  
  10.                 }catch(PDOException $e) {
  11.                 //echo $e->getMessage();
  12.                 echo "Usuario y Clave Invalidas";
  13.                 //throw new Exception("Usuario y Clave Invalidas", 0, $e);
  14.                 }
  15.                
  16.                 if (empty($db)){
  17.                     echo "vacio";
  18.                     }else{
  19.    
  20.                 return $db;
  21.         }
  22.         }

me corrigues por favor

gracias

saludos
  #14 (permalink)  
Antiguo 31/10/2012, 13:28
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: excepcion en pdo

No, la validación tienes que hacerla antes de intentar usar el objeto en tus otras funciones. ¿Haz hecho el diagrama de flujo de tu sistema? Tienes que hacerlo antes de programar tu sistema, a grandes rasgos tiene que ser así:

- Inicio de tu Programa
- Recoges variables de entrada
- Validas usuario / contraseña
- ¿Es correcto?
+ Muestras Perfil
- Else
+ Muestras mensaje de error
- Fin
  #15 (permalink)  
Antiguo 31/10/2012, 13:29
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: excepcion en pdo

En Pseudocódigo:
Código:
leer(usuario)
leer(pass)
if (loginUsuario(usuario, pass) {
       mostrarPerfil(usuario)
} else {
       mostrarError("usuario contraseña incorrectos")
}
  #16 (permalink)  
Antiguo 31/10/2012, 13:46
 
Fecha de Ingreso: septiembre-2010
Mensajes: 1.853
Antigüedad: 14 años, 2 meses
Puntos: 6
Respuesta: excepcion en pdo

creo que tendria que realizar esta validacion en esta funcion pero me cuenta un poco realizarla


Código PHP:
Ver original
  1. function login_users()
  2.    
  3.     {
  4.    
  5.           require 'models/conexion.php';       
  6.           require 'models/login_Model.php';
  7.    
  8.        if($_POST)
  9.         {
  10.              
  11.  
  12.               $lc=new Conexion();
  13.               $db = $lc -> conectar();
  14.                
  15.                
  16.                            
  17.               $ls = new Login();
  18.               $ls -> validate_users($db);
  19.  
  20.         }
  21.        
  22.         require 'views/login.php';
  23.     }
  #17 (permalink)  
Antiguo 31/10/2012, 13:49
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: excepcion en pdo

Así es, es en ese sitio donde debes de realizar la validación antes de intentar usar el objeto PDO.

Saludos.
  #18 (permalink)  
Antiguo 31/10/2012, 13:55
 
Fecha de Ingreso: septiembre-2010
Mensajes: 1.853
Antigüedad: 14 años, 2 meses
Puntos: 6
Respuesta: excepcion en pdo

lo realize de la siguiente manera , funciona pero el problema es que muestra el error pero regreesa al formulario login ,me gustaria que solo quedara un mensaje de errror

Código PHP:
Ver original
  1. function login_users()
  2.    
  3.     {
  4.    
  5.           require 'models/conexion.php';       
  6.           require 'models/login_Model.php';
  7.    
  8.        if($_POST)
  9.         {
  10.              
  11.  
  12.  
  13.               $lc=new Conexion();
  14.               $db = $lc -> conectar();
  15.                
  16.               if (empty($db)){
  17.              
  18.                             header("Refresh: 0; URL=/volcanicos/");
  19.             die();
  20.                 }else{             
  21.               $ls = new Login();
  22.               $ls -> validate_users($db);
  23.                 }
  24.         }
  25.        
  26.         require 'views/login.php';
  27.     }
  #19 (permalink)  
Antiguo 31/10/2012, 14:35
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: excepcion en pdo

Pues quita el header...

Etiquetas: excepcion, pdo, usuarios
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 19:09.