2

多くの人が同様の質問をしているのを見ているので、重複していても許してください。他の投稿で答えを見つけることができませんでした.

これは、ローカルホストで実行されている単なるテスト ページです。HTMLログインページがあり、フォームデータをPHPスクリプトに送信し、MySQLデータベースの詳細をチェックしています。結果で Cookie を設定して遊んでいますが、動作させることができません。

$user = $_POST['USER'];
$pass = $_POST['PASS'];

$res = $con->query("SELECT * FROM users WHERE username = '".$user."' AND password = '".$pass."'");
$row_no = $res->num_rows;
if ($row_no > 0) {
    $row = $res->fetch_assoc();
    $username = $row['username'];
    $password = $row['password'];

    setcookie('cookie1', $user, time() + 3600);

    if (isset($_COOKIE['cookie1'])) {
        echo "cookie set";
    }
    else {
        echo 'cookie not set';
    }

    echo "Hello " . $username . ', your password is ' . $password;
}
else {
    echo "Sorry, either your username or password is wrong";
}

Cookie が設定されているページで Cookie を使用できないことは理解していると思いますが、ページをリロードしても $_COOKIE 変数は空です。スクリプトの一部の結果は、isset常に「Cookie が設定されていません」です。また、Cookie のドメインを「/」に設定しようとしました。

感謝して受け取った助け。

(ps MySQL の部分は正常に動作します)

4

5 に答える 5

3

のようなことをする

setcookie(...);
var_dump($_COOKIE[...]);

常に失敗します。

ユーザーリクエストの処理時のデフォルト状態では、 $_COOKIEスーパーグローバルは、リクエストとともにブラウザから送信されたすべてのCookieのデータの配列を表します。このsetcookie()関数は、現在処理中のリクエストに対してこの配列を変更することはありません。

ただし、ユーザーからの次のリクエストで表示されるはずです。

何らかの理由で、現在のリクエスト処理ロジックに、応答ヘッダーとともに返送されるCookieが設定されていることを「理解」させたい場合は、次の$_COOKIEように配列に値を手動で設定できます。

setcookie(...);
$_COOKIE[...] = 'some value';
var_dump($_COOKIE);

また、を使用する前に、ブラウザに出力を送信していないことを確認する必要がありますsetcookie()display_errorsonを使用して開発していてerror_reporting(E_ALL)、警告が表示される場合。また、ブラウザの基本的なWeb開発ツールを調べて、応答ヘッダーを調べ、Cookieが送信されているかどうかを確認することもできます。

于 2012-11-19T22:22:04.390 に答える
0

http://php.net/manual/en/function.setcookie.phpから

Cookieが設定されると、次のページの読み込み時に$_COOKIEまたは$HTTP_COOKIE_VARS配列を使用してCookieにアクセスできます。$_COOKIEなどのスーパーグローバルがPHP4.1.0で利用可能になったことに注意してください。Cookieの値は$_REQUESTにも存在します。

于 2012-11-19T22:22:15.267 に答える
0

また、クライアントとサーバーの時刻も確認してください。サーバーは、現在の時間から 1 時間有効になるように Cookie を設定しています。Cookie の有効期間はクライアントによって決定されます。クライアント ブラウザの時間がサーバーより 1 時間以上進んでいる場合、ブラウザは Cookie をすぐに破棄する可能性があります。time() + 36000 (10 時間) のように、Cookie をかなり長く設定することで、これをテストできます。

Cookie は $_COOKIE 配列の NEXT PAGE REQUESTED で利用できますが、setcookie() 呼び出しの直後の現在のページでは利用できません。

于 2012-11-19T22:16:21.867 に答える
0

これが機能しない理由は、Ray が指摘したように、要求された次のページで Cookie を使用できるためです。これは、Cookie 情報が HTTP ヘッダーで転送されるためです。したがって、コードは基本的にこれを行っています:

-このページをユーザーに送信するときに、この Cookie を作成するように伝えてください。

-(ユーザーにページを送信する前に)ねえ、ユーザーが持っている Cookie を使用します。

しかし、あなたが彼にページを送信していないため、彼はまだその Cookie を持っていません (したがって、Cookie を作成するように彼に指示する HTTP ヘッダーはまだ送信されていません)。

于 2012-11-19T22:19:49.843 に答える
0

setcookie(); に関する PHP ドキュメントについては、ここをクリックしてください。

setcookie() は、残りの HTTP ヘッダーと一緒に送信される Cookie を定義します。他のヘッダーと同様に、Cookie はスクリプトからの出力の前に送信する必要があります (これはプロトコルの制限です)。これには、タグや空白を含め、出力の前にこの関数を呼び出す必要があります。

Cookie が設定されると、次のページ読み込み時に $_COOKIE または $HTTP_COOKIE_VARS 配列を使用してアクセスできます。$_COOKIE などのスーパーグローバルは、PHP 4.1.0 で使用できるようになったことに注意してください。Cookie 値も $_REQUEST に存在します。

于 2012-11-19T22:20:04.053 に答える