2012-11-19 50 views
2

我看到很多人都問過類似的問題,所以請原諒,如果我重複,但我無法在其他帖子中找到答案。setcookie無法正常工作

這只是一個在localhost上運行的測試頁面。我有一個HTML登錄頁面,將表單數據發送到PHP腳本,該腳本正在檢查MySQL數據庫中的詳細信息。使用結果設置cookie進行遊戲,但無法使其運行。

$user = $_POST['USER']; 
$pass = $_POST['PASS']; 

$res = $con->query("SELECT * FROM users WHERE username = '".$user."' AND password = '".$pass."'"); 
$row_no = $res->num_rows; 
if ($row_no > 0) { 
    $row = $res->fetch_assoc(); 
    $username = $row['username']; 
    $password = $row['password']; 

    setcookie('cookie1', $user, time() + 3600); 

    if (isset($_COOKIE['cookie1'])) { 
     echo "cookie set"; 
    } 
    else { 
     echo 'cookie not set'; 
    } 

    echo "Hello " . $username . ', your password is ' . $password; 
} 
else { 
    echo "Sorry, either your username or password is wrong"; 
} 

我想我明白,cookie是不適用於它被設置在頁面上,但即使我重新加載頁面的$ _COOKIE變量是空的。 腳本的isset部分結果總是'cookie未設置'。我也嘗試將Cookie上的域設置爲「/」。

感激地收到任何幫助。

(PS MySQL的部分工作正常)

+3

強制性:您的代碼容易受到[SQL注入](http://en.wikipedia.org/wiki/SQL_injection) – Esailija

+0

如果用戶將其密碼發佈爲:「」;'從用戶刪除; 「 ??? –

+0

你的餅乾壽命只有1小時。檢查服務器是否不在客戶端瀏覽器後1小時。詳情請參閱我的帖子。 – Ray

回答

3

做這樣的事情

setcookie(...); 
var_dump($_COOKIE[...]); 

總是會失敗。

在處理用戶請求時的默認狀態下,超全局表示由瀏覽器發送的所有cookie數據以及請求。setcookie()函數不會爲當前正在處理的請求更改此數組。

它應該顯示在來自用戶的下一個請求上。

如果由於某種原因,你想你的當前請求處理邏輯「理解」一個cookie被髮送回來的響應頭已經設置,您可以手動設置值$_COOKIE數組中,如:

setcookie(...); 
$_COOKIE[...] = 'some value'; 
var_dump($_COOKIE); 

在使用setcookie()之前,您還需要驗證您沒有向瀏覽器發送任何輸出。如果您正在使用display_errors開發,並且error_reporting(E_ALL)您應該看到警告。您也可以查看基本的Web開發工具,以便瀏覽器檢查響應頭以查看是否正在發送Cookie。

+0

感謝您的答覆。實際上我重新加載了相同的頁面來強制對cookie進行新的請求。我改變了JS重定向到域上的另一個頁面,並開始工作。但是你的回答讓我更好地理解爲什麼會出現這種情況。 – chrxr

0

此外,檢查客戶端和服務器上的時間。您的服務器將Cookie設置爲從當前時間起一小時。客戶端確定cookies的生存期 - 如果客戶端瀏覽器上的時間超過服務器一個小時以上,則瀏覽器可能立即丟棄cookie。您可以通過將cookie設置爲更長的時間來測試,如time()+ 36000(10小時)。

cookie在下一頁請求中的$ _COOKIE數組中可用,而在setcookie()調用後不在當前頁中。

+0

我想使用會話變量可以工作,而不用重寫他的代碼。 – Blazemonger

+0

Op顯式地說:「_我認爲我知道該cookie在其設置的頁面上不可用,但即使我重新加載頁面$ _COOKIE變量爲空._」 – Madbreaks

0

這不工作的原因是因爲Ray指出,cookie可以在下一頁請求。這是因爲Cookie信息在HTTP標頭中傳輸。所以你的代碼基本上是這樣做的:

- 嘿,當我發送這個頁面給用戶時,告訴他創建這個cookie。

- (在將頁面發送給用戶之前)嗨,使用用戶擁有的cookie。

但他沒有該Cookie還因爲你還沒有進入的網頁給他(因此HTTP報頭未發送尚未告訴他創建的cookie)

0

Click here for PHP Documentation on setcookie();

setcookie()定義一個cookie以及其餘的HTTP頭文件。像其他標題一樣,Cookie必須在腳本輸出之前發送(這是協議限制)。這要求您在任何輸出之前調用此函數,包括標記以及任何空格。

一旦Cookie已設置,可通過$ _COOKIE或$ HTTP_COOKIE_VARS數組在下一頁加載訪問它們。請注意,像$ _COOKIE這樣的超全球變量可以在PHP 4.1.0中使用。 Cookie值也存在於$ _REQUEST中。

0
http://php.net/manual/en/function.setcookie.php

一旦餅乾已設置

,他們可以訪問下頁加載與$ _COOKIE或$ HTTP_COOKIE_VARS數組。請注意,像$ _COOKIE這樣的超全球變量可以在PHP 4.1.0中使用。 Cookie值也存在於$ _REQUEST中。