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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

3766閲覧

正解しても正答率が0%と表示されます。

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2018/08/14 07:52

前提・実現したいこと

クイズアプリを開発し、正答率を表示させたいです。

発生している問題・エラーメッセージ

正解しても正答率が0%と表示されます。
イメージ説明
Quiz.phpのcheckAnswer()の、
if ($correctAnswer === $_POST['answer'])の$_POST['answer']に値が入っていないので、
結果がFALSEになり、correct_countがカウントアップしていないと思います。

該当のソースコード

index.php

php

1<?php 2// 外部ファイル参照 3require_once(__DIR__ . '/config.php'); 4require_once(__DIR__ . '/Quiz.php'); 5require_once(__DIR__ . '/functions.php'); 6// インスタンス化 7$db = new Quiz(); 8 9// 初期化 10$tmp = $db->GetData(); 11$data = $db->DisplayQuestion(); 12$array = $db->DisplayChoices(); 13$tmp2 = $db->getScore(); 14var_dump($tmp2); 15 16shuffle($array); 17 18?> 19 20<!DOCTYPE html> 21<html lang="ja"> 22<head> 23 <meta charset="utf-8"> 24 <title>Quiz</title> 25 <!-- Required meta tags --> 26 <meta charset="utf-8"> 27 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 28 29 <!-- Bootstrap CSS --> 30 <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css" integrity="sha384-WskhaSGFgHYWDcbwN70/dfYBj47jz9qbsMId/iRN3ewGhXQFZCSftd1LZCfmhktB" crossorigin="anonymous"> 31 <link rel="stylesheet" href="styles.css"> 32 33</head> 34<body> 35<header id="header"> 36<p>English Quiz</p> 37</header> 38 <?php if ($db->isFinished()) : ?> 39 <div id="container"> 40 <div id="result"> 41 Your score ... 42 <!-- <div><?= h($db->getScore()); ?> %</div> --> 43 <div><?= h(var_dump($db->getScore())); ?> %</div> 44 45 </div> 46 <a href=""><div id="btn">Replay?</div></a> 47 </div> 48 <?php $db->reset(); ?> 49 50 <?php else : ?> 51<div id="container"> 52 <p class="h1"><?= h($data); ?></p> 53 <ul class="list-group"> 54 <?php foreach ($array as $a) : ?> 55 <li class="list-group-item answer"><?= $a; ?></li> 56 <?php endforeach; ?> 57 </ul> 58 <div id="btn" class="disabled"><?= $db->isLast() ? 'Show result' : 'Next Question'; ?></div> 59 </div> 60 <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> 61 <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script> 62 <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js" integrity="sha384-smHYKdLADwkXOn1EmN1qk/HfnUcbVRZyYmZ4qpPea6sjB/pTJ0euyQp0Mk8ck+5T" crossorigin="anonymous"></script> 63 64 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 65 <script src="quiz.js"></script> 66 <?php endif; ?> 67 </body> 68</div> 69</body> 70</html>

_answer.php

php

1<?php 2 3require_once(__DIR__ . '/config.php'); 4require_once(__DIR__ . '/Quiz.php'); 5 6$db = new Quiz(); 7$tmp = $db->GetData(); 8$data = $db->DisplayQuestion(); 9$array = $db->DisplayChoices(); 10$correctAnswer = $db->checkAnswer(); 11 12// PHPで値をJSON形式で表示する 13header('Content-Type: application/json; charset=UTF-8'); 14echo json_encode([ 15 'correct_answer' => $correctAnswer 16]);

Quiz.php

php

1<?php 2 3//namespace MyApp; 4 5class Quiz { 6 7 private $_db; 8 private $obj_to_array; 9 private $_quiz; 10 11 public function __construct() { 12 $this->_setup(); 13 14 if (!isset($_SESSION['current_num'])) { 15 $this->_initSession(); 16 } 17 } 18 19 private function _setup() { 20 define('DB_DATABASE', 'iiii'); 21 define('DB_USERNAME', 'yyyy'); 22 define('DB_PASSWORD', 'zzzz'); 23 define('PDO_DSN', 'mysql:host=xxxxx.xxxxx.ne.jp;dbname=' . DB_DATABASE); 24 25 try { 26 $this->_db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); 27 $query_result = $this->_db->query("SELECT * from qa_table"); 28 // データベースの全フィールドを抽出する 29 $db_data = $query_result->fetchAll(\PDO::FETCH_OBJ); 30 // オブジェクトから配列に変換する 31 $this->obj_to_array = json_decode(json_encode($db_data), true); 32 33 34 } catch(PDOEXception $e) { 35 echo $e->getMessage(); 36 exit; 37 } 38 } 39 private function _initSession() { 40 $_SESSION['current_num'] = 0; 41 $_SESSION['correct_count'] = 0; 42 } 43 44 public function GetData() { 45 $query_result = $this->_db->query("SELECT * from qa_table"); 46 // データベースの全フィールドを抽出する 47 $db_data = $query_result->fetchAll(\PDO::FETCH_OBJ); 48 // オブジェクトから配列に変換する 49 $this->obj_to_array = json_decode(json_encode($db_data), true); 50 } 51 52 public function DisplayQuestion() { 53 return $this->obj_to_array[$_SESSION['current_num']]['question']; 54 } 55 56 public function DisplayChoices() { 57 $this->_quiz = explode(",", $this->obj_to_array[$_SESSION['current_num']]['choices']); 58 return $this->_quiz; 59 60 } 61 62 public function checkAnswer() { 63 $this->_quiz = explode(",", $this->obj_to_array[$_SESSION['current_num']]['choices']); 64 $correctAnswer = $this->_quiz['0']; 65 if ($correctAnswer === $_POST['answer']) { 66 $_SESSION['correct_count']++; 67 } 68 $_SESSION['current_num']++; 69 return $correctAnswer; 70 } 71 72 public function isLast() { 73 return count($this->obj_to_array) === $_SESSION['current_num'] + 1; 74 } 75 76 public function isFinished() { 77 return count($this->obj_to_array) === $_SESSION['current_num']; 78 } 79 80 public function getScore() { 81 return round($_SESSION['correct_count']/count($this->obj_to_array)*100); 82 } 83 public function reset() { 84 $this->_initSession(); 85 } 86}

quiz.js

jQuery

1$(function() { 2 'use strict'; 3 4 $('.answer').on('click', function() { 5 var $selected = $(this); 6 $selected.addClass('selected'); 7 var $answer = $selected.text(); 8 9 $.post('/_answer.php', { 10 11 }).done(function(res) { 12 $('.answer').each(function() { 13 if ($(this).text() === res.correct_answer) { 14 // $answer.addClass('correct')は文法的にうまくいかなかった 15 $(this).addClass('correct'); 16 } else { 17 $(this).addClass('wrong'); 18 } 19 }); 20 21 if ($answer === res.correct_answer) { 22 alert("good!"); 23 } else { 24 alert("so bad!!"); 25 } 26 27 $('#btn').removeClass('disabled'); 28 }); 29 }); 30 31 $('#btn').on('click', function() { 32 if (!$(this).hasClass('disabled')) { 33 location.reload(); 34 } 35 }) 36});

試したこと

if ($correctAnswer === $_POST['answer'])をコメントアウトしたら、
correct_countがカウントアップしました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

postする際のリクエストパラメータが抜けていませんか?

javascript

1$.post('/_answer.php', { 2 // ここにパラメータが必要 3}).done(function(res) {

下記は参考として。(Exampleの項目を見ると使い方がわかりやすいと思います。)
jQuery.post()

投稿2018/08/14 08:06

編集2018/08/14 08:08
yuusuko

総合スコア145

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

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

退会済みユーザー

退会済みユーザー

2018/08/14 12:02

ありがとうございます。解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問