2010-04-24 30 views
5

Próbuję użyć pliku cookie z uwierzytelnieniem.Plik cookie php nie działa

Ta strona działa po wejściu użytkownika i przekazać

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

Po kliknięciu na opcję secretA.php lub secretB.php jestem przekierowany zalogować się ponownie, to powinno działać. tutaj jest kod. 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

W 'secretB.php' wykonaj' var_dump ($ _ COOKIE) ', a następnie wpisz wynik. – hsz

+0

jest sposób bez tego, ponieważ pracuję nad przykładami z książki, która nie używa więcej kodu niż ta – Jacksta

+0

Ten 'var_dump' sprawdzi, czy są ustawione jakiekolwiek pliki cookie. – hsz

Odpowiedz

1

Ten jeżeli doskonałym przykładem złego kodu.
Dzięki za opublikowanie. Wiele osób może je przeczytać i uczyć się z tego.

Pozwól mi wyjaśnić.
PHP może pomóc znaleźć pewne niejasne błędy. Nie każdy oprócz niektórych.
Na przykład, jeśli źle wpisałeś nazwę zmiennej, PHP wyświetli błąd ... oczywiście, jeśli pozwolisz PHP na wypowiedzenie.
Aby każdy błąd był widoczny, poziom raportowania błędów musi być maksymalny. Aby to zrobić, każdy skrypt musi zawierać wiersz:

error_reporting(E_ALL); 

po jej dodać, jeśli został prawidłowo napisany kod, można zobaczyć tylko jeden komunikat o błędzie wskazujący na zmienną literówka. Ale.
Zamiast tego zobaczysz wodospad błędów. Ponieważ PHP nie może odróżnić błędów celowych od okazjonalnych.

Tak. Nie może to być celowe błędy w kodzie, pozwalające zobaczyć przypadkowe.
To jest wspaniała lekcja warta zapamiętania.

Co to są te błędy?

  1. Łańcuchy w php rozdzielane są przez cudzysłowy.
    Tak więc, jeśli masz ciąg username, musi on być zapisany jako "username".
    Oraz $ _POST [nazwa użytkownika] stają się $ _POST ["nazwa użytkownika"].
    (i przeciwnie, zmienne nie wymagają cytatów, więc echo "$msg"; musi być echo $msg;)
  2. wszystkie zmienne muszą być ustawione lub sprawdzone pod względem istnienia. tak,
    if ((!$_POST[username]) || (!$_POST[password])) {
    musi stać
    if (!empty($_POST["username"]) OR !empty($_POST["password"])) {

Z takim kodem widać jedynie okazjonalny błąd i być w stanie go naprawić natychmiast.

+0

Dzięki za takign czas, aby opublikować te informacje. będzie bardzo pomocne w dłuższej perspektywie. Pozdrawiam – Jacksta

1

Czasami jest to najprostsze rozwiązanie. To samo przydarzyło mi się. Byłem uruchomiony na localhost (wampserver). Dowiedziałem się, że moja zapora blokuje wszystkie żądania plików cookie z localhost. Używałem ZoneAlarm w tym czasie, ale zakładam, że inne firewalle mogą mieć taki sam efekt. Spróbuj wyłączyć zaporę ogniową, aby sprawdzić, czy nadal nie działa.

+0

Hej, dzięki za napiwek, w rzeczywistości jestem runnign to na serwerze na żywo. – Jacksta

+0

programista zawsze musi iść nie po najprostsze rozwiązanie, ale do debugowania –

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

nadal wynik sajme = zaloguj się ponownie! dzięki za sugestię – Jacksta

+0

wciąż ten sam błąd lol –

0

Spróbuj ustawić ciasteczko z php tak:

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

Czasami w localhost, ciasteczka nie są ustawione za pomocą: $_COOKIE[<name>] = <value>

2

Oto coś, co mogło zawiedli cię ...

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