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