2010-04-24 32 views
5

Estoy tratando de usar una cookie con autenticación.cookie php no funciona

Esta página funciona una vez que entra usuario y pass

<? 
    if ((!$_POST[username]) || (!$_POST[password])) { 
     header("Location: show_login.html"); 
     exit; 
    } 
    $db_name = "testDB"; 
    $table_name = "auth_users"; 
    $connection = @mysql_connect("localhost", "user", "pass") or die(mysql_error()); 
    $db = @mysql_select_db($db_name, $connection) or die(mysql_error()); 
    $sql = "SELECT * FROM $table_name WHERE username ='$_POST[username]' AND password = password('$_POST[password]')"; 
    $result = @mysql_query($sql, $connection) or die(mysql_error()); 
    $num = mysql_num_rows($result); 
     if ($num != 0) { 
      $cookie_name = "auth"; 
      $cookie_value = "ok"; 
      $cookie_expire = "0"; 
      $cookie_domain = "domain.com.au"; 
      setcookie($cookie_name, $cookis_value, $cookie_expire, "/", $cookie_domain, 0); 
      $display_block = " 
      <p><strong>Secret Menu:</strong></p> 
      <ul> 
       <li><a href=\"secretA.php\">secret page A</a> 
       <li><a href=\"secretB.php\">secret page B</a> 
      </ul>"; 
     } else { 
      header("Location: show_login.html"); 
      exit; 
     } 
    ?> 

    <!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="text/html; charset=utf-8" /> 
    <title>Secret Area</title> 
    </head> 

    <body> 
    <? echo "$display_block"; ?> 


    </body> 
    </html> 

al hacer clic en cualquiera de los dos o secretA.php secretB.php estoy redirigido a conectarse de nuevo, debería funcionar. aquí está el código. secretB.php

<?php 

if ($_COOKIE[auth] == "ok") { 
    $msg = "<p>Welcome to secret page B, authorised user! </P>"; 
} else { 
    header("Location: /show_login.html"); 
    exit; 
} 
?> 
<HTML> 
<HEAD> 
<title>Secret Page B:</title> 
</HEAD> 
<BODY> 

<? echo "$msg"; ?> 

</BODY> 
</HTML> 
+0

En 'secretB.php' do' var_dump ($ _ COOKIE) 'y publicar resultados aquí. – hsz

+0

hay una manera sin hacerlo, ya que estoy trabajando en algunos ejemplos de un libro que no usa más código que este – Jacksta

+0

Este 'var_dump' comprobará si se han configurado cookies. – hsz

Respuesta

1

Esta si el gran ejemplo de código malo.
Gracias por publicarlo. Mucha gente puede leerlo y aprender de esto.

Déjame explicarte.
PHP puede ayudarte a encontrar algunos errores oscuros. No todos, sino algunos de ellos.
Por ejemplo, si escribió mal un nombre de variable, PHP arrojará un error ... por supuesto si deja que PHP lo diga.
Para que todos los errores sean visibles, se debe maximizar el nivel de informe de errores. Para hacerlo, cada guión debe contener esta línea:

error_reporting(E_ALL); 

después de agregar que, si fue escrito el código correctamente, se podría ver solamente un mensaje de error señalando a la variable mal escrita. Pero.
En cambio, verá una cascada de errores. Porque PHP no puede distinguir los errores intencionales de los ocasionales.

Así. No debe haber errores intencionales en el código, para permitirle ver ocasionalmente.
Esta es la gran lección que vale la pena recordar.

¿Cuáles son estos errores?

  1. Cadenas en php que se delimitan por comillas.
    Por lo tanto, si tiene una cadena username, debe escribirse como "username".
    Y $ _POST [nombre de usuario] se convierte en $ _POST ["username"].
    (y al contrario, las variables no necesitan comillas, por lo tanto, echo "$msg"; debe ser echo $msg;)
  2. todas las variables deben establecerse o verificar su existencia. así,
    if ((!$_POST[username]) || (!$_POST[password])) {
    debe convertirse en
    if (!empty($_POST["username"]) OR !empty($_POST["password"])) {

Con un código de este tipo sólo verá error ocasional y ser capaz de corregir de inmediato.

+0

Gracias por takign el momento de publicar esa información. será una gran ayuda a largo plazo. aplausos – Jacksta

1

A veces es la solución más simple. Lo mismo me pasó a mí. Me estaba ejecutando en localhost (wampserver). Descubrí que mi firewall estaba bloqueando todas las solicitudes de cookies de localhost. Usé ZoneAlarm en ese momento, pero supongo que otros firewalls podrían tener el mismo efecto. Intenta deshabilitar tu firewall para ver si todavía no funciona.

+0

Hola gracias por la sugerencia, en realidad estoy ejecutando esto en un servidor en vivo. – Jacksta

+0

un programador siempre debe ir no por la solución más simple sino por la depuración –

1
try this : 
    <?php 
    if (isset($_POST['username']) and isset($_POST['password'])) 
    { 

    $db_name = "testDB"; 
    $table_name = "auth_users"; 
    $connection = @mysql_connect("localhost", "user", "pass") or die(mysql_error()); 
    $db = @mysql_select_db($db_name, $connection) or die(mysql_error()); 
    $sql = "SELECT * FROM $table_name WHERE username ='".$_POST['username']."' AND password = password('".$_POST['password']."')"; 
    $result = @mysql_query($sql, $connection) or die(mysql_error()); 
    $num = mysql_num_rows($result); 
     if ($num != 0) { 
      $cookie_name = "auth"; 
      $cookie_value = "ok"; 
      $cookie_expire = "0"; 
      $cookie_domain = "domain.com.au"; 
      setcookie($cookie_name, $cookis_value, $cookie_expire, "/", $cookie_domain, 0); 
      $display_block = " 
      <p><strong>Secret Menu:</strong></p> 
      <ul> 
       <li><a href=\"secretA.php\">secret page A</a> 
       <li><a href=\"secretB.php\">secret page B</a> 
      </ul>"; 
     } else { 
      header("Location: show_login.html"); 
      exit; 
     }; 


    } 
    else 
    { 
    header("Location: show_login.html"); 
    exit; 
    }; 
+0

aún el resultado sajme = ¡inicie sesión de nuevo! gracias por la sugerencia – Jacksta

+0

sigue siendo el mismo error lol –

0

establecer la cookie con php como esta Probar:

setcookie(<name>,<value>, time()+3600*24); 

A veces, en localhost, las galletas no se establecen mediante: $_COOKIE[<name>] = <value>

2

Aquí hay algo que le haya ensuciado ...

setcookie($cookie_name,$cookis_value, $cookie_expire, "/", $cookie_domain, 0);