Sistema de registro de usuarios

@madiu:

headers already sent

Cuando veas este mensaje, asegúrate de que session_start() este al comienzo del archivo (y luego de <?php), incluso antes de la declaración de DOCTYPE: <!DOCTYPE html>.
Gracias por la respuesta. ahora ya me guarda los datos en la base, pero cuando ingreso mis datos para iniciar sesion me sale esto

Warning: Cannot modify header information - headers already sent by (output started at /homepages/18/d443085515/htdocs/entrar.php:10) in /homepages/18/d443085515/htdocs/entrar.php on line 31

Warning: Cannot modify header information - headers already sent by (output started at /homepages/18/d443085515/htdocs/entrar.php:10) in /homepages/18/d443085515/htdocs/entrar.php on line 32

Warning: Cannot modify header information - headers already sent by (output started at /homepages/18/d443085515/htdocs/entrar.php:10) in /homepages/18/d443085515/htdocs/entrar.php on line 33

Warning: Cannot modify header information - headers already sent by (output started at /homepages/18/d443085515/htdocs/entrar.php:10) in /homepages/18/d443085515/htdocs/entrar.php on line 34

que he visto que a otros le ha salido lo mismo, pero no veo la respuesta de la solucion. Teoricamente se dejo la solucion en un archivo a descargar de rapishare, cosa que ya no existe.

esto es lo que hay en esas lineas

setcookie('uid',$datos,time()+604800) ;
setcookie('unick',$nick,time()+604800) ;
setcookie('ucontrasena',$contrasena,time()+604800) ;
header("location: $_SERVER[HTTP_REFERER]") ;
Es exactamente el mismo problema.

Al igual que session_start(), setcookie y header también deben ejecutarse antes de haya alguna salida por pantalla. Esto significa que no puede haber ningún echo, print, ni error alguno, pues todos muestran algo en la pantalla.

Ahora, no es necesario utilizar cookies y además sesiones. Elige uno de los dos.

Por último, si no puedes evitar mostrar algo por pantalla, entonces escribe esto al comienzo del script:

<?php
  ob_start(); // Comienza un buffer de salida (ob = output buffer). Un buffer es un espacio de almacenamiento temporal.

  // Aquí irán los session_start(), setcookie, header, etc.

  ob_end_flush(); // Con esta función mostrarás todo el contenido y no debería producir los errores anteriores.
  ob_end_clean(); // Esta función limpia el contenido del buffer
?>
Gracias skaparate, eres el unico que me responde :D. He hecho lo que me has dicho, me he quedado solo con session_star y eh colocado los codigos antes de <!DOCTYPE html>. dentro de php. me sale la ventana de registro correctamente, pero si me registro pasa esto.

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /homepages/18/d443085515/htdocs/entrar.php:1) in /homepages/18/d443085515/htdocs/configuracion.php on line 23
Usuario registrado con éxito.

y no me registra, en la base de datos no aparece nada

No se que mas hacer, he mirado por internet todas las explicaciones, y todos ponen lo mismo, eh comprobado mi servidor y colocado session_star correstamente, pero aun asi me sale el mismo error

<?php
include_once('configuracion.php');
session_start();
//Creamos el formulario de registro
echo '
    <form action="entrar.php" method="POST" />
        Nick:       <input type="text"     name="nick"     size="25" /><br />
        Contraseña: <input type="password" name="password" size="40" /><br />
        E-mail:     <input type="text"     name="email"    size="60" /><br />
                    <input type="submit"   name="submit"   value="Registrar" />
    </form>
     ';

// Damos la opción de volver a la página de login si no desea registrarse
echo '<br /><a href="login.php">Login</a>'; 

?> 


<!doctype html>
luego asi
<?php
session_start();
include_once('configuracion.php');
//Creamos el formulario de registro
echo '
    <form action="entrar.php" method="POST" />
        Nick:       <input type="text"     name="nick"     size="25" /><br />
        Contraseña: <input type="password" name="password" size="40" /><br />
        E-mail:     <input type="text"     name="email"    size="60" /><br />
                    <input type="submit"   name="submit"   value="Registrar" />
    </form>
     ';

// Damos la opción de volver a la página de login si no desea registrarse
echo '<br /><a href="login.php">Login</a>'; 

?> 


<!doctype html>
Luego esto:
configuracion.php
<?php

// En esta línea siempre se coloca, casi siempre, localhost
$dbhost="direccion de host";

// Nombre del usuario de la base de datos. El que definiste en el cPanel
$dbuser="nombre usuario"; 

// La contraseña para la base de datos
$dbpass="*******";

// Nombre de la base de datos
$db="nombre de base";

//nombre de la tabla de usuarios
$tabla="socios"; 

// Hacemos la conexión con la base de datos y la seleccionamos
mysql_connect("$dbhost","$dbuser","$dbpass");
mysql_select_db("$db");

session_star();

?>

registrar.php
<?php
include_once('configuracion.php');

//Creamos el formulario de registro
echo '
    <form action="entrar.php" method="POST" />
        Nick:       <input type="text"     name="nick"     size="25" /><br />
        Contraseña: <input type="password" name="password" size="40" /><br />
        E-mail:     <input type="text"     name="email"    size="60" /><br />
                    <input type="submit"   name="submit"   value="Registrar" />
    </form>
     ';

// Damos la opción de volver a la página de login si no desea registrarse
echo '<br /><a href="login.php">Login</a>'; 

?> 


<!doctype html>
...

Pero nada, no hay manera
Dios que mareooo jajaaja

Veamos, en el archivo registrar esta session_star(); y va correcto. el resto de archivos tambien tenian incluido el session_star(); en su primera linea y siempre salia error mas el contenido de cada archivo. por tanto entendi que la secion ya estaba iniciada y esos codigos estaban demas ¿es correcto? ni idea. en fin los quite por probar y parece funcionar. hasta que intento logearme y sale esto

Fatal error: Call to undefined function session_register() in
Ok... primero hay que entender lo que se esta haciendo.

Todo el código HTML que se pretende mostrar debe ir dentro del <body></body>. Puedes hacer esto:

<?php session_start(); ?>
<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <!-- Sólo si el usuario no ha iniciado sesión se muestra el formulario de ingreso -->
    <?php if( ! isset( $_SESSION['logged_in'] ) || $_SESSION['logged_in'] === false ) : ?>
    <form action="login.php" method="get">
      <input type="text" name="user" />
      <input type="password" name="pass" />
      <input type="submit" name="submitBtn" />
    </form>
    <?php else : ?>
    <!-- De lo contrario se muestra un div con la información básica del usuario -->
    <div id="logged-in">
      <p>Usuario: <?php echo ucwords( $_SESSION['user_name'] ); ?></p>
      <p><a href="logout.php">Salir</a>
    </div>
    <?php endif; ?>
    <?php if( isset( $_GET['msg' ] ) ) : ?>
      <div class="error-msg"><!-- Aquí muestras los posibles errores -->
        <p><?php echo $_GET['msg']; ?></p>
      </div>
    <?php endif; ?>
  </body>
</html>

Luego, en los archivos login.php y logout.php:

login.php
<?php
  session_start();
  $out = '';
  $headto = 'index.php'; // Originalmente, te redirigirá a la página de inicio.

  if( ! isset( $_GET['submitBtn'] ) ) { // Esto sirve si es que por algún motivo se ingresó la URL tusitioweb.algo/login.php, de lo contrario cualquier podría iniciar sesión.
    if( isset( $_GET['user'] ) && ! empty( $_GET['user'] ) &&
        isset( $_GET['pass'] ) && ! empty( $_GET['pass'] ) ) {
      $user = filter_var( $_GET['user'], FILTER_SANTIZE_STRING ); // Limpiar la variable para prevenir inyección de código.
      $pass = $_GET['pass'];

      include_once "configuracion.php";
      $con = mysql_connect( $dbhost, $dbuser, $dbpass ); // Sin comillas. Usa comillas sólo para envolver palabras, no variables.
      mysql_select_db( $db, $con );
      $query = "SELECT * FROM usuarios WHERE nick = '$user'";
      $result = mysql_query( $query, $con );
      
      if( mysql_num_rows( $result ) == 1 ) { // Si se devolvió una fila, entonces el usuario existe
        $assoc = mysql_fetch_assoc( $result );
        if( $pass == $assoc['contrasena'] ) {
          $_SESSION['logged_in'] = true;
          $_SESSION['user_name'] = $assoc['nick'];
        } else {
          $out .= 'Contraseña incorrecta';
        }
      } else { // Si se devolvieron 0 o más de una fila, entonces el usuario no existe o la tabla esta mal hecha.
        $headto = 'registrar.php'; // El usuario no existe, entonces se envía a la página de registro.
      }

      mysql_free_result( $result );
      mysql_close( $con );
    } else {
      $out .= "Ingrese una contraseña y un usuario válidos.";
    }
  }

  if( ! empty( $out ) )
    $headto .= '?msg=' . urlencode( $out );

  header( "Location: $headto" );
?>

De esta forma no necesitas tener varios header(), solo una variable que contenga la URL a la que redirigir.

logout.php
<?php
  session_start();
  $headto = 'index.php';
  $_SESSION = array();
  session_destroy();
  header( "Location: $headto" );
?>

Eso es todo en cuanto a la "salida" del usuario.

En cuanto al registro de usuarios, no utilices session_start() ni setcookie(), simplemente redirige al usuario a la página de inicio de sesión con los datos que acabas de ingresar:

header( "Location: login.php?user_name=nombre_usuario&pass=********" ); // Así se pasan los valores al arreglo $_GET
ok, voy a hacer todo esto que me has dicho y te cuento, a ver si te pillo antes de que te marches :D

Pero eh de utilizar session_start si quiero que el usuario pueda ver una pagina privada verdad?
Vamos a ver, seria entonces esta una forma correcta de escribir

login.php
<?php
  session_start();
  $out = '';
  $headto = 'plantilla.php'; // Originalmente, te redirigirá a la página de inicio.

  if( ! isset( $_GET['submitBtn'] ) ) { // Esto sirve si es que por algún motivo se ingresó la URL tusitioweb.algo/login.php, de lo contrario cualquier podría iniciar sesión.
    if( isset( $_GET['user'] ) && ! empty( $_GET['user'] ) &&
        isset( $_GET['pass'] ) && ! empty( $_GET['pass'] ) ) {
      $user = filter_var( $_GET['user'], FILTER_SANTIZE_STRING ); // Limpiar la variable para prevenir inyección de código.
      $pass = $_GET['pass'];

      include_once "configuracion.php";
      $con = mysql_connect( $dbhost, $dbuser, $dbpass ); // Sin comillas. Usa comillas sólo para envolver palabras, no variables.
      mysql_select_db( $db, $con );
      $query = "SELECT * FROM socios WHERE nick = '$user'";
      $result = mysql_query( $query, $con );
      
      if( mysql_num_rows( $result ) == 1 ) { // Si se devolvió una fila, entonces el usuario existe
        $assoc = mysql_fetch_assoc( $result );
        if( $pass == $assoc['contrasena'] ) {
          $_SESSION['logged_in'] = true;
          $_SESSION['user_name'] = $assoc['nick'];
        } else {
          $out .= 'Contraseña incorrecta';
        }
      } else { // Si se devolvieron 0 o más de una fila, entonces el usuario no existe o la tabla esta mal hecha.
        $headto = 'registrar.php'; // El usuario no existe, entonces se envía a la página de registro.
      }

      mysql_free_result( $result );
      mysql_close( $con );
    } else {
      $out .= "Ingrese una contraseña y un usuario válidos.";
    }
  }

  if( ! empty( $out ) )
    $headto .= '?msg=' . urlencode( $out );

  header( "Location: $headto" );
?> 
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Documento sin título</title>
<link href="../estilo.css" rel="stylesheet" type="text/css">
</head>

<body>
<?php
if (!isset($_SESSION[socios]) )  // 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">
    Nick: <input type="text" name="nick" size="25"><br>
    Password: <input type="password" name="password" size="40" ><br>
    <input type="submit" name="submit" value="Login"></form>
    ';
    // le damos la opcion de registrarse si no lo está
    echo '<br /><a href="registrar.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[socios].'</b>'; // Mensaje de bienvenida
    echo '<br /><a href=salir.php>Salir</a>'; //link para deslogearse, iría a logout.php
    }

?> 
</body>
nunca entendi los dos ultimos campos... ese primary key id y noc q mas :S alguien me alluda por favor
mi correo es: [correo eliminado]
no me junciona... capas es porque en la tabla de mi base de datos(mysql) noc como poner los ultimos dos campos ... :S
alludame por favor: [correo eliminado]
Hola bielsa22 primary key (id) no es un campo es que el id debe ser la clave primaria si no sabes como implementar bien directamente en la base de datos todos los datos y campos de la tabla este código te puede ayudar

ponlo en una pagina con la extensión .php y solo abre el navegador web y recarga lo y ya esta es para crear la tabla compreta automaticamente

<?php 
$db=mysql_connect("localhost","tu_usuario","tu_contraseña"); 
mysql_select_db("tu_base_de_datos",$db); 
$sql="CREATE TABLE IF NOT EXISTS `usuarios` (id smallint(5) unsigned not null auto_increment, fecha int(10) unsigned not null, nick varchar(20) not null, contrasena varchar(32) not null, email varchar(40) not null, pais varchar(20) not null, edad tinyint(2) unsigned not null, sexo enum('0','1') not null, descripcion tinytext not null, web varchar(100) not null, ip varchar(15) not null, primary key (id), key (nick,contrasena) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=11;";  
mysql_query($sql,$db); 
mysql_close($db); 
?> 
weee... ahora me dice... Datos de conexion incorrectos :S noc como se hace :@

ya proble cambiando la config.php en la parte de localhost lo cambien por mysql14.000webhost.com y despues puse la otra pagina .php q me dijo francisco1 y tampoco me funciono.... :@me voy a enfermar con esta cosa :S
Gracias por toda tu ayuda... espero que me salga sino ya me voy a dar por vencido :S !
Hola, primero que nada, WOW increible el post, muy util y todavia sirve. Solo tengo una pregunta....bueno dos.
1) en partes del codigo viene esto
else {
echo 'La contraseña es incorrecta. Haz click aquí para regresar.' ;
}
}
else {
echo 'El nick no existe. Haz click aquí para regresar.' ;
mi pregunta es como hago funcionar los enlaces de la palabra "aqui" no se si ya lo solucionaron en algun otro comentario y de ser asi estaria muy agradecido de que me digeran donde.
2) Como ya habia dicho el post funciona y no me ha dado ningun error, debo decir que esta muy bien hecho para personas que no comprenden mucho de codigos (como yo XD) pero si yo quisiera hace un enlace de "has olvidado tu contraseña?, recuperala aqui!" como lo hago????

P.D: cheque dentro de la tabla mysql en el php admin el usuario que hice para ver como lucia en el php admin y todo de lujo, puedo ver mi nombre, mi correo hasta mi ip, pero la contraseña luce en un formato raro y muy diferente a la contraseña que use, hay alguna forma de que yo vea la contraseña correcta desde el php admin?
y de nuevo, muchas gracias por todo y en especial al creador del post FoxLoghan
@Sgahoc:

1.- Es fácil, solo añade un enlace reemplazando el aquí con un enlace:

echo 'El nick no existe. Haz click <a href="archivo.[html|php|otro]">aquí</a> para regresar.';

2.- Eso es más complejo, pero hay varios posts que hacen referencia al tema, así que deberías usar el buscador del foro para encontrarlo. De hecho, en este mismo post se habla sobre el tema.

Sobre la contraseña, la idea es que nadie las pueda ver para que sólo el usuario dueño de la cuenta sepa qué es. En este caso, FoxLoghan utilizó una contraseña encriptada con MD5, la cual debe ser desencriptada para que pudieras verla y eso requiere horas y horas de procesador (es algo que un hacker con un buen pc haría - aunque md5 no es muy seguro, así que no es TAN largo).
@shakaparate muhcas gracias por responderme, tengo otra pregunta......bueno preguntas XD..... en mi pagina ya tengo el ingreso para que los usuarios inicien sesion pero si quiero que una vez que inicien sesion ya no aparesca el boton ingresar y aparesca que "tal usuario" esta logeado que codigo debo de usar? ademas de que como coloco el boton salir para cuando el usuario este loggeado y que solo aparesca cuando este conectado? y ya por ultimo intente agregar el codigo
<? require 'login.php' ?>
para bloquear la pagina, pero no se si funciona o no. Pienso que es un no por que a pesar de que esta el codigo y de que creo que NO estoy logeado la pagina si abre y no me da el anuncio de "necesitas estar logeado"
P.D: tengo el login.php y esta dentro del servidor de la pagina ademas de que el codigo de bloqueo esta en la parte BODY de la pagina, hay algo que este haciendo mal?

EDIT: ya quedo el problema arriba XD solo unas pruebas de ensayo/error
solo tengo una duda mas....si perdon por ser un pregunton.
El usuario @skaparate subio el siguiente codigo
<?php session_start(); ?>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<!-- Sólo si el usuario no ha iniciado sesión se muestra el formulario de ingreso -->
<?php if( ! isset( $_SESSION['logged_in'] ) || $_SESSION['logged_in'] === false ) : ?>
<form action="login.php" method="get">
<input type="text" name="user" />
<input type="password" name="pass" />
<input type="submit" name="submitBtn" />
</form>
<?php else : ?>
<!-- De lo contrario se muestra un div con la información básica del usuario -->
<div id="logged-in">
<p>Usuario: <?php echo ucwords( $_SESSION['user_name'] ); ?></p>
<p><a href="logout.php">Salir</a>
</div>
<?php endif; ?>
<?php if( isset( $_GET['msg' ] ) ) : ?>
<div class="error-msg"><!-- Aquí muestras los posibles errores -->
<p><?php echo $_GET['msg']; ?></p>
</div>
<?php endif; ?>
</body>
y de lo poco que entiendo codigos, es como para que la pagina web te detecte siempre como conectado y puedas ver tu usuario, algo asi como esta pagina?, de no se rasi como se hace ese codigo?