web-dev-qa-db-ja.com

PHP Cookieが存在するかどうか、また値が設定されていない場合は確認します

私は多言語サイトに取り組んでいるので、このアプローチを試しました:

echo $_COOKIE["lg"];
if (!isset($_COOKIE["lg"]))
    setcookie("lg", "ro");
echo $_COOKIE["lg"];

クライアントがlg Cookieを持っていない場合(したがって、このサイトに初めてアクセスした場合)、Cookieを設定するという考え方ですlg = roそのユーザー。

このページに初めてアクセスした場合、最初と2番目のechoは何も返さないことを除いて、すべて正常に機能します。 Cookieが設定されているページを更新してから、両方のechoが期待する「ro」文字列を出力する場合のみ。

ユーザーの最初の訪問/ページの読み込みで2番目のechoから値を見るためにこのCookieを設定するにはどうすればよいですか?ページを更新したり、リダイレクトを作成したりする必要はありません。

30
Teodor

回答

PHPマニュアル に従ってはいけません:

Cookieが設定されると、次のページの読み込み時に$ _COOKIEまたは$ HTTP_COOKIE_VARS配列を使用してアクセスできます。

これは、Cookieがブラウザーに応答ヘッダーで送信され、ブラウザーが次の要求でそれらを送り返す必要があるためです。これが、2番目のページの読み込みでのみ使用できる理由です。

回避策

ただし、setcookie()を呼び出すときに$_COOKIEを設定することでも回避できます。

if(!isset($_COOKIE['lg'])) {
    setcookie('lg', 'ro');
    $_COOKIE['lg'] = 'ro';
}
echo $_COOKIE['lg'];
78
Treffynnon

Cookieはリクエスト時にonlyのみ送信されるため、割り当てられるとすぐに取得できません(リロード後にのみ利用可能)。

Cookieが設定されると、$ _ COOKIEまたは$ HTTP_COOKIE_VARS配列を使用して、次のページの読み込みでアクセスできます。

この関数を呼び出す前に出力が存在する場合、setcookie()は失敗し、FALSEを返します。 setcookie()が正常に実行されると、TRUEが返されます。このdoesnotは、ユーザーがCookieを受け入れたかどうかを示します

Cookieは、Cookieを表示するページを次にロードするまで表示されません。 Cookieが正常に設定されたかどうかをテストするには、Cookieの有効期限が切れる前に、次の読み込みページでCookieを確認します。有効期限は、expireパラメーターによって設定されます。 Cookieの存在をデバッグする良い方法は、単にprint_r($ _ COOKIE);を呼び出すことです。

ソース

10
0b10011