🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

キャッシュ

キャッシュはドキュメントやデータを一時的に保管するもので、アクセス処理時間を短くするために使用されます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

2944閲覧

ページ遷移の際にキャッシュを使用したくない

yusuke.wanibe

総合スコア9

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

PHP

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

キャッシュ

キャッシュはドキュメントやデータを一時的に保管するもので、アクセス処理時間を短くするために使用されます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2019/12/30 08:20

編集2019/12/30 09:08

###はじめに
お世話になります。現在php学習中の者です。
学習を兼ねて、4択問題のできる学習サイトを作っています。
よくある英単語の学習サイトのようなものです。

ある程度は動いているのですが、ページ遷移の際に困ったことがあり質問させて頂きました。
質問以外の箇所でも、おかしな記述、書き方があれば教えていただけると助かります。
初めての質問で至らない点もあると思いますが、よろしくお願いします。

前提・実現したいこと

ページ遷移の際にキャッシュを使用したくない。

発生している問題

サイトの流れは以下の様になっています。

インデックスページ

レッスンカテゴリー選択ページ
↓(カテゴリーIDを渡す)
レッスン選択ページ
↓(レッスンIDを渡す)
レッスンページ
→渡されたカテゴリーIDとレッスンIDをもとにmySQLに接続。
カテゴリーIDとレッスンIDをもとに選択したレッスンの中から、ランダムに問題を選び、問題を表示する。

‐イメージ‐イメージ説明

困っているのはここからで、問題を解いて次の問題へ行くときです。

問題を解いた後、次の問題ページへ飛ぶ際なのですが、キャッシュを使用されてしまい、同じ問題のループになってしまいます。

前のページから引き継いだ、カテゴリーIDとレッスンIDをもとにアドレスを作っているので、現在のページと次のページのアドレスは同じになってしまいます。

現ページ  :/learning.php?category_id=1&lesson_id=1

次のページ :
/learning.php?category_id=1&lesson_id=1

アドレスが同じになってしまっているため、キャッシュが使用されてしまい、phpが実行されません。
phpが実行されないので、同じ問題のループになってしまいます。

キャッシュが使用されなければ解決するのですが、色々調べてみたものの解決手段を見つけることができず、質問させていただきました。
お手間おかけしますが、アドバイスいただけると助かります。

php

1<?php 2 3 require('./include/dbconnect.php'); 4 session_start(); 5 $category_id = $_REQUEST['category_id']; 6 $lesson_id = $_REQUEST['lesson_id']; 7 8 $lesson_info = $db ->query("SELECT questions_table,answers_table FROM lessons WHERE category_id = $category_id && lesson_id = $lesson_id"); 9 // 問題と答えのテーブル名を取得 10 11 foreach($lesson_info as $lesson_info_value){ 12 $answers_table = $lesson_info_value['answers_table']; 13 $questions_table = $lesson_info_value['questions_table']; 14 } 15 16 $max_question_id = $db->query("SELECT count(question_id) FROM $questions_table"); 17 // questions_tableにある問題数取得 18 $max_question_id = $max_question_id->fetch(PDO::FETCH_ASSOC); 19 // question_idをランダムに抽出 20 $question_id = mt_rand(1,$max_question_id['count(question_id)']); 21 // ランダムに選んだquestion_idのquestion_titleとquestionを抽出 22 $question_array = $db->query("SELECT question_title,question FROM $questions_table WHERE question_id = $question_id"); 23 // ランダムに選んだquestion_idのanswer_id,answerを抽出 24 $testbox = $db->query("SELECT $questions_table.answer_id,answer FROM $questions_table LEFT OUTER JOIN $answers_table ON $questions_table.answer_id = $answers_table.answer_id WHERE $questions_table.question_id = $question_id"); 25 // answer_id,answerを$testboxへ代入 26 $question_array = $question_array->fetchAll(); 27 foreach($testbox as $test){ 28 $correct_answer_id = $test['answer_id']; 29 $incorrect_anwer = $test['answer']; 30 } 31 $number_of_answers = 4; 32 // 問題数を4問設定 33 $max_answer_id = $db->query("SELECT count(answer_id) FROM $answers_table"); 34 // 答えの数を取得 35 $max_answer_id = $max_answer_id->fetch(PDO::FETCH_ASSOC); 36 37 $total_answer_id = [($correct_answer_id)]; 38 // $total_answer_idに$correct_answer_id(正解のID)を代入 39 for($i = 2; $i <= $number_of_answers; $i++){ 40 while(true){ 41 $incorrect_anwer_id = mt_rand(1,$max_answer_id['count(answer_id)']); 42 // 不正解の回答IDをmt_randで生成 43 if(! in_array($incorrect_anwer_id,$total_answer_id)){ 44 array_push($total_answer_id,$incorrect_anwer_id); 45 break; 46 } 47 } 48} 49 $total_answer_id = implode(",", $total_answer_id); 50 $answers_array = $db->query("SELECT answer,description FROM answers_html_tag WHERE answer_id IN ($total_answer_id)"); 51 // 回答と回答の説明を取得 52 foreach( $answers_array as $answer){ 53 $answers[] = $answer['answer']; 54 $answers_description[] = $answer['description']; 55 } 56 shuffle($answers); 57 // 回答の表示がID順にならないようシャッフル 58 59?> 60<!doctype html> 61<html lang="ja"> 62<head> 63<meta charset="utf-8"> 64<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 65<link rel="stylesheet" href="css/learning.css"> 66<link rel="stylesheet" href="css/responsive/learning-responsive.css"> 67<script src="https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js"></script> 68<title>TECH PRO</title> 69<!--共通common-head--> 70<?php include_once( $_SERVER['DOCUMENT_ROOT'] . '/study/TECH_PRO/include/common-head.inc'); ?> 71<!--共通common-head 終わり--> 72<script type="text/javascript" src="js/check-answer.js"></script> 73</head> 74<body class="learning__body"> 75<!--共通common-header--> 76<?php include_once( $_SERVER['DOCUMENT_ROOT'] . '/study/TECH_PRO/include/common-header.inc'); ?> 77<!--共通common-header 終わり--> 78<main> 79 <article class="learning__container"> 80 81 <?php foreach( $question_array as $question): ?> 82 <!-- <h2 class="learning__header">レッスンタイトル</h2> --> 83 <section class="question__box"> 84 <h3 class="question__title"><?php echo $question['question_title']; ?></h3> 85 <p class="question__description"><?php echo $question['question']; ?></p> 86 </section> 87 <?php endforeach; ?> 88 89 <section class="answer__box"> 90 <?php foreach( $answers as $answer): ?> 91 <?php if( $answer == $incorrect_anwer ):?> 92 <?php $correct_answer = $answer ?> 93 <button id="answer__btn--correct" class="answer__btn"><?php echo $correct_answer; ?></button> 94 <?php else: ?> 95 <button class="answer__btn answer__btn--incorrect"><?php echo $answer; ?></button> 96 <?php endif; ?> 97 <?php endforeach; ?> 98 </section> 99 100 </article> 101 <article id="check-answer__modal" class="check-answer__container"> 102 <section id="check-answer__box--correct" class="check-answer__box"> 103 <h2 class="check-answer__header">さすが!!正解です!!</h2> 104 <p>正解は"<?php echo $correct_answer ?>"!!</p> 105 <div class="check-answer__next-btn-box"> 106 <a class="check-answer__next-btn" href="learning.php?category_id=<?php echo $category_id ?>&lesson_id=<?php echo $lesson_value['lesson_id']; ?>">次の問題へ</a> 107 <a class="check-answer__next-btn" href="./lesson-category-list.php">カテゴリー一覧へ戻る</a> 108 </div> 109 <p>-解説-</p> 110 <?php foreach( $answers_description as $description): ?> 111 <p><?php echo $description; ?></p> 112 <?php endforeach; ?> 113 </section> 114 <section id="check-answer__box--incorrect" class="check-answer__box"> 115 <h2 class="check-answer__header">残念!!不正解です!!</h2> 116 <p>正解は"<?php echo $correct_answer ?>"!!</p> 117 <div class="check-answer__next-btn-box"> 118 <a class="check-answer__next-btn" href="learning.php?category_id=<?php echo $category_id ?>&lesson_id=<?php echo $lesson_value['lesson_id']; ?>">次の問題へ</a> 119 <a class="check-answer__next-btn" href="./lesson-category-list.php">カテゴリー一覧へ戻る</a> 120 </div> 121 <p>-解説-</p> 122 <?php foreach( $answers_description as $description): ?> 123 <p><?php echo $description; ?></p> 124 <?php endforeach; ?> 125 </section> 126 </article> 127</main> 128</body> 129</html>

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/12/30 08:27

そのまま、responseにキャッシュを使用しない(期限を過去日など)宣言すればいいだけだが何がわからないの? 調べ方がわからないの?
yusuke.wanibe

2019/12/30 08:38

回答ありがとうございます。 調べ方も、どのように記述したらよいかもわからないです。 すみません。よろしくお願いします。
退会済みユーザー

退会済みユーザー

2019/12/30 08:59

ページ移管とかいうと、サーバーの引っ越しか何かを想像してしまう。おそらくページ遷移って書かないと誤解されかねないです。
yusuke.wanibe

2019/12/30 09:09

すみません。ありがとうございます。 修正させていただきました。よろしくお願いします。
m.ts10806

2019/12/30 09:12

ざっとしか読んでませんが、キャッシュですか?これ。 単に「次の問題」を正しく取得してないだけにしか見えませんが・・
yusuke.wanibe

2019/12/30 09:17

ありがとうございます。 アドレスが同じなので、キャッシュを読みに行っていると思ったのですが、、、 ”単に「次の問題」を正しく取得してないだけにしか見えませんが・・” というとどのように記述したらよいでしょうか? アドバイスいただけると助かります。
退会済みユーザー

退会済みユーザー

2019/12/30 09:30

ある質問idの回答マッチングタイミングと、次の質問の出題タイミングがどうなってるんだろう
m.ts10806

2019/12/30 09:33

まず表示されたページのhtmlを確認してください。その時点でURLその通りになってるはずです。 キャッシュが関係あるような機能ではないように思います。 コード内検索かけた感じ「$lesson_value」がどこにも設定されてないように見受けられますが、 ここ省かれてます?
yusuke.wanibe

2019/12/30 10:55

アドバイスありがとうございます。 すみません。ご指摘いただいた通り、”単に「次の問題」を正しく取得してないだけ”でした。 本当に助かりました。ありがとうございます。
guest

回答2

0

ベストアンサー

PHPスクリプトの先頭で以下を実行してみてください。

PHP

1session_cache_limiter('nocache');

これを追加したあと、スクリプトを確実に読み込ませるために一度リロードしてから画面遷移してみてください。

実はこの設定はPHPのデフォルトです。session_start()すると、PHPのデフォルトではキャッシュが無効化されるはずなのですが、php.iniなどで設定が変更されていると、キャッシュが有効になっている可能性があります。
session_cache_limiter関数を使うと、この設定を上書きできます。


【追記】
質問へのコメントにあるように、単に次の問題を読めていないように見えますね。キャッシュ制御の方法としては有効なので回答自体は残します。

投稿2019/12/30 09:23

編集2019/12/30 09:25
ockeghem

総合スコア11705

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

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

yusuke.wanibe

2019/12/30 11:00

アドバイスありがとうございます。 すみません。ご指摘いただいた通り、”単に「次の問題」を正しく取得してないだけ”でした。 session_cache_limiterもありがとうございます。 存在すら知らなかったので、勉強になりました。 本当に助かりました。ありがとうございます。
guest

0

<META>-HTMLタグリファレンス

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">

・・・ならどうだろうか

あるいは、session_cache_limiterを使って、HTTPレスポンスヘッダー上でキャッシュ制御してしまうとか。(徳丸さん案)


php

1for($i = 2; $i <= $number_of_answers; $i++){

2から始まるの、気になるわー。


php

1$max_question_id = $db->query("SELECT count(question_id) FROM $questions_table");

これ、ほしい値を取得できてるの?
PDO::query()なら、結果はPDOStatementで返ってくるので、単純な値ではないことくらいわかるはず。
例えば、質問id候補を必要なだけ配列に取得した後、
配列のサイズの中でランダムに選び出しての、
質問取得かなぁ。
質問idが0から始まらず飛び飛びだとしても、
質問id候補を必要なだけ配列に取得するときの添字は0から順に始まるだろうし。

投稿2019/12/30 09:13

編集2019/12/30 09:26
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yusuke.wanibe

2019/12/30 09:26

ありがとうございます。 ”<meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache">” 試してみたのですが、上手くいきませんでした。 他の部分のご指摘もありがとうございます。 見返してみます。
退会済みユーザー

退会済みユーザー

2019/12/30 09:34

Xdebugを活用したリモートデバッグ、あるいは場面場面でvar_dump()を駆使して、欲しいデータが適切に変数に格納できているかをチェックしてください。あと、画面レイアウトの説明だけでなく、アルゴリズム的な話もわかり易く説明ほしい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問