2010-04-24 24 views
5

J'essaie d'utiliser un cookie avec authentification.cookie php ne fonctionne pas

Cette page fonctionne une fois l'entrée utilisateur et passer

<? 
    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> 

en cliquant sur soit secretA.php ou secretB.php je suis redirigé vers vous connecter à nouveau, il devrait fonctionner. voici le code. 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

Dans 'secretB.php', faites' var_dump ($ _ COOKIE) 'et publiez le résultat ici. – hsz

+0

est-il un moyen sans le faire, comme je travaille de quelques exemples d'un livre qui n'utilise plus de code alors – Jacksta

+0

Cette 'var_dump' va vérifier si des cookies sont définis. – hsz

Répondre

1

Ce si grand exemple de mauvais code.
Merci de l'avoir posté. Beaucoup de gens peuvent le lire et apprendre de cela.

Laissez-moi vous expliquer.
PHP peut vous aider à trouver quelques erreurs obscures. Pas tous mais certains d'entre eux.
Par exemple, si vous avez tapé un nom de variable, PHP va lancer une erreur ... bien sûr si vous laissez PHP dire.
Pour rendre chaque erreur visible, le niveau de signalisation d'erreur doit être maximal. Pour ce faire, chaque script doit contenir cette ligne:

error_reporting(E_ALL); 

après avoir ajouté, si elle était correctement le code écrit, vous verriez un seul message d'erreur indiquant la variable mal orthographié. Mais. Au lieu de cela, vous verrez une cascade d'erreurs. Parce que PHP ne peut pas distinguer les erreurs intentionnelles des erreurs occasionnelles.

Ainsi. Il ne doit pas y avoir d'erreurs intentionnelles dans le code, pour vous permettre de voir des erreurs occasionnelles.
C'est la grande leçon à retenir.

Quelles sont ces erreurs?

  1. cordes en php étant délimitées par des guillemets. Par conséquent, si vous avez une chaîne username, elle doit être écrite "username".
    Et $ _POST [nom d'utilisateur] devient $ _POST ["nom d'utilisateur"].
    (et, au contraire, les variables n'ont pas besoin de guillemets, donc, echo "$msg"; doit être echo $msg;)
  2. Toutes les variables doivent être définies ou vérifiées pour leur existence. donc,
    if ((!$_POST[username]) || (!$_POST[password])) {
    doit devenir
    if (!empty($_POST["username"]) OR !empty($_POST["password"])) {

Avec un tel code, vous verrez que l'erreur occasionnelle et être en mesure de le corriger immédiatement.

+0

Merci de prendre le temps de poster cette info. sera une aide précieuse à long terme. Bravo – Jacksta

1

Parfois, c'est la solution la plus simple. Il m'est arrivé la même chose. Je courais sur localhost (wampserver). J'ai découvert que mon pare-feu bloquait toutes les demandes de cookie de localhost. J'ai utilisé ZoneAlarm à l'époque mais je suppose que d'autres firewalls pourraient avoir le même effet. Essayez de désactiver votre pare-feu pour voir si cela ne fonctionne toujours pas.

+0

Salut merci pour le conseil, je suis en fait runnign sur un serveur en direct. – Jacksta

+0

un programmeur doit toujours aller pas pour la solution la plus simple, mais pour le débogage –

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

toujours le résultat sajme = se reconnecter! merci pour la suggestion – Jacksta

+0

toujours la même erreur lol –

0

Essayez le réglage du cookie avec php comme ceci:

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

Parfois, dans localhost, les cookies ne sont pas définies à l'aide: $_COOKIE[<name>] = <value>

2

Voici quelque chose que vous pourriez avoir foiré ...

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