web-dev-qa-db-ja.com

ローカルホストでは機能しないがライブサーバーでは機能するセッション(Codeigniter)

私は昨日からこの問題に直面していますが、これを解決することができませんでした。問題は、ローカル環境でセッションが機能しないことですが、テスト目的で同じファイルをライブサーバーに配置すると、問題なく機能します。

ここで私のconfig.phpファイルの場合:

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

$config['cookie_prefix']    = '';
$config['cookie_domain']    = '';
$config['cookie_path']      = '/';
$config['cookie_secure']    = FALSE;
$config['cookie_httponly']  = FALSE;

これは、モデルファイルの1つにデータを保存する方法です

$this->session->set_userdata('user',$result); //$result works fine, it produces
right result

私の考えでは、私はこれにアクセスしようとしました:

$this->session->userdata['user']['name']; //name here is an element in result array

私はこのエラーを受け取ります:

重大度:通知

メッセージ:未定義のインデックス:ユーザー

ファイル名:home/home.php

行番号:2

驚いたことに、この同じコードはサーバーでエラーなしで実行されます。

また、、Codeigniterセッションで保存されているデータを確認できるように、データベース方式を試しました。

config.phpファイルでコードを以下に変更しました

$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_sessions';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;

1行のデータを挿入する代わりに、4行を挿入します。以下のデータベースのスクリーンショットをご覧ください(最後の4行)。

Database Screenshot

誰かがエラーを指摘できますか?どんな助けでもありがたいです。

12
Shanil Soni

あなたの質問にはいくつかの部分があります。私はそれぞれに順番に答えます。

セッションからの値の取得について

userdata()はメソッドです。あなたがそれにアクセスしている方法は、それを配列として扱います:

$this->session->userdata['user']['name']; // Bad

ドキュメントで説明されているように 、取得する値のキーをパラメータとしてuserdataメソッドに渡す必要があります。

$user = $this->session->userdata('user');
// Now you can echo $user['name'];

さらに簡単なのは、新しい構文を使用することです。

$user = $this->session->user;
// Now you can echo $user['name'];

データベースの4つのセッションレコードについて

timestampフィールドを確認してください。それらは3つの異なる時間を示します。つまり、これらはサイト上の3つの別々のイベントです。最初は1501911275で発生し、6秒後にさらに2つのレコードがあり、次に139秒後に最後のレコードがあります。これらは、サイトへの3つの個別のリクエストを表しています。おそらく、別のページにアクセスしているか、テストしてリロードしていました。

whyに関しては、複数のレコードがあるのは、セッションIDが定期的に再生成されるためです。正確にどのくらいの頻度で発生するかは、構成によって異なります sess_time_to_update 構成オプションを参照してください。それらが破棄される頻度も設定に依存します(ドキュメントの同じセクションのsess_regenerate_destroyを参照)-通常、古いセッションレコードはしばらくの間残り、ガベージコレクションによって後でクリーンアップされます。そのため、「現在の」セッションレコードは1つしかありませんが、古いレコードはしばらく保持できます。

sess_save_pathについて

あなたの質問の文言から、filesセッションドライバーを使用したいと思います。テストのためにdatabaseドライバーのみを試しました。それが正しい場合は、修正する必要があるファイルセッション構成に問題があります。

ドキュメントによると

$ config ['sess_save_path']では絶対パスのみがサポートされています。

config/config.php のコメントにも次のように書かれています。

警告:絶対パスのみがサポートされています!

構成では、セッションデータを絶対パスではないci_sessionsに保存するように指定しています。

$config['sess_save_path'] = 'ci_sessions'; // Bad

どのように解釈されるかはわかりませんが、ディレクトリが存在せず、Webサーバーにそれを作成する権限がないと思います。ライブサーバーで動作する理由は想像できません。

パスを絶対パスに変更し、Webサーバーが書き込みできることを確認します。 ドキュメントからも

mkdir /<path to your application directory>/sessions/
chmod 0700 /<path to your application directory>/sessions/
chown www-data /<path to your application directory>/sessions/

www-dataを、Webサーバーを実行しているユーザーに変更します)。その後:

$config['sess_save_path'] = '/<path to your application directory>/sessions/';
5
Don't Panic

Codeigniter Class Referencesetuserdataを読み取る場合、2番目の引数が値であると想定しています。これは、最初の引数がキーである場合にエラーになるためです。

codeigniterの方法では、使用するとおりに目的を達成できません。

set このように:

$result=array('name'=>'john doe');

$this->session->set_userdata($result);または$this->session->set_userdata('name','john doe');

get このように:

echo $this->session->userdata(['name']);

一方、Vanilla php _$_SESSION_を使用すると、次のように実現できます。

セット:_$_SESSION['user']=$result;_

取得:_echo $_SESSION['user']['name'];_

$ -SESSIONについては phpマニュアル を参照してください

注:

驚いたことに、この同じコードはサーバーでエラーなしで実行されます。

これは、本番(ライブ)サーバーで_error_reporting_が制限されているため、ENVIRONMENT設定が原因です。これはルート_index.php_で設定されます。

define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');define('ENVIRONMENT', 'production');に変更すると、ローカルホストにもエラーが表示されなくなります。

更新:

実際には$this->session->set_userdata('name', $name);は機能しますが、関数userdata()は1つの引数しか受け入れず、文字列であると想定しています

セッションライブラリ(/system/libraries/Session/Session.php)を見ると、747行の近くにあります。

_/**
 * Userdata (fetch)
 *
 * Legacy CI_Session compatibility method
 *
 * @param   string  $key    Session data key
 * @return  mixed   Session data value or NULL if not found
 */
public function userdata($key = NULL)
{
    if (isset($key))
    {
        return isset($_SESSION[$key]) ? $_SESSION[$key] : NULL;
    }
    elseif (empty($_SESSION))
    {
        return array();
    }

    $userdata = array();
    $_exclude = array_merge(
        array('__ci_vars'),
        $this->get_flash_keys(),
        $this->get_temp_keys()
    );

    foreach (array_keys($_SESSION) as $key)
    {
        if ( ! in_array($key, $_exclude, TRUE))
        {
            $userdata[$key] = $_SESSION[$key];
        }
    }

    return $userdata;
}
_
1
Vickel
$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = NULL;
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;

$ config ['sess_regenerate_destroy'] = FALSE;

.htaccess

DirectoryIndex index.php
RewriteEngine on
RewriteCond $1 !^(index\.php|images|css|js|robots\.txt|favicon\.ico)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ ./index.php?/$1 [

L、QSA]

0
Sagar Tank

これらに従ってください

config.php内

_Set $config['sess_save_path'] = NULL;
_

あなたが言ったように$this->session->set_userdata('user',$result); //$result works fine, it produces上記の_$result_はこのようになります

_$result = array(
    'user'  => 'Ab',
    .....
    'logged_in' => TRUE
);
_

セッションキーにアクセスする方法

_echo $this->session->userdata('user');
_

または

_$user = $this->session->userdata('user');
echo $user;
_
0
Abdulla Nilam

不正な構文でのセッションデータへのアクセスに関する問題だと思います。以下の構文を使用して、セッションデータを設定し、セッションデータを取得できます。

セッションデータの設定例

$session_data = array('name' => "kiran");
$this->session->set_userdata('user', $session_data);

保存されたセッションデータを取得する例

$this->session->userdata('user')['name'];
0
Kiran Suthar

私はたくさんのR&D作業を行っていますが、問題は解決していませんが、突然MySQLのバージョンを確認しました。SQLのバージョンを変更すると機能します。このような問題がある場合は、バージョンを確認して結果を得ることができます。

0
Ram

問題はPHPバージョン7.1にあったようです。CI3.1.6はそのPHPバージョンをサポートしていなかったためです。

これが正しい説明かどうかはわかりませんが、PHPバージョン5.6に戻したところ、すべて正常に動作し始めました。

0
Shanil Soni