1

PHPアプリケーションに問題があります。

サインインとサインアップのページが2つあります。どちらのページも共通cookiesのクラスを使用しています。1つを除いて、すべてが正常に機能します。ページsetcookie()上でのみ機能し/signinます(Cookie値はデータベースに送信され、Cookie'rwt'が表示されます)。

サインアップページでは、Cookieの値はデータベースに送信されますが、setcookie()機能しません。

助けてください。

PSこれが唯一の問題です。すべてがローカルホストで機能しますが、本番ドメインでは機能しません。

PPS$DBHはPDO変数であり、正しいデータベース情報が含まれています。

サインインページ

$cookie = new Cookies($DBH);
 ........

if ($signin->remember=="yes") {
    $cookie->account_set($signin->user);
}

サインアップページ

  $cookie = new Cookies($DBH);
   .........
   ........

if ($signup->check_availability()) {

    $signup->save();

    $cookie->account_set($signup->user);

    header("Location:/");

} else {
    $msgText = "This username already exists";
    echo "<div class=\"orangeMsg\">$msgText</div>";
}

クラスcookies

 class Cookies
        {
            private $_DBH, $cookie_domain;  
            function __construct(PDO $DBH)
            {
                $this->_DBH=$DBH;
                $this->cookie_domain=$_SERVER['HTTP_HOST'];

            }
            public function account_set($value)
            {
                $cookie_value=uniquestr();
                // function from common.func.php
                $this->_DBH->query("UPDATE accounts SET cookie='$cookie_value' WHERE user='$value'");
                setcookie('rwt', $cookie_value, time()+60*60*24*7 , '/', $this->cookie_domain);
            }
            public function account_unset($value)
            {
                if (isset($_COOKIE['rwt'])) {
                    $cookie_value=$_COOKIE['rwt'];
                    setcookie("rwt", $cookie_value, time()-2592000, '/', $this->cookie_domain);
                    $this->_DBH->query("UPDATE accounts SET cookie=DEFAULT WHERE user='$value'");
                }
            }
        }
4

3 に答える 3

2

私の経験では、Cookieの設定とHTTP応答以外の送信の組み合わせは、200 OK面倒な傾向があります。あなたのアプローチは一部のブラウザでは機能しますが、他のブラウザでは機能しない可能性があります。setcookie() before を使用すると、これが機能する可能性を高めることができますheader('Location ...')(一部のブラウザーは、ヘッダーに遭遇するとヘッダーの解釈を停止するように見えるためLocation)が、これはまだ保証されていません。

回避策は、1回限りのGETパラメータを使用してターゲットの場所にリダイレクトし、そこにCookieを設定することです。

于 2012-09-23T19:24:52.933 に答える
1

常に電話exitの直後に電話する必要がありheader('Location: ...')ます。そうしないと、スクリプトは最後まで実行され続け、結果として予期しない動作が発生する可能性があります。

私の推測では、サインアップスクリプトの後半で何らかの方法でCookieの設定を解除していると思います。

于 2012-09-23T19:21:19.937 に答える
0

解決

それは私のコードの間違いでした、それがローカルサーバーで動作したのは本当に奇妙です。

間違いの説明

サインアッププロセスに関連するロジックのブロックがありましたif () {..}if () {..} else {..}それはばかげていますが、私はそれらが互いに関連していることを期待していました。

ロジックをに変更するとif () {..} elseif () {..} else {..}問題が解決しました

そのような下手な間違いをお詫び申し上げます。

于 2012-09-25T14:19:15.243 に答える