4

Cookie を使用するローカルホストで Web サイトを開発しています。データベースに保存され、ユーザーのブラウザーで参照 Cookie として設定されるランダムな 25 文字の文字列を生成する機能があります。

インターネットとこのサイトを検索しましたが、問題の解決策を見つけることができませんでした。

関連コードの概要の下


function generateRandomString($length){
    $string = "";
    $possible = "012346789abcdefghijklmnopqrstuvwABCDEFGHIJKLMNOPQRSTUVW";
    $maxlength = strlen($possible);
    if($length > $maxlength){
        $length = $maxlength;
    }
    $i = 0; 
    while($i < $length){ 
        $char = substr($possible, mt_rand(0, $maxlength-1), 1);
        if(!strstr($string, $char)){ 
            $string .= $char;
            $i++;
        }
    }
    return $string;
}

$uCookie = generateRandomString(25);

setcookie('uHash', $uCookie, time()+60*60*24*30);

$stmt = $dbh->prepare('
    UPDATE User 
    SET u_UserCookie = :cookie 
    WHERE u_UserId = :id
'); 

$stmt->execute(array(
    ':cookie' => $uCookie,
    ':id' => $user_id
));

今試してみるとecho($_COOKIE['uHash']);、空の文字列が得られます。

奇妙な部分は、クロムの設定を確認すると、Cookie が存在することです。

Name:    uHash
Content:    134uHnEPrCmBNGqeAjhRSUiJL
Domain: localhost
Path:   /~path/to/login
Send for:   Any kind of connection
Accessible to script:   Yes
Created:    Wednesday, April 17, 2013 4:21:27 PM
Expires:    Friday, May 17, 2013 4:21:27 PM

文字列「134uHnEPrCmBNGqeAjhRSUiJL」もデータベースにあるため、

(ローカルホスト上の) Cookie に関する基本的な情報が不足していますか?

解決した

問題は、php.netによると

「そのドメイン名には少なくとも 2 つのドット (.) が含まれている必要があるため、「localhost」は無効であり、ブラウザは Cookie の設定を拒否します」

だから私はこれを行うことでそれを解決しました


$domain = ($_SERVER['HTTP_HOST'] != 'localhost') ? $_SERVER['HTTP_HOST'] : false;
setcookie('uHash', $uCookie, time()+60*60*24*30, '/', $domain, false);
4

3 に答える 3

2

この問題を参照してください: 明示的なドメインを持つ localhost の Cookie

Cookie のドメイン名には 2 つのドットが含まれている必要があります。そのための localhost は無効です。

于 2013-04-18T07:05:01.640 に答える
0

関連するコードがすべて揃っているわけではありませんが、次のようになると思います。

setcookie('uHash', $uCookie, time()+60*60*24*30);
echo $_COOKIE['uHash'];

マニュアルから:

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

同じページで絶対に必要な場合は、おそらく次のようにすることができます。

setcookie('uHash', $uCookie, time()+60*60*24*30);
$_COOKIE['uHash'] = $uCookie;
echo $_COOKIE['uHash'];
于 2013-04-18T07:08:35.040 に答える
0

正しいパス/ドメインで Cookie にアクセスしようとしていることを確認してください。

 setcookie ('uHash', $uCookie, time()+60*60*24*30, /path/of/the/website, false);

Cookie をキャッチする前に、ヘッダーが Cookie を送信するようにリダイレクトする必要があります。

setcookie docを参照してください。

于 2013-04-18T07:05:30.297 に答える