2014-03-27 93 views
0

我有一個PHP文件:PHP setcookie()函數的問題

<?php 
$username = $_POST["username"]; 

if((!$username) || (!$_POST["password"])){ 
    header("Location:http://localhost/login.html"); 
    exit; 
} 

$db_name = "muzak"; 
$tblname = "auth_users"; 
$connection = mysqli_connect("localhost", "***username***", "***password***", $db_name) or die("Couldn't connect to database"); 
$sql = "SELECT * FROM $tblname WHERE username = '$username' AND password= password('$_POST[password]')"; 

$result = mysqli_query($connection, $sql) or die(mysqli_error($connection)); 

$numHits = mysqli_num_rows($result); 
var_dump($numHits);//equal to one 

if($numHits > 0){ 
    $cookie_name = "auth"; 
    $cookie_value = "ok"; 
    $cookie_expire = "0"; 
    $cookie_domain = "127.0.0.1"; 
    setcookie($cookie_name, $cookie_value, $cookie_expire, "/" , $cookie_domain, 0); 

    $display = "<li><a href=\"secret_areaA.php\">Secret Area A</a></li> 
       <li><a href=\"secret_areaB.php\">Secret Area B</a> </li>"; 
}else{ 
    header("Location:http://localhost/login.html"); 
} 
?> 
<html> 
<head> 
<title>Secret Menu</title> 
</head> 
<body> 
<?php echo $display;?> 
</body> 
</html> 

從一個HTML文件中獲取輸入,並要求數據庫確認。 HTML部分工作正常,但是當我嘗試檢查secret_areaA.php文件中cookie的存在時。 。 。

<?php 
if($_COOKIE["auth"] == "ok"){ 
    $msg = "<p><Welcome to the first secret area!<p>"; 
}else{ 
    die("Cookie wasn't valid"); 
} 
?> 
<html> 
<head> 
<title> 
    Secret Area A 
</title> 
</head> 
<body> 
<?php echo $msg;?> 
</body> 
</html> 

我得到這個錯誤:注意:未定義指數:用C AUTH:\ XAMPP \ htdocs中\ secret_areaA.php第2行

我在做什麼錯?

+0

一個cookiedomain不能是IP。它必須是實際完全合格的域名。所以'localhost'將被允許,但是'127.0.0.1'不會。 – Tularis

+0

我認爲在你的secret_areaA.php文件,你需要添加一個PHP包括對第一個文件,因爲這是你的auth'的'變量聲明。 – TylerH

+2

您不應該直接在cookie中存儲任何種類的認證指示符。這很容易造成您的安全問題。考慮使用這個會話。 –

回答

0

你需要使用isset(),嘗試比較值之前檢查cookie設置(存在)。這樣一來,如果cookie尚未確定,我們不嘗試訪問$_COOKIE陣列不能存在(['auth'])的一部分。

if (isset($_COOKIE['auth']) && $_COOKIE['auth'] == 'ok'){ 
} else { 
} 
+0

-1。這並沒有回答爲什麼Cookie從未設置。只是如何避免顯示錯誤。 – BenM

+0

爲什麼是-1?這個問題沒有詢問關於cookie的設置,它詢問爲什麼給出錯誤。這個答案解決了這個錯誤。 –

+0

@BenM雖然錯誤仍然應該處理。這不值得一個負分。 – ceejayoz

3

餅乾expire設置爲0讓餅乾過期它得到了設置之後。所以它永遠不會存在。

你設置的時間必須有time() + $seconds,不只是$seconds