0

これは私の古いものに関する質問です:Cookieは設定解除されません: Cookieの設定を解除 するのに問題があった場合、Cookieは設定解除されません(ただし、「正しく」設定されました)、

これで問題は解決しました。クッキーが設定されていないようです

cookie'set' :(機能しません)

setcookie("id",$data['id'], time()+3600*24*30,'/');
setcookie("alias",$data['nombre'], time()+3600*24*30,'/');

クッキーチェック:(動作するようです)

    function sesion(){

    if(isset($_COOKIE['id']) && isset($_COOKIE['alias'])){
                    $_SESSION['logueado'] = true;
                    $_SESSION['id'] = $_COOKIE['id'];
                    $_SESSION['alias'] = $_COOKIE['alias'];

                    return true;  //THIS IS NEVER RETURNING TRUE
                }
if(isset($_SESSION['id']) && isset($_SESSION['logueado']) && $_SESSION['logueado'] == true){

                    return true;
                }
                 else{ return false;
    }



    }

設定されていないCookie:(動作)

function cerrar_sesion(){
  session_start();
  $_SESSION['logueado']= false;
  $_SESSION['id']= NULL;
  session_unset();
  session_destroy();
  setcookie("id",false,time()-3600,"/");
  setcookie("alias",false,time()-3600,"/");
  unset($_COOKIE['id']);
  unset($_COOKIE['alias']);
}

何が起こるかというと、ログインは$ _SESSIONを介してのみ機能するため、30分間アクティビティがない場合、ユーザーはログインしなくなります。

私が間違っていることについて何か考えはありますか?どうもありがとう!

4

5 に答える 5

6

上記のように、Cookie が設定されているのと同じページから Cookie を読み取ることはできません。ajax を使用してこれをだまそうとしたようですが、Ajax 呼び出しはまだ表示されているページの状態を変更しないため、それが有効なトリックであるとは思いません。そのため、完全な更新またはリダイレクトを実行するか、同時に setcookie を使用して、同じページで使用できるように $_COOKIE で必要な値を定義することもできます。このような:

setcookie("id",$data['id'], time()+3600*24*30,'/');
setcookie("alias",$data['nombre'], time()+3600*24*30,'/');
$_COOKIE['id'] = $data['id'];  
$_COOKIE['alias'] = $data['nombre'];
于 2011-07-24T01:12:16.300 に答える
2

setcookie行は私と一緒にうまく機能します。

}else if(isset($_COOKIE['id']) && i ここでelseを削除しても戻るので、上記の戻りがない場合は、このブロックを評価しないために、ここにelseを保持する必要があります。一般的に言えば、すべての場合で同じかどうかはわかりませ んelseifelse if

関数セッションの構築方法は次のように機能します。

  • 最初のロード時に、次のように表示されます。リロードするまでCookieを表示できないため、Cookieなし、セッションなし(これは既にご存知だと思います)。-2回目のロード時に、Cookieアライブセッションセットが表示されます。-2回目のロード後、常にセッションが設定されていることがわかります。

私が言いたいのは、セッションが期待どおりに機能することです。したがって、実際には問題はありません。

<?php

$data='Hello'; 
setcookie("id",$data['id'], time()+3600*24*30,'/');
setcookie("alias",$data['nombre'], time()+3600*24*30,'/');

session_start(); 

function sesion()
     {

        if(isset($_SESSION['id']) && isset($_SESSION['logueado']) 
            && $_SESSION['logueado'] == true)
        {
            echo 'SESSION IS SET<br>';
            return true;
        } 
        if(isset($_COOKIE['id']) && isset($_COOKIE['alias']))
        {
            $_SESSION['logueado'] = true;
            $_SESSION['id'] = $_COOKIE['id'];
            $_SESSION['alias'] = $_COOKIE['alias'];
            echo 'COOKIE is alive and session set'.$_SESSION['alias'].'<br>';
            return true;  //THIS IS NEVER RETURNING TRUE
         }
        else
        {  
            echo 'NO SESSION,   NO COOKIE YET, WAIT UNTIL REFRESH<br>';
            return false;
        } 
} 
 sesion() ; 
?>
于 2011-06-19T00:27:00.990 に答える
1

setcookie() 呼び出しから path パラメータを削除してみてください。おそらくそれが問題です。

また、$data に実際にデータが含まれていることを確認しましたか?

于 2011-07-22T23:42:58.443 に答える
1

おそらく、Cookie の設定に関する問題を実際に認識しており、警告に関するエラー報告を無効にしていると思われます。

ちょうど試して:

error_reporting(E_ALL);

「ヘッダーを変更できません。ヘッダーは既に送信されています」のようなページが表示される可能性があります。これは、ページに何かを表示する前に Cookie を設定する必要があるためです。問題を解決する解決策は、コードを実装してページの下部に Cookie を設定するか、ob_start/ob_clean を使用することです。

それが役立つかどうか教えてください:)

于 2011-07-27T09:42:12.167 に答える
0

PHP の「 setcookie() 」実装によると、Cookie を作成しているページからコントロールを移動するまで、Cookie 値のチェックは機能しません。したがって、「SET」は 1 つのページで Cookie を作成し、「session()」を他のページから呼び出して、設定した Cookie の値を確認する必要があります。試してみて、それが役立つことを願っています!

次のアプローチを試してください (必要に応じてこれを改良してください)。ここで、Cookie と「session()」関数を設定した後にページ自体を更新しようとしているのは、引数を持つ場合と持たない場合がある動的関数です。したがって、引数を渡すと、Cookie が設定されます。それ以外の場合は、存在するかどうかがチェックされます。func_num_args()に付随する関数はfunc_get_args()です。関数で予想される引数をサニタイズするのに役立ちます。

<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
ini_set("log_errors", 0);

session_start();

function sesion(){
  // func_num_args() number of arguments passed to the function
  if (func_num_args() == 0) { // if no arguments were passed, means the page is refreshed and cookie won't be set further
    if(isset($_COOKIE['id']) && isset($_COOKIE['alias'])){
      $_SESSION['logueado'] = true;
      $_SESSION['id'] = $_COOKIE['id'];
      $_SESSION['alias'] = $_COOKIE['alias'];

      return true;  //THIS IS NEVER RETURNING TRUE
    }
    if(isset($_SESSION['id']) && isset($_SESSION['logueado']) && $_SESSION['logueado'] == true){
      return true;
    }
    else {
      return false;
    }
  }
  else { // if number of args > 0, means you need to cookie here and refresh the page itself
    global $data; // set this to global as the $data will be available outside of this function
    setcookie("id",$data['id'], time()+3600*24*30,'/');
    setcookie("alias",$data['nombre'], time()+3600*24*30,'/');
    /**
     * refresh the page by javascript instead of header()
     * as header already being sent by the session_start()
     */
    echo '<script language="javascript">
    <!--
    window.location.replace("' . $_SERVER['PHP_SELF'] . '");
    //-->
    </script>';
    die();
  }
}

sesion(1); // passed an argument to set the cookie
?>

ページの URL が変更され、このスクリプトをページに含めようとしていると思われるため、JavaScript セクションで問題が発生すると思います。したがって、call_user_func()の助けを借りて、setcookie() 行の後の最後の「else」部分を次の行に変更します。

call_user_func("sesion");

これが今意味をなすことを願っています。

于 2011-07-22T12:52:04.827 に答える