Hola

Pues ahora que esta de moda esto del Ajax, aquí les traigo un sistema de login hecho con PHP y Ajax que funciona a la perfección. Es muy simple la verdad y solo es de entender como funciona básicamente, y para implementarlo solo necesitas agregarle unas 5 lineas de código con los datos de tu Base de Datos donde guardas los datos del usuario que desea iniciar sesión.

Aquí te dejo un link donde puedes ver funcionando en linea el Sistema de Login en Ajax

DEMO EN LINEA

Y bueno, una vez que te das a la idea de como queda el sistema, vamos con la explicación y el codigo fuente:

Mira iré explicando paso a paso lo que se necesita:
Primero tienes que tener en cuenta que se necesitaran 2 archivos: login.php que es donde aparecerá el formulario para que introduzca los datos el user, y otro es checar.php que será donde se verificará mediante ajax, que los datos introducidos por el user sean correctos.

El archivo login.php contiene esto:
NOTA: mas abajo lo iré explicando paso a paso

HTML:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <META NAME="Language" CONTENT="Spanish">
  4. <title>Recursos Del Web - Sistema De Login (Logeo) En Ajax</title>
  5. </head>
  6. <script language="javascript">
  7.     <!--      
  8.       /*
  9.       Esta funcion lo que hace es enviar mediante Ajax, por el metodo post, los datos (user y pass) a un archivo "checar.php" para ser comparados en la base de datos. De ser correctos se dará mensaje de bienvenida, sino, entonces marcara error de usuario o password incorrectos
  10.       */
  11.       function POST_AJAX(url, variables) {
  12.         objeto = false;
  13.         //creamos el onjeto XMLHttpRequest para poder enviar datos mediante ajax
  14.         if (window.XMLHttpRequest) { // Mozilla, Safari,...
  15.            objeto = new XMLHttpRequest();
  16.            if (objeto.overrideMimeType) {
  17.             objeto.overrideMimeType('text/xml');
  18.            }
  19.         } else if (window.ActiveXObject) { // IE
  20.            try {
  21.               objeto = new ActiveXObject("Msxml2.XMLHTTP");
  22.            } catch (e) {
  23.               try {
  24.                  objeto = new ActiveXObject("Microsoft.XMLHTTP");
  25.               } catch (e) {}
  26.            }
  27.         }
  28.         if (!objeto) {
  29.            alert("No se puede crear la instancia XMLHTTP");
  30.            return false;
  31.         }
  32.             
  33.         objeto.onreadystatechange = avisos;    /*Cuando el archivo que se mando llamar mediante ajax (checar.php) regrese un resultado, entonces lo primero que se hace es mandar llamar la funcion avios(), que es donde se imprimirá mensaje de bienvenida*/
  34.         objeto.open("POST", url, true);  /* enviaremos los datos por el metodo POST hacia checar.php */
  35.         objeto.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); /*asignamos header. Esto no tiene relacion con el sistema de logeo. Solo es necesario para poder enviar los datos mediante ajax*/
  36.         objeto.setRequestHeader("Content-length", variables.length);
  37.         objeto.setRequestHeader("Connection", "close");
  38.         objeto.send(variables); /* enviamos las variables con un formato como este: "user=minombre&pass=123456&n=0" */
  39.       }
  40.       
  41.       
  42.       /* Esta funcion lo unico que hace, es acomodar los datos introducidos en el formulario a una cadena "variables" con este formato: "user=minombre&pass=123456&n=0" o este "n=0"
  43.       NOTA:
  44.       n=1 significa que el formulario esta siendo enviado por el usuario (es decir que en este punto, el ususario previamente tuvo que haber introducido su user y pass y despues presionado el boton "enviar").
  45.       n=0 significa que el formulario se esta enviando automaticamente cuando se carga la pagina. Esto lo hace para verificar si ya se habia logeado un usuario, entonces en cuanto se cargue la pagina, ya no le pedira su user y pass... ahora solo imprimirá mensaje de bienvenida. Es decir que si se logea, cierra el navegador sin haber cerrado sesion y en 3 dias por ejemplo vuelve a entrar a la pagina, lo que se le imprimirá será un mensaje de bienvenida, ya que no cerro sesion la ultima vez que salio. Esto solo dura una semana, es decir que las COOKIES de user y pass expiraran una semana despues de haber sido creadas.
  46.       */
  47.       function enviar(id_form,n) { 
  48.         if (n=='1') //si el formulario fue enviado al darle en el boton
  49.          {
  50.           document.getElementById('inp_enviar').innerHTML = '<input type="submit" class="MC_enviar" name="enviar" value="Enviar"/><img src="ajax.gif"/>';
  51.           if (vacio(document.getElementById(id_form).user.value)==false || vacio(document.getElementById(id_form).pass.value)==false)/*si alguno de los campos de user y pass estan vacios, entonces se imprime mensaje de error. NOTA: vacio() es una funcion que verifica que alla algo diferente a "" o puros espacios en blanco. Esta funcion esta mas abajo*/
  52.            {
  53.             document.getElementById('r').innerHTML = '<label class="res">Llena correctamente los campos</label>'; //"r" es un div que tenemos debajo del formulario para imprimir los mensajes de error.
  54.             document.getElementById('inp_enviar').innerHTML = '<input type="submit" class="MC_enviar" name="enviar" value="Enviar"/>';
  55.            }
  56.           else //sí SI habia llenado correctamente el user y pass, entonces se crear una cadena "variables" con los datos de user y pass con el siguiente formato: "user=minombre&pass=123456&n=0"
  57.            {
  58.             var Formulario = document.getElementById(id_form);
  59.             var longitudFormulario = Formulario.elements.length;
  60.             var variables = "";
  61.             var sepCampos = "";
  62.             for (var i=0; i<=Formulario.elements.length-1; i++)
  63.               {
  64.                variables += sepCampos+Formulario.elements[i].name + '=' + encodeURI(Formulario.elements[i].value);
  65.                sepCampos="&";
  66.               }
  67.             //indice para saber si envio formulario
  68.             variables += '&n=' + n;
  69.             POST_AJAX('checar.php', variables); //se envia el nombre del archivo donde se verificaran los datos en la BD y la cadena que se acaba de crear con los datos de user y pass, hacia la funcion POST_AJAX, que lo que hace es enviar los datos por medio de AJAX utilizando el metodo POST hacia "checar.php"
  70.            }
  71.          }
  72.         else //si el formulario fue enviado automaticamente solo para procesos
  73.          {
  74.             variables = 'n=' + n;
  75.             POST_AJAX('checar.php', variables);
  76.          }
  77.       }
  78.    
  79.       function avisos() {
  80.          if ((objeto.readyState==4) && (objeto.status==200))                     
  81.            {
  82.             document.getElementById('form').innerHTML = objeto.responseText;  //se inserta en el DIV "form" el mensaje de bienvenida que nos imprimio "checar.php"                   
  83.            }//end if
  84.       }
  85.       
  86.      enviar('login','0'); //se envia a la funcion "enviar()" el id del formulario y el valor 0 (cero); Este valor (0) nos indicará que el formulario esta siendo enviado cuando la pagina se esta cargando apenas. NO lo esta enviando el usuario
  87.     
  88.       /*Esta funcion recorre una cadena en busca de algo diferente de espacios en blanco. Si la cadena contenia puros espacios en blanco entonces regresara False*/
  89.       function vacio(q) {
  90.          for ( i = 0; i <q.length; i++ ) {
  91.            if ( q.charAt(i) != " " ) { return true }
  92.          }
  93.          return false
  94.       }
  95.     -->
  96. </script>
  97.  
  98. <style type="text/css">
  99.   #contenido{
  100.     margin:0 auto;
  101.     margin-top:50px;
  102.     width:275px;
  103.     padding:15px;
  104.     border:solid 1px #990000;
  105.     font-family:Arial, Helvetica, sans-serif;
  106.     color:#990000;
  107.   }
  108.  
  109.   #contenido label{
  110.     font-size:18px;
  111.     width:200px;
  112.   }
  113.  
  114.   .MC_input{
  115.     font-size:18px;
  116.     color:#000000;
  117.     width:180px;
  118.     height:25px;
  119.     margin-right:10px;
  120.     margin-bottom:6px;
  121.   }
  122.  
  123.   .MC_enviar{
  124.      width:80px;
  125.      height:34px;
  126.      font-size:18px;
  127.      margin-right:10px;
  128.   }
  129.  
  130.   #labels{
  131.     float:left;
  132.     width:90px;
  133.   }
  134.  
  135.   #lbl_user{
  136.     margin-top:10px;
  137.     margin-bottom:10px;
  138.   }
  139.  
  140.   #inputs{
  141.     float:right;
  142.     width:180px;
  143.   }
  144.  
  145.   #inp_enviar{
  146.     margin-bottom:10px;
  147.   }
  148.  
  149.   .res{
  150.     color:#FF0000;
  151.   }
  152.  
  153.   #texto{
  154.     font-size:12px;
  155.   }
  156.  
  157.   #texto a{
  158.     font-size:14px;
  159.   }
  160. </style>
  161.  
  162.     <div id="contenido">
  163.       <div id="texto">
  164.         <p>Este es el demo en linea del Sistema De Login en Ajax.</p>
  165.         <p>Para ver el codigo fuente y la expliaci&oacute;n ve a <a href="http://www.recursosdelweb.com/" target="_blank">Recursos Del Web</a></p>
  166.         <p>Para ver su funcionamiento, trata con los siguientes datos:</p>
  167.         <p>User=admin<br />
  168.         Password=123456 </p>
  169.       </div>
  170.       <div id="form"></div>
  171.     </div>
  172. </body>
  173. </html>

Como podrás ver, el codigo esta bien comentado, pero como sea lo explicaré:

Y bueno vamos explicandolo paso por paso. Primero como veras tenemos varias funciones JavaScript: la primera (POST_AJAX()) es esta:

JavaScript:
  1. /*
  2.       Esta funcion lo que hace es enviar mediante Ajax, por el metodo post, los datos (user y pass) a un archivo "checar.php" para ser comparados en la base de datos. De ser correctos se dará mensaje de bienvenida, sino, entonces marcara error de usuario o password incorrectos
  3.       */
  4.       function POST_AJAX(url, variables) {
  5.         objeto = false;
  6.         //creamos el onjeto XMLHttpRequest para poder enviar datos mediante ajax
  7.         if (window.XMLHttpRequest) { // Mozilla, Safari,...
  8.            objeto = new XMLHttpRequest();
  9.            if (objeto.overrideMimeType) {
  10.             objeto.overrideMimeType('text/xml');
  11.            }
  12.         } else if (window.ActiveXObject) { // IE
  13.            try {
  14.               objeto = new ActiveXObject("Msxml2.XMLHTTP");
  15.            } catch (e) {
  16.               try {
  17.                  objeto = new ActiveXObject("Microsoft.XMLHTTP");
  18.               } catch (e) {}
  19.            }
  20.         }
  21.         if (!objeto) {
  22.            alert("No se puede crear la instancia XMLHTTP");
  23.            return false;
  24.         }
  25.             
  26.         objeto.onreadystatechange = avisos;    /*Cuando el archivo que se mando llamar mediante ajax (checar.php) regrese un resultado, entonces lo primero que se hace es mandar llamar la funcion avios(), que es donde se imprimirá mensaje de bienvenida*/
  27.         objeto.open("POST", url, true)/* enviaremos los datos por el metodo POST hacia checar.php */
  28.         objeto.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); /*asignamos header. Esto no tiene relacion con el sistema de logeo. Solo es necesario para poder enviar los datos mediante ajax*/
  29.         objeto.setRequestHeader("Content-length", variables.length);
  30.         objeto.setRequestHeader("Connection", "close");
  31.         objeto.send(variables); /* enviamos las variables con un formato como este: "user=minombre&pass=123456&n=0" */
  32.        }

Lo que hace esta función es crear el objeto XMLHttpRequest para poder enviar datos mediante Ajax por metodo POST. Despues asigna las cabeceras para que nada falle y envia las variables (user y pass) a checar.php donde serán recibidas para compararlas en la BD y verificar si los datos son correctos. Checa el codigo, ahi esta bien comentado linea por linea.

Despues tenemos esta funcion:

JavaScript:
  1. /* Esta funcion lo unico que hace, es acomodar los datos introducidos en el formulario a una cadena "variables" con este formato: "user=minombre&pass=123456&n=0" o este "n=0"
  2.       NOTA:
  3.       n=1 significa que el formulario esta siendo enviado por el usuario (es decir que en este punto, el ususario previamente tuvo que haber introducido su user y pass y despues presionado el boton "enviar").
  4.       n=0 significa que el formulario se esta enviando automaticamente cuando se carga la pagina. Esto lo hace para verificar si ya se habia logeado un usuario, entonces en cuanto se cargue la pagina, ya no le pedira su user y pass... ahora solo imprimirá mensaje de bienvenida. Es decir que si se logea, cierra el navegador sin haber cerrado sesion y en 3 dias por ejemplo vuelve a entrar a la pagina, lo que se le imprimirá será un mensaje de bienvenida, ya que no cerro sesion la ultima vez que salio. Esto solo dura una semana, es decir que las COOKIES de user y pass expiraran una semana despues de haber sido creadas.
  5.       */
  6.       function enviar(id_form,n) { 
  7.         if (n=='1') //si el formulario fue enviado al darle en el boton
  8.          {
  9.           document.getElementById('inp_enviar').innerHTML = '<input type="submit" class="MC_enviar" name="enviar" value="Enviar"/><img src="ajax.gif"/>';
  10.           if (vacio(document.getElementById(id_form).user.value)==false || vacio(document.getElementById(id_form).pass.value)==false)/*si alguno de los campos de user y pass estan vacios, entonces se imprime mensaje de error. NOTA: vacio() es una funcion que verifica que alla algo diferente a "" o puros espacios en blanco. Esta funcion esta mas abajo*/
  11.            {
  12.             document.getElementById('r').innerHTML = '<label class="res">Llena correctamente los campos</label>'; //"r" es un div que tenemos debajo del formulario para imprimir los mensajes de error.
  13.             document.getElementById('inp_enviar').innerHTML = '<input type="submit" class="MC_enviar" name="enviar" value="Enviar"/>';
  14.            }
  15.           else //sí SI habia llenado correctamente el user y pass, entonces se crear una cadena "variables" con los datos de user y pass con el siguiente formato: "user=minombre&pass=123456&n=0"
  16.            {
  17.             var Formulario = document.getElementById(id_form);
  18.             var longitudFormulario = Formulario.elements.length;
  19.             var variables = "";
  20.             var sepCampos = "";
  21.             for (var i=0; i<=Formulario.elements.length-1; i++)
  22.               {
  23.                variables += sepCampos+Formulario.elements[i].name + '=' + encodeURI(Formulario.elements[i].value);
  24.                sepCampos="&";
  25.               }
  26.             //indice para saber si envio formulario
  27.             variables += '&n=' + n;
  28.             POST_AJAX('checar.php', variables); //se envia el nombre del archivo donde se verificaran los datos en la BD y la cadena que se acaba de crear con los datos de user y pass, hacia la funcion POST_AJAX, que lo que hace es enviar los datos por medio de AJAX utilizando el metodo POST hacia "checar.php"
  29.            }
  30.          }
  31.         else //si el formulario fue enviado automaticamente solo para procesos
  32.          {
  33.             variables = 'n=' + n;
  34.             POST_AJAX('checar.php', variables);
  35.          }
  36.       }

Esta funcion lo unico que hace, es acomodar los datos introducidos en el formulario a una cadena "variables" con este formato: "user=minombre&pass=123456&n=0" o este "n=0"

NOTA:
n=1 significa que el formulario esta siendo enviado por el usuario (es decir que en este punto, el ususario previamente tuvo que haber introducido su user y pass y despues presionado el boton "enviar").
n=0 significa que el formulario se esta enviando automaticamente cuando se carga la pagina.

Esto lo hace para verificar si ya se habia logeado un usuario, entonces en cuanto se cargue la pagina, ya no le pedira su user y pass... ahora solo imprimirá mensaje de bienvenida. Es decir que si se logea, cierra el navegador sin haber cerrado sesion y en 3 dias por ejemplo vuelve a entrar a la pagina, lo que se le imprimirá será un mensaje de bienvenida, ya que no cerro sesion la ultima vez que salio. Esto solo dura una semana, es decir que las COOKIES de user y pass expiraran una semana despues de haber sido creadas.

Enseguida tenemos esto:

JavaScript:
  1. function avisos() {
  2.          if ((objeto.readyState==4) && (objeto.status==200))                     
  3.            {
  4.             document.getElementById('form').innerHTML = objeto.responseText//se inserta en el DIV "form" el mensaje de bienvenida que nos imprimio "checar.php"                   
  5.            }//end if
  6.       }

Esta función se ejecutará cuando el archivo checar.php le responda a login.php mediante ajax, es decir cuando se reciba el responseText. Y lo único que se hace es insertar en el div "form" el texto que se imprimió en el archivo checar.php, que depende de lo que alla sucedido:
-Si el usuario está queriendo iniciar sesión y los datos de user y pass fueron correctos; entonces se imprime el mensaje de bienvenida.
-Si el ususario está queriendo iniciar sesion y los datos de user y pass fueron incorrectos; entonces se imprime el mensaje de error.
-Si el formulario se acaba de terminar de cargar y ya se había logeado alguien, entonces imprime mensaje de bienvenida.
-Si el formulario se acaba de terminar de cargar y no se había logeado alguien, entonces imprime el formulario para que el user inicie sesión.

Estas son los posibles resultados que le pueden llegar en el responseText mediante Ajax.

Enseguida como podrás ver, se manda llamar a la función enviar() pasandole como parámetros el nombre del formulario y el valor de la bandera "n" que en este caso será 0 para indicar que la pagina esta enviando el formulario (NO el user) para verificar si ya se había logueado alguien.

JavaScript:
  1. enviar('login','0'); /*se envia a la funcion "enviar()" el id del formulario y el valor 0 (cero); Este valor (0) nos indicará que el formulario esta siendo enviado cuando la pagina se esta cargando apenas. NO lo esta enviando el usuario*/

Finalmente tenemos una función Vacio() que simplemente recorre una cadena caracter por caracter en busca de espacios en blanco, si alla algo de texto regresa true, sino regresa false. Esta solo la usamos para verificar que el user alla introducido correctamente los datos de user y pass.

JavaScript:
  1. /*Esta funcion recorre una cadena en busca de algo diferente de espacios en blanco. Si la cadena contenia puros espacios en blanco entonces regresara False*/
  2.       function vacio(q) {
  3.          for ( i = 0; i <q.length; i++ ) {
  4.            if ( q.charAt(i) != " " ) { return true }
  5.          }
  6.          return false
  7.       }

Despues unicamente tenemos el estilo (CSS) y el html. Notar que tenemos un div "form" vacio, que es donde se insertara la respuesta que nos llegue mediando Ajax de checar.php

Ahora vamos con checar.php
Este es el codigo:
NOTA: mas abajo lo explicare paso por paso

PHP:
  1. ob_start(); //esto es para habilitar el buffer de salida. Esto para poder enviar las cookies al navegador sin que te marque error
  2.  
  3. //Desconectar
  4. if ($_POST["n"]=='2') //si n=2 significa que el usuario ya habia iniciado sesion y ahora esta cerrando sesion
  5.  {
  6.   setcookie("Nick"); //borramos el valor de las cookies
  7.   setcookie("Pass")
  8.   $aux="'login','0'";
  9.   header("location: checar.php"); //redireccionamos a este mismo archivo nuevamente
  10.  }
  11. $n=$_COOKIE["Nick"]; //sí el usuario ya habia iniciado sesion, $n y $p contendran el user y pass de ese usuario
  12. $p=$_COOKIE["Pass"];
  13.  
  14. /*
  15. NOTA: esta sentencia SQL es un ejemplo de lo que puedes hacer para checar que sea correcto el user y pass. Yo por el momento lo haré manualmente con el user=admin y pass=123456
  16. $sql=mysql_query("SELECT * FROM usuarios1 WHERE user='$n' AND pass='$p'") or die (mysql_error());
  17. $total=mysql_num_rows($sql);
  18. if (mysql_num_rows($sql)==0) //si NO ha iniciado sesion   
  19. */
  20. if ($n!='admin' or $p!='123456') //si NO ha iniciado sesion [NOTA: esta linea borrala y sustituyela por las de arriba pero con la sentencia SQL con tu tabla y campos]
  21.   {
  22.    if ($_POST["n"]=='1') //si el user ya envio el formulario
  23.     {
  24.      $usuario=$_POST["user"]//recivimos datos enviados desde login.php mediante post usando ajax
  25.      $contraseña=$_POST["pass"];
  26.      /*
  27.      NOTA: este seria un ejemplo de la sentencia SQL que va aqui. Por el momento yo lo hare manualmente usando user=admin y pass=123456
  28.       
  29.      $cad=mysql_query("SELECT * FROM usuarios1 WHERE user='$usuario' AND pass_md5='$contraseña'") or die (mysql_error());
  30.      if (mysql_num_rows($cad)==0) //Si es INCORRECTO el user y pass
  31.      */
  32.      if ($usuario!='admin' or $contraseña!='123456') //Si es INCORRECTO el user y pass
  33.        { 
  34.        //echo '3';  //el usuario o pass son incorrectos... imprimimos formulario y mensaje de error
  35.        echo '<form action="javascript: enviar(\'login\',\'1\');" name="login" id="login">
  36.           <div id="labels">
  37.             <div id="lbl_user"><label>Usuario</label></div>
  38.             <div id="lbl_pass"><label>Password</label></div>
  39.           </div>
  40.           
  41.           <div id="inputs">
  42.             <div id="inp_user"><input name="user" class="MC_input" id="user" type="text" maxlength="30" /></div>
  43.             <div id="inp_pass"><input name="pass" class="MC_input" id="pass" type="password" maxlength="30" /></div>
  44.             <div id="inp_enviar"><input type="submit" class="MC_enviar" name="enviar" value="Enviar"/></div>
  45.           </div>
  46.           
  47.           <div style="clear:both;"></div>
  48.           
  49.           <div id="inp_r"><label id="r" class="res">Usuario o password incorrectos</label></div>
  50.         </form>';   
  51.        }
  52.      else //si todo salio bien
  53.        {
  54.         setcookie("Nick", $usuario, time()+604800); //enviamos las cookies al nacegador [expiraran dentro de una semana]
  55.         setcookie("Pass", $contraseña, time()+604800)
  56.         //echo '1'; //damos bienvenida
  57.         echo '<form action="javascript: enviar(\'login\',\'1\');" name="login" id="login">
  58.           <div id="inp_r"><label>Bienvenid@ '.$usuario.'</label></div>
  59.           <div id="salir"><a href="javascript: enviar(\'login\',\'2\');">Cerrar sesion</a></div>
  60.         </form>';   
  61.        }
  62.     }
  63.    else //si NO ha enviado el formulario      
  64.     { 
  65.      //echo '2'; //no ha enviado formulario... imprimimos formulario
  66.      echo '<form action="javascript: enviar(\'login\',\'1\');" name="login" id="login">
  67.           <div id="labels">
  68.             <div id="lbl_user"><label>Usuario</label></div>
  69.             <div id="lbl_pass"><label>Password</label></div>
  70.           </div>
  71.           
  72.           <div id="inputs">
  73.             <div id="inp_user"><input name="user" class="MC_input" id="user" type="text" maxlength="30" /></div>
  74.             <div id="inp_pass"><input name="pass" class="MC_input" id="pass" type="password" maxlength="30" /></div>
  75.             <div id="inp_enviar"><input type="submit" class="MC_enviar" name="enviar" value="Enviar"/></div>
  76.           </div>
  77.           
  78.           <div style="clear:both;"></div>
  79.           
  80.           <div id="inp_r"><label id="r" class="res"></label></div>
  81.         </form>';   
  82.     }
  83.   }
  84. else //si ya inicio sesion
  85.   { 
  86.    //echo '1'; //damos bienvenida
  87.     echo '<form action="javascript: enviar(\'login\',\'1\');" name="login" id="login">
  88.           <div id="inp_r"><label>Bienvenid@ '.$_COOKIE["Nick"].'</label></div>
  89.           <div id="salir"><a href="javascript: enviar(\'login\',\'2\');">Cerrar sesion</a></div>
  90.         </form>';
  91.   }
  92.    
  93. ob_end_flush(); //esto va para poder enviar headers al navegador sin tener problemas

Como podrás ver el codigo esta muy bien comentado así que de este archivo no explicaré mucho.

En pocas palabras lo que sucede aquí es lo siguiente:

  • Primero preguntamos si la bandera recibida "n" es igual a 2, significa que el ususario esta cerrando sesion, así que eliminamos las cookies y redireccionamos nuevamente a checar.php
  • Asignamos a $n y $p las cookies (si las cookies ya existian, $n y $p contendran los datos del ultimo user y pass que se habia logueado, Asi que solo se imprimirá mensaje de bienvenida; de lo contrario se verificará si los nuevos datos que estan llegando son correctos)
  • Si la bandera "n" es igual a 1 entonces significa que el user esta enviando el formulario con sus datos; por lo tanto se verifica que sus datos sean correctos; si son correctos, se crean las cookies con esos datos y se imprime mensaje de bienvenida, si son incorrectos se imprime mensaje de error.
  • Si la bandera "n" es igual a 0 y no se ha iniciado sesion entonces se imprime el formulario.
  • Si ya se inicio sesion, entonces se imprime mensaje de bienvenida.

Basicamente asi quedaría todo.
Aquí te dejo los archivos para que los descargues y ya me cuentas como te fue :P

Saludos!