質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

Q&A

1回答

1049閲覧

CodeIgniter(PHP)において$this->session->set_userdataでセッションが利用できない件に関して

xsaxs

総合スコア2

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

0グッド

0クリップ

投稿2022/08/27 09:00

編集2022/08/28 09:55

質問

MacbookでCodeIgniter3.06を使用してsessionを使用して簡単なアプリを作ろうとしております。その際に下記の部分でsessionがうまく表示されず詰まっております。よろしくお願いいたします。

写真

イメージ説明

目標

写真の yourname is 〇〇
の部分にセッションで保存した名前を表示すること

コード

Controler/Main.php

コード <?php defined('BASEPATH') or exit('No direct script access allowed'); class Main extends CI_Controller { public function login_validation(){ $this->load->library("form_validation"); $this->form_validation->set_rules("username", "Username", "required|trim|callback_validate_credentials"); $this->form_validation->set_rules("password", "Password", "required|trim|md5"); if($this->form_validation->run()){ //このページでセッションを確認する redirect("main/registration"); }else{ $this->load->view('body_login'); } } public function validate_credentials(){ $this->load->model("news_model"); if ($this->news_model->can_log_in()){ return true; }else{ //ログインが失敗した際のこちらのフラッシュデータは問題なく表示されます。 $this->session->set_flashdata("message", "incorrect username or password"); return false; } } }

Model / News_model.php

コード <?php class News_model extends CI_Model { public function can_log_in(){ $this->db->where('username', $this->input->post('username')); $this->db->where('password', md5($this->input->post('password'))); $query = $this->db->get("accounts"); if ($query->num_rows() == 1) { $row = $query->row(); $data = array( "username" => $row->username ); //var_dump($data);の結果は下記に記載 $this->session->set_userdata($data); return true; }else{ return false; } } }

View( redirect("main/registration")で表示されるページのコード)

コード <!DOCTYPE html> <html lang="en"> <head> <link rel="stylesheet" href="<?php echo base_url(); ?>assets/bootstrap-3.4.1-dist/css/bootstrap.min.css"> </head> <body> <h1><?= "yourname is" . $this->session->username ?></h1> <!-- 開発用 --> <h1><?= $this->session->username; ?></h1> <h1><?php echo print_r($this->session->all_userdata()); ?></h1> <?php echo $this->session->username; ?> <h1><?php echo pr($_SESSION) ?></h1> <h1><a href="<?= base_url(); ?>main/logout">logout</a></h1> //省略 </body> </html>

追記

Model / News_model.php(Medelのコード)において
var_dump($data)を実行したところ、

array( "username" => "パスワード" );

のようにしっかりと表示されていたことから、セッションの保存期間や保存場所に問題があるのかもしれないとも考えております。
また、パスワードと名前が一致しない場合には
Controler/Main.php

$this->session->set_flashdata("message", "incorrect username or password");

flashdataが表示されることも参考になるかもしれません。ただそれでもいまだに根本的な原因がわからないでいます。

追記1

イメージ説明

イメージ説明

追記2

Controllers/main.php (Controller)

<?php defined('BASEPATH') or exit('No direct script access allowed'); class Main extends CI_Controller { public function index() { $this->load->view('head_login'); $this->load->view('body_login'); $this->load->view('footer'); } public function registration(){ $this->load->view('head'); $this->load->view('body_registration'); $this->load->view('footer'); } public function registration_account(){ $this->load->model("news_model"); $pass = md5($this->input->post('password')); $this->news_model->registration_add($pass); redirect("main/registration"); } public function login_validation(){ $this->load->library("form_validation"); $this->form_validation->set_rules("username", "Username", "required|trim|callback_validate_credentials"); $this->form_validation->set_rules("password", "Password", "required|trim|md5"); if($this->form_validation->run()){ // $this->session->set_flashdata('message', '次ページではこのメッセージは取得できません'); $this->session->set_userdata('username', 'コメント主からのメッセージ'); $this->session->set_flashdata('message', 'コメント主からのメッセージ'); $this->session->set_flashdata('username', 'コメント主からのメッセージ'); redirect("main/registration"); }else{ $this->session->set_flashdata('message', 'ログインに失敗しました'); $this->load->view('body_login'); } } public function validate_credentials(){ $this->load->model("news_model"); if ($this->news_model->can_log_in()){ // $this->session->set_flashdata("message", "OK"); return true; }else{ $this->session->set_flashdata("message", "incorrect username or password"); return false; } } public function logout(){ $this->session->sess_destroy(); redirect("main/index"); } }

追記4

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m1y474

2022/08/28 08:28

main/registration に対応するControllerの部分も追記いただくことは可能でしょうか
xsaxs

2022/08/28 08:31

かしこまりました。少々お待ちください
xsaxs

2022/08/28 08:34

追記2 に追加させて頂きました
guest

回答1

0

redirect("main/registration");の前に$this->session->set_userdata('username', '表示したいテキスト');を追加したら表示されないでしょうか?

php

1class Main extends CI_Controller 2{ 3 public function login_validation(){ 4 $this->load->library("form_validation"); 5 $this->form_validation->set_rules("username", "Username", "required|trim|callback_validate_credentials"); 6 $this->form_validation->set_rules("password", "Password", "required|trim|md5"); 7 if($this->form_validation->run()){ 8//このページでセッションを確認する 9 $this->session->set_userdata('username', '表示したいテキスト'); // 追加 10 redirect("main/registration"); 11 }else{ 12 $this->load->view('body_login'); 13 } 14 }

投稿2022/08/28 06:38

編集2022/08/28 07:25
m1y474

総合スコア23

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xsaxs

2022/08/28 08:22 編集

コメントありがとうございます。 上記のように追記した場合、 追記1(質問文中)のようになりました。 ログインページからバリデーションに成功して登録ページ(今回「your name is 〇〇」を表示させるページ) に移動した際にやはり <?= "yourname is" . $this->session->username ?> の部分は表示されないでいます。 追記1写真のコード <head> <link rel="stylesheet" href="<?php echo base_url(); ?>assets/bootstrap-3.4.1-dist/css/bootstrap.min.css"> </head> <body> <h1><?= "yourname is" . $this->session->username ?></h1> <!-- 開発用 --> <h1><?= $this->session->username; ?></h1> <h1><?php echo print_r($this->session->all_userdata()); ?></h1> <h1><a href="<?= base_url(); ?>main/logout">logout</a></h1> (省略)
xsaxs

2022/08/28 08:51 編集

また、このページ遷移においてはなぜか $this->session->set_flashdata('username', '表示したいテキスト'); で <?= $this->session->flashdata('username') ?><br> を表示させることもできないと言った状況になっております。
m1y474

2022/08/28 08:41

念の為確認ですが、`$this->load->library('session');`の記述がないのは`application/config/autoload.php`の`$autoload['libraries']`で設定済み、という認識で良いでしょうか
xsaxs

2022/08/28 08:51 編集

そうですね。 application/config/autoload.php に $autoload['libraries'] = array("database", "session"); のようにしっかり記述しています。 なので名前もしくはパスワードが間違った場合には 別のファイルですが $this->session->flashdata('message') が作動します
m1y474

2022/08/28 09:18 編集

ご返信・質問への追記ありがとうございます。 コードの全文を確認しました。 HTMLを見たところ、formのactionがregistration_accountになっているのでlogin_validationを通っていないのではないでしょうか...? `registration_account()`に`$this->session->set_flashdata('username', '表示したいテキスト');`を追加すると表示されないでしょうか? ```php public function registration_account(){ $this->load->model("news_model"); $pass = md5($this->input->post('password')); $this->news_model->registration_add($pass); $this->session->set_flashdata('username', '表示したいテキスト'); // 追加 redirect("welcome/registration"); } ```
xsaxs

2022/08/28 09:48

yourname is 〇〇のページは次のようなコード構成なのですが、 <h1>Register Page</h1> <?= form_open("main/registration_account") ?> <?= $this->session->flashdata('message') ?><br> <?= $this->session->flashdata('username') ?><br> <label for="username">username</label> <input type="text" name="username"><br> <label for="password">password</label> <input type="password" name="password"><br> <input type="submit" name="submit" value="submit"> <?= form_close() ?> このページで適当にユーザーデータを登録し、m1y474様の提案の通りに ```php public function registration_account(){ $this->load->model("news_model"); $pass = md5($this->input->post('password')); $this->news_model->registration_add($pass); $this->session->set_flashdata('username', '表示したいテキスト'); // 追加 redirect("welcome/registration"); } ``` を追加したのですが、なぜか何も表示されませんでした
xsaxs

2022/08/28 09:49

また、
xsaxs

2022/08/28 09:54 編集

>HTMLを見たところ、formのactionがregistration_accountになっているのでlogin_validationを通っていないのではないでしょうか...? に関してですが、最初のログインページ(追記4)では ``` <h1>Login Page</h1> <?= form_open("main/login_validation") ?> <?= $this->session->flashdata('message') ?><br> <label for="username">username</label> <input type="text" name="username"><br> <label for="password">password</label> <input type="password" name="password"><br> <input type="submit" name="submit" value="submit"> h1><?php pr($this->session->all_userdata()); ?></h1> <?= form_close(); ?> ``` のようなコード構成になっておりまして、 そのばリデーションがうまく行きますと 追記1の写真(yourname is 〇〇のページ、登録画面、register画面) のような formのactionがregistration_accountのページに遷移される構成となっております。 わかりにくい部分が多々あり申し訳ございません!
Clementine

2023/05/23 05:25

Codeigniterのバーションは3系なら3.2.0の使用を推奨します。 これ以下のバージョンはセッション周りに不具合があり正しく動作しません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問