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

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

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

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

Q&A

解決済

1回答

1324閲覧

file_get_contents()で取得したページにセッションを引き継ぎたい

dcf

総合スコア20

PHP

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

0グッド

0クリップ

投稿2019/06/15 10:28

前提・実現したいこと

現在PHPでログイン機能を持つ掲示板を作成しているのですが、Cache_Liteというライブラリを用いてキャッシュによる表示を実現したいです。
具体的には、キャッシュが存在しなければfile_get_contents()でURLを読み込み表示し、キャッシュが存在すればキャッシュを用いて表示するという仕組みにしていますが、ログイン時にログインしたユーザーの名前をセッションで保持し、掲示板ページで表示するようにしていたのですが、file_get_contents()でページを読みこんだ際にセッションが引き継がれなくて困っています。
ページ構成はa.php(ログインページ)、b.php(掲示板ページ)、c.php(キャッシュによるページ表示)となっています。ログイン後にb.phpに直接飛ぶのではなくc.phpに飛び、b.phpを呼び出すという形を検討していますがその他の方法がありましたらご提示いただけると幸いです。

該当のソースコード

a.php

PHP

1ここでセッション変数$_SESSION[NAME]に値を代入 2ログイン後c.phpへheader()で飛ぶ

b.php

PHP

1掲示板処理

c.php

PHP

1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"> 3<head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 5 <title>c.php</title> 6</head> 7<body> 8<?php 9 10session_start(); 11if(!$_SESSION[NAME]){ 12 header("location:a.php"); 13} 14 15require_once('Cache/Lite.php'); 16 17$id = '123'; 18 19$options = array( 20 'cacheDir' => 'Cache/tmp/', 21 'caching' => 'true', 22 'lifeTime' => 600, 23 'automaticSerialization' => 'true' 24); 25 26 27$Cache_Lite = new Cache_Lite($options); 28 29$cache_data = $Cache_Lite->get($id); 30$type = gettype($cache_data); 31if ($type === string){ 32 $content = $cache_data; 33 echo 'キャッシュがありました!'.'<br>'; 34 35}else{ 36 $get_data = file_get_contents("b.php"); 37 $content = $get_data; 38 $Cache_Lite->save($content); 39 echo 'キャッシュが無かったのでキャッシュを保存しました!'.'<br>'; 40} 41echo($content); 42 43?> 44</body> 45</html>

試したこと

この問題について検索しましたが、解決策はみつかりませんでした

補足情報(FW/ツールのバージョンなど)

PHP Version 5.2.4

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

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

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

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

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

guest

回答1

0

ベストアンサー

file_get_contents()は基本的に文字列をそのまま取得するものであって、PHPは評価できません。どうしてもPHPを評価したい場合はeval()をする必要があります。

手法を変えて、下記のようにしてみてはいかがでしょうか?

b.phpで今まで通りのHTML文字列が、returnで返ってくるようにして、下記の呼び出し時にinclude(), require()などを使ってHTMLを取得します。

こうすることで、b.php内のPHPが評価されてから変数に格納されることになります。

//... if ($type === string){ $content = $cache_data; echo 'キャッシュがありました!'.'<br>'; }else{ $get_data = include("b.php"); //←ここ $content = $get_data; $Cache_Lite->save($content); echo 'キャッシュが無かったのでキャッシュを保存しました!'.'<br>'; } echo($content); //...
// b.php // ... return HTML文字列;

投稿2019/06/15 11:16

編集2019/06/15 11:19
Tomak

総合スコア1652

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

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

dcf

2019/06/15 12:31

回答ありがとうございます! おかげさまでセッションを引き継ぐことができました! しかし、「b.phpで今まで通りのHTML文字列がreturnで返ってくるように」という部分についてfile_get_contents()を用いてみたのですが上手くいきませんでした。 b.phpのファイル全体をhtmlとして読み取りreturnで返すという解釈でよろしいのでしょうか?
Tomak

2019/06/15 13:39 編集

>「b.phpで今まで通りのHTML文字列がreturnで返ってくるように」という部分についてfile_get_contents()を用いてみたのですが上手くいきませんでした。 file_get_contents() を使うと例えばPHPコードが下記のように文字列になってしまいます。 「'$a = 1;'」 > b.phpのファイル全体をhtmlとして読み取りreturnで返すという解釈でよろしいのでしょうか? b.php のファイルをインクルードしてるだけなのですが、include(), require() それぞれインクルード先ファイル内に「return」があると return の文字列をそのまま返すという機能があります。これを使って、インクルードだけどHTMLを文字列として返すということができています。 よく使われる機能ですので覚えておくと便利です。
dcf

2019/06/15 13:55

ご返答ありがとうございます 現在、b,phpのreturnの後に何を記述すればよいのかで詰まってしまっています。 return; のようになにも記述しなかったところキャッシュファイルの中身がNULLになってしまいました 何か解決策をご存じでしたら教えていただけると幸いです 何度もすみません
Tomak

2019/06/15 14:07

b.php は掲示板処理ですよね?この掲示板の表示HTMLを変数に入れておいて、最後に return するのですが、処理が長い場合や複雑で面倒なは、ob_start() で出力文字列をキャプチャーすることも可能です。 ↓b.php です。 // 掲示板HTML格納変数 $html .= '掲示板のHTML1'; $html .= '掲示板のHTML2'; return $html;
dcf

2019/06/15 16:46

ob_start()を用いたところ無事に希望通りの機能を実装できました! 大変ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問