PHP - No me muestra los mensajes de error

 
Vista:
sin imagen de perfil
Val: 68
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

No me muestra los mensajes de error

Publicado por raquel (27 intervenciones) el 27/06/2020 14:12:47
Muy buenas gente! Tengo un formulario de login sencillito, y estoy tratando de que me muestre los errores de error, como por ejemplo si se presiona el boton "login" sin introducir ningun campo, que aparezca un mensajito diciendo "campos requeridos".
En realidad me muestra los mensajes que saco con un "echo" pero quiero que me los muestre del array que tengo declarado para la variable $errors.

Este es el código del formulario:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<div class="container" style="padding:30px; margin:30px">
	<div class="row">
		<div class="col-md-4 offset-md-4 ">
 
			<h3> FORMULARIO DE LOGIN </h3>
			<form action="acceder.php" name="login" id="login" method="POST" enctype="multipart/form-data" autocomplete="off">
 
		<?php
			$errors = array();
			$contra="";
			$correo="";
			echo "1";
			if(count($errors)>0):
				echo "2"; ?>
				<div class="alert alert-danger">
 
				<?php foreach($errors as $error): ?>
					<li><?php echo $error; ?></li>
				<?php endforeach; ?>
				</div>
		<?php endif; ?>
 
 
 
				<div class="form-group row">
					<label for="email" class="col-sm-2 col-form-label">Email</label>
					<div class="col-sm-10">
					    <input type="email" class="form-control" id="email" name="email"  placeholder="Email" >
					    <!--value="<?php//echo $correo; ?>"-->
					    <span id="Mail_error"></span>
					</div>
				</div>
 
 
				<div class="form-group row">
					<label for="password" class="col-sm-2 col-form-label">Password</label>
					<div class="col-sm-10">
					    <input type="password" class="form-control" id="pwd1" name="pwd1" placeholder="Password" >
					    <span id="Clave1_error"></span>
					</div>
				</div>
 
				<div class="form-group my-3">
					<button type="submit" class="btn btn-outline-primary" id="btn" name="login">Login</button>
				</div>
 
				<a href="recupera.php">Forgot your password?</a>
 
			</form>
		</div>
	</div>
</div>

Y este el .php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<?php
 
ob_start();
session_start();
require_once("conexion.php");
 
$errors = array();
 
if(isset($_POST['login'])){
 
 
	$correo=$_POST['email'];
	$contra=$_POST['pwd1'];
 
	if(empty($_POST['email']) || empty($_POST['pwd1'])) {
		echo "3";
		$errors['email'] = "Campo requerido";
		$errors['pwd1'] = "Campo requerido";
 
	}else{
 
 
		$sql = "SELECT * FROM usuario WHERE email=:email LIMIT 1" ;
		$resultado_consulta = $pdo->prepare($sql);
		$resultado_consulta->bindParam(":email",$correo, PDO::PARAM_STR);
		$resultado_consulta->execute();
		$resultado = $resultado_consulta->fetch(PDO::FETCH_ASSOC);
		$user = $resultado_consulta->rowCount();
 
 
 
		if($user>0){
 
			if(password_verify($contra, $resultado['clave'])){
 
 
				$_SESSION['id_usuario'] = $user['id_usuario'];
				$_SESSION['nombre'] = $user['nombre'];
				$_SESSION['email'] = $user['email'];
				$_SESSION['verified'] = $user['verified'];
 
				//set flash message
 
				$_SESSION['message']= "Está logueado!";
				$_SESSION['alert-class'] = "alert-success";
 
				header('location: homepage.php');
				exit();
 
				//header('location:dashboard.php');
				//echo "login correcto";
 
			}else{
				/*echo "
			        <div class='container'>
			            <div class='row'>
			                <div class='col-md-6 offset-3'>
			                    <div class='alert alert-danger text-center' role='lert'>
			                        Contraseña Incorrecta.<br /><a href='registro2.php' class='alert-link'>Volver</a>.
			                    </div>
			                </div>
			            </div>
			        </div>
			        ";*/
			    $errors['login_fail'] = "Contraseña Incorrecta";
			    echo "<a href='login.php' class='alert-link'>Volver</a>";
 
			}
 
		}else{
			$errors['login-fail'] = "El usuario no existe";
			/*echo "
		        <div class='container'>
		            <div class='row'>
		                <div class='col-md-6 offset-3'>
		                    <div class='alert alert-danger text-center' role='lert'>
		                        El usuario no existe.<br /><a href='registro2.php' class='alert-link'>Volver</a>.
		                    </div>
		                </div>
		            </div>
		        </div>
		        ";*/
		}
 
	}
 
 
 
 
}
 
 
 
ob_end_flush();
?>

He marcado con unos "echo" para comprobar lo que imprime y lo que no, y en el archivo .php me imprime el echo "3", pero yo quisiera que los errores me los imprimiera en la pagina del formulario, donde se encuentra el echo "2".
No sé que estoy haciendo mal pero no hay manera de que me muestre ningún error ahí. Me podeis echar un cable??
Mil gracias!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Álvaro
Val: 106
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

No me muestra los mensajes de error

Publicado por Álvaro (12 intervenciones) el 27/06/2020 17:34:37
Buenas Raquel. Para estos casos te recomiendo usar JS para ver mejor los fallos, y para separar mejor el back del frontend. También estoy realizando un proyecto, pero en Laravel, y las 'validaciones' para mostrar los fallos al usuario lo hago con jquery. Te dejo un ejemplo para que lo veas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
function check_username() {
 
    if ($('#username').val().length === 0) {
 
        $('#userValidate').html('El nombre de usuario es obligatorio').css('color', 'red');
        $('#username').css('border-color', 'red');
 
 
    } else {
 
        if ($('#username').val().length < 5) {
 
            $('#userValidate').html('El nombre de usuario debe contener mínimo 5 caracteres').css('color', 'red');
            $('#username').css('border-color', 'red');
 
        } else {
 
            if ($('#username').val().length > 50) {
 
                $('#userValidate').html('El nombre de usuario debe contener máximo 50 caracteres').css('color', 'red');
                $('#username').css('border-color', 'red');
 
            }
 
        }
 
    }
 
}
 
function check_email() {
 
    if ($('#email').val().length === 0) {
 
        $('#emailValidate').html('El email es obligatorio').css('color', 'red');
        $('#email').css('border-color', 'red');
 
 
    } else {
 
        if ($('#email').val().length > 150) {
 
            $('#emailValidate').html('El email debe contener máximo 150 caracteres').css('color', 'red');
            $('#email').css('border-color', 'red');
 
        }
 
    }
 
 
}
 
function check_password() {
 
    if ($('#password').val().length === 0) {
 
        $('#passValidate').removeClass('text-muted');
        $('#passValidate').html('La contraseña es obligatoria').css('color', 'red');
        $('#password').css('border-color', 'red');
 
    } else {
 
        if ($('#password').val().length > 500) {
 
            $('#passValidate').removeClass('text-muted');
            $('#passValidate').html('La contraseña debe contener máximo 500 caracteres').css('color', 'red');
            $('#password').css('border-color', 'red');
 
        } else {
 
            if ($('#password').val().length > 8) {
 
                $('#passValidate').removeClass('text-muted');
                $('#passValidate').html('La contraseña debe contener mínimo 8 caracteres').css('color', 'red');
                $('#password').css('border-color', 'red');
 
            }
 
        }
 
    }
 
}
 
$('#registerForm').submit(function (e) {
 
    e.preventDefault();
 
    check_username.call(this);
    check_email.call(this)
    check_password.call(this)
 
});

Como puedes ver son 3 funciones muy sencillas donde se comprueba si los campos están vacíos o no cumplen los requisitos de nº de caracteres. El evento se lo añado al formulario directamente para que los métodos se ejecuten al querer enviar la información, y obviamente, esas validaciones también deben estar hechas en el backend, como en el siguiente ejemplo:

1
2
3
4
5
6
7
8
private function validateFields()
{
    request()->validate([
        'username' => 'required|min:5|max:50',
        'email' => 'required|max:150|email:rfc,dns',
        'password' => 'required|min:8|max:500'
    ]);
}

La funcón validate, como su nombre indica, será validar los campos señalados con las reglas que indiques. Te dejo también el formulario del registro para que veas bien a lo que me refiero:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<div class="container">
 
    <div class="row pt-2">
        <div class="col-sm-12 justify-content-center">
            <div class="card">
                <div class="card-header">
                    <h4>
                        Registro
                    </h4>
                </div>
                <div class="card-body">
 
                    <div class="form-group">
                        <form id="registerForm" action="{{ route("user.register") }}" method="post"
                              enctype="multipart/form-data">
                            @csrf
 
                            <div class="form-group row">
                                <div class="col-md-4 col-form-label text-md-right">
                                    <label for="profileImage">Imagen de perfil</label>
                                </div>
                                <div class="col-md-6">
                                    <input type="file" name="profileImage" id="profileImage"
                                           class="form-control-file">
                                </div>
 
                            </div>
 
                            <div class="form-group row">
                                <div class="col-md-4 col-form-label text-md-right">
                                    <label for="username">Nombre</label>
                                </div>
                                <div class="col-md-6">
                                    <input type="text" name="username" id="username" class="form-control">
                                    <small id="userValidate"></small>
                                </div>
 
                            </div>
 
                            <div class="form-group row">
                                <div class="col-md-4 col-form-label text-md-right">
                                    <label for="email">{{ __('E-mail') }}</label>
                                </div>
                                <div class="col-md-6">
                                    <input type="email" name="email" id="email" class="form-control">
                                    <small id="emailValidate"></small>
                                </div>
 
                            </div>
 
                            <div class="form-group row">
                                <div class="col-md-4 col-form-label text-md-right">
                                    <label for="password">Contraseña</label>
                                </div>
                                <div class="col-md-6">
                                    <input type="password" name="password" id="password" class="form-control">
                                    <small id="passValidate" class="text-muted">Recuerde: como mínimo 8 caracteres</small>
                                </div>
 
                            </div>
 
                            <div class="form-group row">
                                <div class="col-md-6 col-form-label text-md-right">
                                    <button id="register" type="submit" class="btn btn-outline-elegant">
                                        Registrarse
                                    </button>
                                </div>
                            </div>
 
                        </form>
 
                        <a href="{{ route('user.showLoginForm') }}">¿Ya tienes cuenta? Inicia sesión aquí</a>
 
                    </div>
 
                </div>
            </div>
        </div>
 
    </div>
 
</div>

Sé que no respondo como tal a tu duda, pero es un consejo para que no satures tanto el código PHP.
Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 68
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

No me muestra los mensajes de error

Publicado por raquel (27 intervenciones) el 27/06/2020 20:54:14
Muchas gracias por tu respuesta,,, de hecho hago las validaciones en Javascript, y me muestra los mensajes de error, pero quería probar a hacerlo usando el array $errors. Lamentablemente no hay manera de que funcione con el array, al menos yo no sé hacerlo funcionar, soy novatilla en esto y poco a poco voy aprendiendo cosas. Muchas gracias igualmente
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 2.149
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

No me muestra los mensajes de error

Publicado por Kathyu (680 intervenciones) el 28/06/2020 11:34:24
No he revisado a fondo, pero HTML5 ya hace uso de JS de manera automática para hacer las validaciones y se ven muy bien.

Al PHP no llegara nada que no pase las validaciones del form, pero siempre es bueno sanitizar las variables que llegan y si una falla hacer el redirect de nuevo al form en donde se mostraría el error, error que tu enviarías y que en el form se mostraría en un div o lo que sea el error o contenido en ella. Por lo general se usan alerts de JS que te regresan atrás de manera automática.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 68
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

No me muestra los mensajes de error

Publicado por raquel (27 intervenciones) el 29/06/2020 13:04:11
Muchas gracias Kathyu por el consejo, pero como dije el archivo de validaciones de JS funciona perfectamente, simplemente estaba probando a mostrar los errores desde el PHP con un array y era simplemente eso, saber por qué no me los mostraba. Como dije antes soy novata y ando probando formas diferentes, pero igualmente gracias por el consejo,,, En lo referente a los alerts que tb comentas, a mi personalmente no me gusta usarlos mucho, pues me resulta engorroso que se te llene la pantalla de pantallitas y procuro mostrarlos en el mismo form.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Álvaro
Val: 106
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

No me muestra los mensajes de error

Publicado por Álvaro (22 intervenciones) el 29/06/2020 21:31:06
Haces bien en no saturar la pantalla del usuario con alerts. Si te ves con la necesidad de usarlos, te recomiendo la librería sweetAlert2, que, como su nombre indica, son alerts de js pero más bonitos esteticamente. Aquí te dejo la URL:

https://sweetalert.js.org/guides/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 68
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

No me muestra los mensajes de error

Publicado por raquel (27 intervenciones) el 04/07/2020 19:28:03
Muchas gracias!! lo tendré en cuenta!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Kathyu
Val: 2.149
Plata
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

No me muestra los mensajes de error

Publicado por Kathyu (680 intervenciones) el 29/06/2020 23:21:08
Use un sistema de alerts como el que se hace con NodeJS y listo. Se captura error en el backend y se envía de regreso al frontend, en este se valida si para cada campo hay error, si lo hay se despleaa un Alert Dismissing

Con respecto a los alerts, no es saturar, en un solo alert se puede poner mucha informacion, puede usar Sweet Alert ya que es de lo mejor que hay, en vista que usted aun no maneja bien la programación solo di la idea. Pero Sweet Alert queda muy bien.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 68
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

No me muestra los mensajes de error

Publicado por raquel (27 intervenciones) el 04/07/2020 19:29:08
No veo la necesidad de liar tanto el rizo, capturando el error en un array y mostrarlo en el frontend me parece más sencillo,, aun sigo averiguando como hacerlo, pero no desisto jaja gracias!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar