He conseguido aplicar jquery a la página de logeo por un lado y a la página de registro por otro. Lo genial sería poder aplicarlo a todo con el fin de poder colocarlo en un div en una esquina de la web sin que recargue la página nunca, pero no he aprendido a hacerlo aún.
Si acaso pongo esta versión por ahora y ya vemos cómo consigo lo demás.
chequeo.php
formulario.php
login.php
registro.php
He de pulirlo aún, colocar estilos decentes y tal. Y claro, explicar lo que he hecho. Pero me voy al campo a comerme una paella y esta tarde me pongo ;=) Feliz Domingo!
Si acaso pongo esta versión por ahora y ya vemos cómo consigo lo demás.
chequeo.php
<?php
include_once('configuracion.php');
if ( ($_POST['testigo2']) != "valido")
{
// header("Refresh: 4; URL=registro.php");
echo "<br /><p>ERROR.</p>";
die;
}
// Chequeamos que el usuario existe y que la contraseña es correcta
$nick= $_POST['nick']; // cazamos el valor de nick del formulario
$password = $_POST['password']; // cazamos el valor de la contraseña del formulario
//sacamos los valores de las variables $password (que está hasheada) y $salteada correspondientes a ese nick
$consulta= mysql_query("SELECT * FROM ".$tabla." WHERE nick='".$nick."' ");
if(mysql_num_rows($consulta) < 1) //si no existe el usuario...
{
// header("Refresh: 4; URL=login.php");
echo "<p>ERROR. El nick dado no existe.</p>";
die;
}
$datosdelusuario= mysql_fetch_array($consulta, MYSQL_ASSOC);
//aplicamos el algoritmo a la contraseña dada por el usuario en el login para poder
//compararla con la que tenemos guardada
$hash = hash('sha256', $datosdelusuario['salteada'] . hash('sha256', $password) );
// coinciden?
if($hash != $datosdelusuario['password']) //si la contraseña es incorrecta...
{
// header("Refresh: 4; URL=login.php");
echo "<br /><p>ERROR. La contraseña no es válida.</p>";
die;
}
$estado=$datosdelusuario["estado"];
switch ( $estado )
{
case 'activo': // Activo, le damos paso al sistema de registro.
session_register("usuario"); //registramos la variable usuario que contendrá el nick del user
session_register("idusuario"); //registramos la variable idusuario que contendrá la id del user
$_SESSION[usuario] = $datosdelusuario["nick"]; //damos el nick a la variable usuario
$_SESSION[idusuario] = $datosdelusuario["id"]; //damos la id del user a la variable idusuario
header("Refresh: 4; URL=login.php");
echo '<br /><p>Logeado compañero'."$_SESSION[usuario]".'.</p>';
break;
case 'inactivo': // Estado inactivo, informar al usuario.
echo "<p>Su cuenta existe y los datos de acceso son correctos, pero por algún motivo su cuenta está desactivada</p><p>Contacte con el administrador de esta web para arreglar el problema. Gracias.</p>";
break;
default: // Registrado y validado, activar la cuenta.
echo "<p>Su cuenta está pendiente de ser verificada a través del correo que se le ha enviado al correo con el que se registró. Chequee su email para activarla.</p>." ;
}
?> formulario.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=iso-8859-1" />
<title>Ejemplo de formulario sin recarga</title>
<script language="javascript" src="mijquery.js"></script>
<script language="javascript">
$(document).ready(function() {
$().ajaxStart(function() {
$('#resultado').hide();
}).ajaxStop(function() {
$('#resultado').fadeIn('slow');
});
$('#formulario, #nick, #password, #password2, #email, #testigo').submit(function() {
$.ajax({
type: 'POST',
url: $(this).attr('action'),
data: $(this).serialize(),
success: function(data) {
$('#resultado').html(data);
}
})
return false;
});
})
</script>
<style type="text/css">
<!--
body {
color: #333333;
font-family:Arial, Helvetica, sans-serif;
font-size:12px;
}
form {
width:680px;
margin:auto;
}
#resultado {
width:480px;
padding:10px;
border:1px solid #bfcddb;
margin:auto;
margin-top:10px;
text-align:center;
}
-->
</style>
</head>
<body>
<form action="registro.php" method="POST" id="formulario" name="formulario">
Nick: <input type="text" name="nick" id="nick" maxlength="25" size="25" /><br />
Contraseña: <input type="password" name="password" id="password" maxlength="40" size="40" /><br />
Repite la contraseña: <input type="password" name="password2" id="password2" maxlength="40" size="40" /><br />
E-mail: <input type="text" name="email" id="email" maxlength="60" size="60" /><br />
<input type="hidden" name="testigo" id="testigo" value="valido" />
<input type="submit" name="submit" id="submit" value="Registrar" />
</form>
<br /><a href="login.php">Login</a>
<div id="resultado"></div>
</body>
</html>login.php
<?php
include_once('configuracion.php');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=iso-8859-1" />
<title>Fomulario de logeo sin recarga</title>
<script language="javascript" src="mijquery.js"></script>
<script language="javascript">
$(document).ready(function() {
$().ajaxStart(function() {
$('#resultado').hide();
}).ajaxStop(function() {
$('#resultado').fadeIn('slow');
});
$('#formulario, #nick, #password, #testigo2').submit(function() {
$.ajax({
type: 'POST',
url: $(this).attr('action'),
data: $(this).serialize(),
success: function(data) {
$('#resultado').html(data);
}
})
return false;
});
})
</script>
<?php
if(!isset($_SESSION[usuario]) ) // Esto es, si no está ya logeado
// Si aún no está logeado le mostramos el formulario de login
{
// Formulario para recoger los datos de login y enviarlos a chequeo.php, donde miramos que sean correctos
echo '
<form action="chequeo.php" method="POST" id="formulario" name="formulario">
Nick: <input type="text" name="nick" id="nick" maxlength="25" size="25" /><br />
Password: <input type="password" name="password" id="password" maxlength="40" size="40" /><br />
<input type="hidden" name="testigo2" id="testigo2" value="valido" />
<input type="submit" name="submit" id="submit" value="Login" />
</form>
';
// le damos la opcion de registrarse si no lo está
echo '<br /><a href="formulario.php">Registro</a>';
}
else // Esto es, si está ya logeado
{
// Si está logeado indicamos que no es necesario logearse de nuevo. Le mostramos el nick y la opción de deslogearse
echo 'Bienvenido a la web <b>'.$_SESSION[usuario].'</b>'; // Mensaje de bienvenida
echo '<br /><a href=logout.php>Salir</a>'; //link para deslogearse, iría a logout.php
}
?>
<div id="resultado"></div>
</body>
</head>registro.php
<?php
include_once('configuracion.php');
//Rescate de Variables:
$testigo = $_POST['testigo'] ;
$nick = limpia($_POST['nick']) ;
$email = $_POST['email'] ;
$password = limpia($_POST['password']) ;
$password2= limpia($_POST['password2']);
if ($testigo != "valido") {$error = true;}
function limpia($cadena)
{
return (ereg_replace('[^A-Za-z0-9_-ñÑ]', '', $cadena));
}
function saltear ()
{
$cadena = md5 (uniqid(rand(), true));
return substr($cadena, 0, 3);
}
// marcamos el error
if ( empty($nick) OR empty($email) OR empty($password) OR empty($password2) ) {$error = true;}
// si eliminando caráteres raros queda algún campo vacio, generamos un error y devolvemos al formulario
if ( !empty($error) )
{
// header("Refresh: 2; URL=formulario.php");
echo "<p>ERROR. Los datos introducidos no tienen un formato correcto.</p>";
die;
}
include_once('verificar_email.php');
if ( verificar_email($email)==false )
{
// header("Refresh: 5; URL=formulario.php");
echo "<br /><p>ERROR. El Email $email no parece ser real.</p>";
die;
}
//Comprobamos que la password y password2 son iguales, sino, volvemos a registro.php
if($password != $password2)
{
// header("Refresh: 5; URL=formulario.php");
echo '<br /><p>ERROR. Las contraseñas no coinciden</p>';
die;
}
else
{
//cuantos usuarios hay ya con ese nick?
$cuantosnicks=mysql_query("SELECT nick FROM ".$tabla." WHERE nick='".$nick."' ");
//cuantos usuarios hay ya con ese email?
$cuantosemails=mysql_query("SELECT email FROM ".$tabla." WHERE email='".$email."' ");
$nickrepetido = mysql_num_rows($cuantosnicks);
$emailrepetido = mysql_num_rows($cuantosemails);
if($nickrepetido >= 1)
{
// header("Refresh: 5; URL=formulario.php");
echo '<br /><p>El nick propuesto ya estaba registrado. Escoge otro.</p>';
die;
}
else if($emailrepetido >= 1)
{
// header("Refresh: 5; URL=formulario.php");
echo '<br /><p>El email propuesto ya estaba registrado. Escoge otro.</p>';
die;
}
else
{
//introducimos el nuevo registro en la tabla users, pero inactivo hasta correo de verificación
$hasheada= hash('sha256', $password) ;
$salteada = saltear();
$hasheada = hash('sha256', $salteada . $hasheada);
$codigodevalidacion = rand(000000000000,999999999999);
mysql_query("INSERT INTO $tabla (nick,password,salteada,email,estado) values ('$nick','$hasheada','$salteada','$email','$codigodevalidacion') ");
$mensaje="Hola $nick. Acabas de registrarte en $midominio pero has de activar la cuenta haciendo clic en el siguiente enlace: Enlace de activación: http://$midominio/verificar_cuenta.php?codigo=$codigodevalidacion";
// Enviando el correo...
mail($email, "Validación de su nueva cuenta en $midominio", $mensaje, "From: $miemail");
// Aviso para el usuario.
echo "<br /><p>Usuario registrado con éxito con Nick=$nick, Contraseña=$password y email=$email</p><p>La cuenta aún no está activa hasta que se verifique mediante el correo que se ha enviado al Email con el que se ha registrado. Revise por tanto su correo por favor.</p>";
// damos la opcion de logerase, por si ha respondido al correo de verificación y aún tiene esta página abierta.
echo '<br /><a href="login.php">Quieres logearte?</a>';
}
mysql_free_result($cuantosnicks); //liberamos memoria
mysql_free_result($cuantosemails); //liberamos memoria
}
;?>He de pulirlo aún, colocar estilos decentes y tal. Y claro, explicar lo que he hecho. Pero me voy al campo a comerme una paella y esta tarde me pongo ;=) Feliz Domingo!
