2010-08-07 70 views
10

我使用jQuery AJAX調用PHP來驗證登錄表單。在PHP中,我創建了一個會話,如果他們選中了「記住我」複選框,我想創建一個cookie。這裏是php代碼:在AJAX請求中設置cookie?

<?php 

include '../includes/connection.php'; 
date_default_timezone_set('GMT'); 

$name = $_POST['username']; 
$pass = $_POST['password']; 


$query = mysql_query("SELECT id, username, password FROM users WHERE username = '$name' LIMIT 1"); 

if(mysql_num_rows($query) == 0) { 
echo 'error'; 
exit; 
} 

while($row = mysql_fetch_array($query)) { 

if($row['username'] == $name && $row['password'] == $pass) { 

    session_start(); 
    $_SESSION['username'] = $row['username']; 
    $_SESSION['usrID'] = $row['id']; 
    echo 'success'; 


    if($_POST['remember']) { 
    setcookie('username', $row['username'], $exp); 
    setcookie('password', $row['password'], $exp); 
    setcookie('usrID', $row['id'], $exp); 
    } 

} else { 
    echo 'error'; 
    exit; 
} 



} 


?> 

會話設置成功,但是cookie根本沒有設置。我試過設置所有的值(域,路徑等),但沒有改變任何東西。有什麼明顯的我失蹤了?

+0

變量'$ exp'來自哪裏? – Sarfraz 2010-08-07 20:30:14

+0

對不起,這只是一個錯字,$ exp是早期定義的截止日期(2個月) – williamg 2010-08-07 20:32:00

+4

oooooh,我不認爲你想要在cookie中設置密碼,即使它的md5'ed。會話ID好得多 – CpILL 2012-06-20 07:06:21

回答

14

這裏有幾點建議:

  • 確保您指定日期的正確的到期格式
  • 當設置重定向頁面上的cookie,該cookie必須被調用後設置header('Location: ....');如:

    header('Location: http://www.example.com/'); setcookie('asite', $site, time()+60*60, '/', 'site.com');

  • 如果你有人類的URL像www.domain.com/path1/path2/,日您必須設置Cookie路徑以適用於所有路徑,而不僅僅是當前路徑。

    setcookie('type_id', $new_type_id, time() + 60*60*24*30, '/');

請注意,在參數的最後/

從PHP手冊:

其中 的cookie將可在服務器上的路徑。如果設置爲 '/',則Cookie將在整個域中可用 。如果設置爲 '/ foo /',則該cookie將僅在和/或域的所有子目錄(如 /foo/bar /)內可用的 。默認 值是 該cookie被設定爲當前目錄。

  • setcookie()定義要與所述HTTP標頭的其餘部分一起被髮送的cookie。和其他頭文件一樣,Cookie必須在腳本輸出之前發送,這意味着在此之前不應該有html/code echo語句。
+0

太棒了!我之前做了一個echo聲明,改變了它,並且一切正常,除了當我嘗試創建根('/')的路徑時,它沒有設置cookie ......我是否做錯了什麼? – williamg 2010-08-07 22:38:41

+0

@iMaster:不客氣:) – Sarfraz 2010-08-07 22:40:53

+0

查看我評論的最後部分,我剛剛編輯它。 – williamg 2010-08-07 22:41:58

-12

使用AJAX調用時,您將無法設置cookie服務器端。相反,請等到您獲得成功的響應並設置cookie客戶端。爲了更容易,你可以use a jQuery plugin

+14

我很抱歉,但爲什麼使用Ajax調用設置cookie是不可能的? Ajax調用是一個具有自己的請求和響應頭的常規http請求。我們可以將任何信息放入Respose標題中,包括Cookie。我不是嗎? – Kirzilla 2010-08-07 20:55:14

+1

http://stackoverflow.com/questions/3340797/can-an-ajax-response-set-a-cookie – Ryan 2012-03-13 13:40:40

+0

爲什麼在這個世界上有5人喜歡這個?說你不能從AJAX調用中返回set-cookie頭或者瀏覽器不會兌現它們,說'設置服務器端的cookie'似乎表明了一些基本的混淆HTTP工作。 – 2013-04-05 15:24:32