私は昨日からこの問題に直面していますが、これを解決することができませんでした。問題は、ローカル環境でセッションが機能しないことですが、テスト目的で同じファイルをライブサーバーに配置すると、問題なく機能します。
ここで私の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行)。
誰かがエラーを指摘できますか?どんな助けでもありがたいです。
あなたの質問にはいくつかの部分があります。私はそれぞれに順番に答えます。
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'];
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/';
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;
}
_
$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;
.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]
これらに従ってください
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;
_
不正な構文でのセッションデータへのアクセスに関する問題だと思います。以下の構文を使用して、セッションデータを設定し、セッションデータを取得できます。
セッションデータの設定例
$session_data = array('name' => "kiran");
$this->session->set_userdata('user', $session_data);
保存されたセッションデータを取得する例
$this->session->userdata('user')['name'];
私はたくさんのR&D作業を行っていますが、問題は解決していませんが、突然MySQLのバージョンを確認しました。SQLのバージョンを変更すると機能します。このような問題がある場合は、バージョンを確認して結果を得ることができます。
問題はPHPバージョン7.1にあったようです。CI3.1.6はそのPHPバージョンをサポートしていなかったためです。
これが正しい説明かどうかはわかりませんが、PHPバージョン5.6に戻したところ、すべて正常に動作し始めました。