Registro de usuarios desde cero.

Skaparate Eres el unico que me responde, que haria yo sin ti jajajajaja

Vale ya funciona todo correctamente, y la verdad es muy gratificante. Pero visto que todo este post partio de la idea de hacer un registro simple, como el que hemos hecho ahora y luego mejorarlo ¿Crees que seria bueno usar este codigo de arriba y añadirle mejoras? Te lo pregunto a ti por que eres quien responde ahora mismo, y al ser quien entiende tambien, yo puedo investigar, probar y ayudar en lo que pueda, pero has de ser tu quien lo depure.
Sí, sería buena idea, pues esta algo obsoleto.

1.- Comienza por utilizar MySQLi en lugar de MySQL.
2.- Intenta utilizar la base de datos en lugar de las sesiones o cookies.
3.- Limpia lo ingresado por el usuario (para prevenir inyección de códigos).
4.- Intenta mostrar todo lo relacionado al usuario en uno o dos archivos (uno con el HTML y otro que lo procese) en lugar de tener miles de archivos que realicen las acciones.

Eso es lo que se me ocurre ahora XD.
Vale, lo de utilizar base de dato en lugar se sesiones es lo que no entendi, las cookis ya las habia descartado del todo, pero a que te refieres con usar base de datos, ya la estamos usando no?

Por lo demas me pondre a investigar sobre MySQLi y voy dejando propuestas para que las mires, lo de limpiar la info y usar pocos archivos, eso esta hecho
Si no lo entiendes ahora, entonces no te compliques. Más adelante puede que lo entiendas solo. Por ahora sigue con las demás modificaciones.
He dejado un mensaje en el foro general, por que no se exactamente donde colocarlo, si le hecas un vistazo, te lo agradesco. Aqui hay una ventana (respuesta rapida) en la que estoy escribiendo, y luego cuando le doy a responder, aparece lo que he escrito en pantalla y tu lo puedes ver. Como se hace esto?
Hola muy buenas, me ayudan con esto. buscando cosas simples, he encontrado codigos de registro (que funciona) codigo de cierre por inactividad (que funciona) y codigos de sistemas muy simple de anti-spam (que funciona) perooooooooo jajajajaj el de anti-spam tiene un codigo en javascipt y el boton de envio de formulario pasa de java, seguro que se arregla facil, (o no :S) pero no se como hacerlo :P aqui dejo la sopa de codigo que cree jaajajajaj
<?php include_once("conexion.php");
$_SESSION["secion"]= date("Y-n-j H:i:s");

?>
<!doctype html>
<html>
<head>
<?php
$cadena = "";

for ($i = 0; $i < 4; ++$i) {
  $cadena .= chr(rand(65, 90));
}
?>
<meta charset="utf-8">
<title>Documento sin título</title>
<link href="../estilo.css" rel="stylesheet" type="text/css">
</head>
    <body>
<?php
	
     if(isset($_POST['login']))
    {
        $nick= $_POST['nick'];
        $pass= md5(md5($_POST['pass']));
        $b_user=mysql_query("SELECT * FROM socios WHERE nick='$nick'");   
        $ses = @mysql_fetch_assoc($b_user) ;
        if(@mysql_num_rows($b_user))
        {
            if($ses['pass'] == $pass)
            {
                $_SESSION['id']=        $ses["id"];
                $_SESSION['fecha']=    $ses["fecha"];
                $_SESSION['nick']=    $ses["nick"];
                $_SESSION['mail']=    $ses["mail"];
                $_SESSION['ip']=        $ses["ip"];
            }
            else
            {
                echo 'Nombre de usuario o Contraseña incorrecta.';
            }
        }
        else
        {
            echo 'Nombre de Usuario o contraseña incorrecta.';
        }
    }
       
    if(isset($_GET['modo']) == 'desconectar')
    {
        session_destroy();
        echo '<meta http-equiv="Refresh" content="2;url=login.php"> ';
           }
    
    if(isset($_SESSION['id']))
    {
        echo 'Bienvenido <b>' . $_SESSION['nick'] . '';
        echo '<meta http-equiv="Refresh" content="1;url=perfil.php"> ';
    }
    else
    {
    ?>

    <h2>Conetarse</h2>
    <div align="center">
      <form name="login_user" action="login.php" method="post" />
      <dt><label>Nick:</label></dt>
            <input type='text' name='nick' /><br /><br />
      <dt><label>Contraseña:</label></dt>
            <input type="password" name='pass' /><br /><br />
            <img src="antispam.php?texto=<?php echo $cadena; ?>" alt="">
            <input type="text" id="campo" size="10" maxlength="10" />
     
      <input type="submit" name="login" style="width:100px;" tabindex="6" value="Entrar" onclick="comprobarReferencia();"/>
      <input type="reset" name="Limpiar" style="width:100px;" tabindex="6" value="Limpiar" />
      </form>
      <a href="registro.php">Registrarse</a>
    </div>
    <?php
    }
    ?>
    </body>
    </html>
¿Y el código Javascript dónde está? Ahí aparece la referencia a una función llamada comprobarReferencia, pero no aparece la definición de ella. Probablemente si te fijas en la consola de errores del navegador verás un error similar a Undefined function comprobarReferencia() on line NNN.
ups, se me paso ponerlo jajajaja

<?php include_once("conexion.php");
$_SESSION["secion"]= date("Y-n-j H:i:s");

?>
<!doctype html>
<html>
<head>
<?php
$cadena = "";

for ($i = 0; $i < 4; ++$i) {
  $cadena .= chr(rand(65, 90));
}

?>
<meta charset="utf-8">
<title>Documento sin título</title>
<link href="../estilo.css" rel="stylesheet" type="text/css">
</head>
    <body>
<?php
	
     if(isset($_POST['login']))
    {
        $nick= $_POST['nick'];
        $pass= md5(md5($_POST['pass']));
        $b_user=mysql_query("SELECT * FROM socios WHERE nick='$nick'");   
        $ses = @mysql_fetch_assoc($b_user) ;
        if(@mysql_num_rows($b_user))
        {
            if($ses['pass'] == $pass)
            {
                $_SESSION['id']=        $ses["id"];
                $_SESSION['fecha']=    $ses["fecha"];
                $_SESSION['nick']=    $ses["nick"];
                $_SESSION['mail']=    $ses["mail"];
                $_SESSION['ip']=        $ses["ip"];
            }
            else
            {
                echo 'Nombre de usuario o Contraseña incorrecta.';
            }
        }
        else
        {
            echo 'Nombre de Usuario o contraseña incorrecta.';
        }
    }
       
    if(isset($_GET['modo']) == 'desconectar')
    {
        session_destroy();
        echo '<meta http-equiv="Refresh" content="2;url=login.php"> ';
           }
    
    if(isset($_SESSION['id']))
    {
        echo 'Bienvenido <b>' . $_SESSION['nick'] . '';
        echo '<meta http-equiv="Refresh" content="1;url=perfil.php"> ';
    }
    else
    {
    ?>

    <h2>Conetarse</h2>
    <div align="center">
      <form name="login_user" action="login.php" method="post" />
      <dt><label>Nick:</label></dt>
            <input type='text' name='nick' /><br /><br />
      <dt><label>Contraseña:</label></dt>
            <input type="password" name='pass' /><br /><br />
            <img src="antispam.php?texto=<?php echo $cadena; ?>" alt="">
            <input type="text" id="campo" size="10" maxlength="10" />
     
      <input type="submit" name="login" style="width:100px;" tabindex="6" value="Entrar" onclick="comprobarReferencia();"/>
      <input type="reset" name="Limpiar" style="width:100px;" tabindex="6" value="Limpiar" />
      </form>
      <a href="registro.php">Registrarse</a>
    </div>
    <?php
    }
    ?>
<script>
    function comprobarReferencia() {
  texto = document.getElementById('campo').value;

  if (texto == '') {
    alert('Introduce el texto que ves en la imagen.');
  } else if (texto == "<?php echo $cadena; ?>") {
    alert('Código correcto.');
  } else {
    alert('El código es incorrecto.');
  }

  document.getElementById('campo').focus();
}
</script>
    </body>
    </html>
Skaparate, hechame una mano porfa con el otro tema de imprimir en pantalla lo que escribe el usuario. esta en foro general. Miralo porfa
skaparate escribió:El utiliza el array $_SESSION el cual necesita iniciar la sesión para funcionar, o sea, necesitas poner session_start() al comienzo de cada archivo que utilice el array $_SESSION.

Yo hago algo así para que nadie pueda entrar al espacio privado:

<?php
  session_start();

  if( ! isset( $_SESSION['nick'] ) ) :
    header( 'Location: login.php' );
  else :
?>
<html>
  <head>
<!-- Resto del código HTML y PHP -->
<?php
  endif;
?>

Skaparate, recuerdas que me pusiste un codigo para que si no estoy logeado no pueda ver la pagina. El problema con este codigo, es que al refrescar la pagina no reconoce que la secion esta abierta y me envia a logearme de nuevo
Y otra cosa mas. la idea es que el nombre del usuario se envie junto con el resto de los datos, los datos del usuarios se almacenan en una base de datos diferente
Me ayudais con este ultimo detalle.

<?php include_once('conexion.php');
include_once("inac.php");    
 if( ! isset( $_SESSION['nick'] ) ) :
    header( 'Location: login.php' );
  else :
  ?> 
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Planilla de trabajo</title>
<link href="estilo.css" rel="stylesheet" type="text/css">
</head> 

<body>
<script type='text/JavaScript'
src='http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js'></script>
<script type="text/javascript">
  
     (function($) {
$(document).ready(function() {
$('input.limpiar').blur(function() {
var value = $.trim( $(this).val() );
$(this).val( value );
});
});
})(jQuery);

	function numeros(e){
        key = e.keyCode || e.which;
        tecla = String.fromCharCode(key).toLowerCase();
        letras = " /0123456789";
        especiales = [8,37,39,46];
     
        tecla_especial = false
        for(var i in especiales){
     if(key == especiales[i]){
         tecla_especial = true;
         break;
            }
        }
		
	
        if(letras.indexOf(tecla)==-1 && !tecla_especial)
            return false;
    }
	
  function envia_formulario() {
  var mi_formulario=document.formulario
  var Enviar=new Boolean()
  Enviar = true

if (Enviar && mi_formulario.FE.value.length<6) {
alert("La fecha no es correcta")
Enviar=false
mi_formulario.FE.focus()
}

if (Enviar && mi_formulario.HI.value.length<4) {
alert("La hora no es correcta")
Enviar=false
mi_formulario.HI.focus()
}

if (Enviar && mi_formulario.HF.value.length<4) {
alert("La hora no es correcta")
Enviar=false
mi_formulario.HF.focus()
}

if (Enviar && mi_formulario.NOMCR.value.length<10) {
alert("Escriba en nombre completo")
Enviar=false
mi_formulario.NOMCR.focus()
}

if (Enviar && mi_formulario.DP.value.length<10) {
alert("El detalle es muy corto, sea más claro porfavor")
Enviar=false
mi_formulario.DT.focus()
}

if (Enviar && mi_formulario.DT.value.length<25) {
alert("La dirección/Telefono es muy corta, sea más claro porfavor. Espesifique nombre de la calle, localidad y número de teléfono")
Enviar=false
mi_formulario.DT.focus()
}

if (Enviar) {
mi_formulario.submit()
}
}
  	
</script>

<div id="centrado_planilla">

    <div id="datos">

      <p>Fecha__] H. inicio] H. final] Nom. clien/recom.___] Ciente y/o Recom.] Detalles presupuesto______________] Dirección y teléfono_________] </p>  
      
    </div><!--fin datos--><br><br>
      
    <form action="formulario3.php" method="post" name="formulario" target="_self">
    
      <input type="hidden" name="NOM" value="aqui deberia figurar el nombre del usuario registrado"> 
      <input name="FE" type="text" required autocomplete onkeypress="return numeros(event)" size="5" maxlength="10">
      <input name="HI" type="text" required autocomplete onkeypress="return numeros(event)" size="5" maxlength="6">
      <input name="HF" type="text" required autocomplete onkeypress="return numeros(event)" size="5" maxlength="6">
      <input class='limpiar' type="text" size="18" name="NOMCR" maxlength=35  >
        <select name="CR" size=1 >
        <option value="Cliente">Cliente</option>
        <option value="Recomendador">Recomendador</option>
        <option value="Cient. y Recom.">Cient. y Recom.</option>
      </select>
      <input class='limpiar' type="text" size="36" name="DP" maxlength=200  >
      <input class='limpiar' type="text" size="29" name="DT" maxlength=100  ><br>
      <input type="button" value="Guardar" onclick="envia_formulario()"/>
      <input type="reset" value="Borrar" name="Restablecer"/>
      <a href="salir.php">Cerrar seción</a><br>
    </form>
</div><!--fin relleno-->

<div id="centrdo_planilla">
      <table align="center" border='1' cellpadding='0' cellspacing='0' width='1000' bgcolor='#F6F6F6' bordercolor='#FFFFFF'> 
      <tr> 
      <td width='100' style='font-weight: bold'>Nombre</td> 
      <td width='50' style='font-weight: bold'>Fecha</td> 
      <td width='30' style='font-weight: bold'>Inicio</td> 
      <td width='30' style='font-weight: bold'>Final</td> 
      <td width='180' style='font-weight: bold'>Nombre Cliente/Recom.</td> 
      
      <td width='100' style='font-weight: bold'>Cliente/Recom.</td> 
      <td width='200' style='font-weight: bold'>Detalles Presupuesto</td> 
      
      <td width='200' style='font-weight: bold'>Dirección Teléfono</td> 
      </tr>
<?php 
      
    $query = "select * from tabla2";     // Esta linea hace la consulta
    $result = mysql_query($query); 

    while ($registro = mysql_fetch_array($result)){ 
echo " 
    <tr> 
      <td width='100'>".$registro['NOM']."</td> 
      <td width='50'>".$registro['FE']."</td> 
      <td width='30'>".$registro['HI']."</td> 
      <td width='30'>".$registro['HF']."</td> 
      <td width='180'>".$registro['NOMCR']."</td> 
      <td width='100'>".$registro['CR']."</td>
	  <td width='200'>".$registro['DP']."</td> 
      <td width='200'>".$registro['DT']."</td> 
           
    </tr> 
"; 
} 
?> 
</table> 

</div><!--fin planilla-->
</body>
</html>
<?php
  endif;
?> 

Si miras el formulario, el primer campo es oculto y la idea es que el nombre que aparesca luego, sea por defecto segun el usuario que lo escribio
El problema con este codigo, es que al refrescar la pagina no reconoce que la secion esta abierta y me envia a logearme de nuevo

Eso puede ser porque no pusiste session_start() al comienzo del script de login y por ende no se guardó la sesión.

la idea es que el nombre del usuario se envie junto con el resto de los datos

¿Hacia dónde los quieres enviar? Si el usuario ya esta registrado no necesitas volver a guardar los datos. Bastaría con:

<div id="logout">
  <p>Hola <?php echo ucwords( $_SESSION['nick'] ); ?></p>
  <p><a href="logout.php">Cerrar sesión</a></p>
</div><!-- #logout -->

Es bastante complejo revisar (y lo será para ti actualizar) el código como está. Te recomiendo que siempre separes el código HTML de los scripts que procesan los datos.
Muy buenas jorgens,

Contigo empece en mis tiempos a montar mi web,y contigo sigo,aunque menos,
Felicidades por tu pagina,

Te quería preguntar si es posible cambiar de nick,tengo este y el de makineroes con el cual me he registrado por que no me acordaba de akivaz,lo que quisiera es mantener los datos de akivaz pero con nick makineroes,y borrar este.

Atentamente,

P.D. Si no va aquí este post, muevelo donde veas.
Hola.
He ido siguiendo los pasos de este tuto, pero me he quedado atascado en el paso 8.
Una vez creado el archivo chequeo.php, cuando intento hacer login me de el siguiente error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE nick='user' and password='pass'' at line 1.

El código es el siguiente (identico al del tuto)
chequeo.php

<?php

include('configuracion.php');

// Chequeamos que el usuario existe y que la contraseña es correcta
$usuarios=mysql_query("SELECT * FROM $tabla WHERE nick='$_POST[nick]' and password='$_POST[password]' ") or die ("error-a".mysql_error());
;
if($datosdelusuario = mysql_fetch_array($usuarios)) 
//si existe comenzamos con la sesion, si no, al index
    {
    //registramos la variable usuario que contendrá el nick del 
<?phpuser
	session_register("usuario") or die ("error-b".mysql_error());
	
    //registramos la variable idusuario que contendrá la id del user
    session_register("idusuario") or die ("error-c".mysql_error());
 
    //damos el nick a la variable usuario
	$_SESSION[usuario] = $datosdelusuario["nick"] or die ("error-d".mysql_error());
; 
    //damos la id del user a la variable idusuario
	$_SESSION[idusuario] = $datosdelusuario["id"] or die ("error-e".mysql_error());
; 
     //volvemos al login
	 Header("Location: login.php") or die ("error-f".mysql_error());
;
    }
else
    {
    echo 'Nick y/o Password incorrectos';
    echo '<br /><a href="login.php">Logearse</a>';
    }
?>


¿Como lo puedo solucionar?

Gracias de antemano.
Saludos.
Hola a todos.
Gracias por los aportes.
Conseguí hacer el registro. ¿Ahora como haría para que el usuario al hacer login entre en la pagina protegida por el login en cuestión?

Otra cuestión. Cuando cambio

ereg_replace por preg_match sugerido por otro compañero y pongo un email válido, el registro me dice caracteres incorrectos. ¿por que puede ser?


<?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&ntilde;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
}
;?>



Otra cuestión:
En verificar_mail me dice que !ereg está obsoleto. ¿por que lo cambio?


<?php

// incluida en registro.php

function verificar_email($email)
{
// Verificamos que no hay más de una arroba y que las longitudes son normales
if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email))
{
return false;
}
$email_array = explode("@", $email);
$local_array = explode(".", $email_array[0]);
for ($i = 0; $i < sizeof($local_array); $i++)
{
if (!ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$", $local_array[$i]))
{
return false;
}
}
// se revisa si el dominio es una IP. Si no, debe ser un nombre de dominio válido
if (!ereg("^\[?[0-9\.]+\]?$", $email_array[1]))
{
$domain_array = explode(".", $email_array[1]);
if (sizeof($domain_array) < 2)
{
return false; // No son suficientes partes para ser un dominio
}
for ($i = 0; $i < sizeof($domain_array); $i++)
{
if (!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$", $domain_array[$i]))
{
return false;
}
}
}
return true;
}

;?>



Gracias por vuestra ayuda.
Hola a todos

Al archivo registro.php le quité la linea

echo '<br /><a href="login.php">Quieres logearte?</a>';

para que el usuario cierre la ventana abierta despues de registrarse, por que cuando valida email, la validación le manda a una ventana con el formulario login y así el usuario no se perdería en varias ventanas abiertas para hecer login.

¿Que opinan?

Gracias.