JQuery AJAX PHPへの呼び出しでログインフォームを検証しています。phpでセッションを作成し、[remember me]チェックボックスをオンにした場合は、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はまったく設定されていません。すべての値(ドメイン、パスなど)を設定しようとしましたが、何も変わりませんでした。私が見逃している明らかなものはありますか?
ここにいくつかの提案があります:
リダイレクトするページにCookieを設定する場合、Cookieはheader('Location: ....');
の呼び出し後に設定する必要があります。例:
header('Location: http://www.example.com/'); setcookie('asite', $site, time()+60*60, '/', 'site.com');
_www.domain.com/path1/path2/
_のような人間のURLがある場合、現在のパスだけでなくすべてのパスで機能するように、Cookieパスを/に設定する必要があります。
setcookie('type_id', $new_type_id, time() + 60*60*24*30, '/');
引数の最後の_/
_に注意してください。
PHPマニュアルから:
Cookieを利用できるサーバー上のパス。 '/'に設定すると、Cookieはドメイン全体で使用できるようになります。 '/ foo /'に設定すると、Cookieは/ foo /ディレクトリおよびドメインの/ foo/bar /などのすべてのサブディレクトリ内でのみ使用可能になります。デフォルト値は、Cookieが設定されている現在のディレクトリです。
setcookie()
は、残りのHTTPヘッダーと一緒に送信されるCookieを定義します。他のヘッダーと同様に、スクリプトからの出力の前にCookieを送信する必要があります。つまり、その前にhtml/codeエコーステートメントがあってはなりません。