2010-04-24 45 views
5

Tôi đang cố gắng sử dụng cookie có xác thực.cookie php không hoạt động

trang này làm việc một lần vào người dùng và 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> 

Khi nhấp vào một trong hai secretA.php hoặc secretB.php Tôi đang chuyển hướng để đăng nhập một lần nữa, nó sẽ làm việc. đây là mã. 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

Trong 'secretB.php' làm' var_dump ($ _ COOKIE) 'và đăng kết quả ở đây. – hsz

+0

là có một cách mà không làm điều này, như tôi đang làm việc của một số ví dụ từ một cuốn sách mà không sử dụng bất kỳ mã nào nữa thì – Jacksta

+0

'var_dump' này sẽ kiểm tra xem có cookie nào được đặt không. – hsz

Trả lời

1

Điều này nếu ví dụ tuyệt vời về mã lỗi.
Cảm ơn bạn đã đăng nó. Nhiều người có thể đọc nó và học hỏi từ điều này.

Hãy để tôi giải thích.
PHP có thể giúp bạn tìm một số lỗi không rõ ràng. Không phải mọi người mà là một trong số họ.
Ví dụ: nếu bạn nhập sai tên biến, PHP sẽ ném một lỗi ... tất nhiên nếu bạn cho phép PHP nói.
Để hiển thị mọi lỗi, mức báo cáo lỗi phải được max. Để làm điều đó, mỗi kịch bản phải chứa dòng này:

error_reporting(E_ALL); 

sau khi bạn thêm nó, nếu nó được viết đúng mã, bạn sẽ thấy chỉ có một thông báo lỗi trỏ đến biến gõ sai. Nhưng.
Thay vào đó, bạn sẽ thấy một thác nước có lỗi. Vì PHP không thể phân biệt các lỗi cố ý với các lỗi không thường xuyên.

Do đó. Nó không phải là lỗi cố ý trong mã, để cho bạn thấy những người không thường xuyên.
Đây là bài học tuyệt vời đáng nhớ.

Các lỗi này là gì?

  1. Chuỗi trong php được phân cách bằng dấu ngoặc kép.
    Vì vậy, nếu bạn có một chuỗi username, nó phải được viết là "username".
    Và $ _POST [tên người dùng] trở thành $ _POST ["tên người dùng"].
    (và ngược lại, các biến không cần báo giá, vì vậy, echo "$msg"; phải là echo $msg;)
  2. tất cả các biến phải được đặt hoặc kiểm tra sự tồn tại. như vậy,
    if ((!$_POST[username]) || (!$_POST[password])) {
    phải trở thành
    if (!empty($_POST["username"]) OR !empty($_POST["password"])) {

Với một mã như vậy, bạn sẽ chỉ thấy thỉnh thoảng lỗi và có thể sửa chữa nó ngay lập tức.

+0

Cảm ơn bạn đã dành thời gian đăng thông tin đó. sẽ là một trợ giúp lớn trong thời gian dài. chúc mừng – Jacksta

1

Đôi khi giải pháp đơn giản nhất của nó. Điều tương tự cũng xảy ra với tôi. Tôi đã chạy trên localhost (wampserver). Tôi phát hiện ra rằng tường lửa của tôi đã chặn tất cả các yêu cầu cookie từ localhost. Tôi đã sử dụng ZoneAlarm vào thời điểm đó nhưng tôi cho rằng các tường lửa khác có thể có cùng tác dụng. Thử tắt tường lửa của bạn để xem nó có hoạt động không.

+0

Xin cảm ơn vì mẹo này, tôi thực sự đã chạy điều này trên một máy chủ trực tiếp. – Jacksta

+0

một lập trình viên luôn luôn phải đi không cho giải pháp đơn giản nhất nhưng để gỡ lỗi –

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

vẫn là kết quả sajme = đăng nhập lại! cảm ơn đề xuất – Jacksta

+0

vẫn là lỗi tương tự lol –

0

Cố gắng thiết lập các cookie với php như thế này:

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

Đôi khi, trong localhost, các tập tin cookie không được thiết lập bằng cách sử dụng: $_COOKIE[<name>] = <value>

2

Đây là cái gì đó có thể đã sai lầm bạn lên ...

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