在AJAX请求中设置cookie?

时间:2010-08-07 20:21:57

标签: php ajax cookies session

我正在使用jQuery AJAX调用PHP来验证登录表单。在php中,我创建了一个会话,如果他们选中了“记住我”复选框,我想创建一个cookie。这是php代码:

<?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根本没有设置。我已经尝试设置所有值(域,路径等),但没有改变任何东西。有什么明显的我遗失了吗?

2 个答案:

答案 0 :(得分:17)

以下是一些建议:

  • 确保您指定了正确的日期到期格式
  • 在重定向的网页上设置Cookie时,必须在调用header('Location: ....');后设置Cookie,例如:

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

  • 如果您有www.domain.com/path1/path2/之类的人工网址,则必须将Cookie路径设置为/以适用于所有路径,而不仅仅是当前路径。

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

注意参数中的最后一个/

从PHP手册:

  

服务器上的路径   cookie将可用。如果设置为   '/',cookie将可用   在整个域内。如果设置为   '/ foo /',cookie只会是   在/ foo /目录中可用   和所有子目录,如   / foo / bar /域名。默认   value是当前目录   正在设置cookie。

  • setcookie()定义了一个与其他HTTP标头一起发送的cookie。与其他标题一样,必须在脚本的任何输出之前发送cookie,这意味着在此之前不应该有html / code echo语句。

答案 1 :(得分:-14)

使用AJAX调用时,您将无法设置cookie服务器端。相反,请等到成功响应并设置cookie客户端。为方便起见,您可以use a jQuery plugin