前提・実現したいこと
PHPでクイズアプリを開発しています。
データベースのテーブルから問題と選択肢(正答1個、誤答3個)を取り出し、クラス内の配列に代入する処理を作りたいです。
発生している問題・エラーメッセージ
テーブルから取り出した値をクラス内の配列に代入できない
該当のソースコード
データベース:quiz_db
テーブル:quiz_tbl
SQL
1mysql> show columns from quiz_tbl; 2+----------------+--------------+------+-----+---------+----------------+ 3| Field | Type | Null | Key | Default | Extra | 4+----------------+--------------+------+-----+---------+----------------+ 5| id | int(11) | NO | PRI | NULL | auto_increment | 6| question | varchar(100) | YES | | NULL | | 7| correct_answer | varchar(20) | YES | | NULL | | 8| wrong_answer1 | varchar(20) | YES | | NULL | | 9| wrong_answer2 | varchar(20) | YES | | NULL | | 10| wrong_answer3 | varchar(20) | YES | | NULL | | 11+----------------+--------------+------+-----+---------+----------------+
index.php
PHP
1<?php 2require_once(__DIR__ . '/config.php'); 3 4$quiz = new MyApp\Quiz(); 5 6... 7?>
config.php
PHP
1<?php 2ini_set('display_errors', 1); 3session_start(); 4require_once(__DIR__ . '/dbconnect.php'); 5require_once(__DIR__ . '/Quiz.php'); 6?>
dbconnect.php
PHP
1define('DB_DATABASE', 'quiz_db'); 2define('DB_USERNAME', 'dbuser'); 3define('DB_PASSWORD', 'password'); 4define('PDO_DSN', 'mysql:dbhost=localhost;dbname=' . DB_DATABASE); 5 6try { 7 $db = new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD); 8 $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 9 10 $quizzes = $db->query('SELECT * FROM quiz_tbl'); 11 $q = $quizzes->fetchAll(PDO::FETCH_ASSOC); 12} catch (PDOException $e) { 13 echo 'DB接続エラー:' . $e->getMessage(); 14}
Quiz.php
PHP
1namespace MyApp; 2 3class Quiz { 4 private $_quizSet = []; 5 6 public function __construct() { 7 $this->_setup(); 8 } 9 10 private function _setup() { 11 if (isset($q) && !empty($q)) { 12 while ($q) { 13 $this->_quizSet[] = [ 14 'q' => $q['question'], 15 'a' => [$q['correct_answer'], $q['wrong_answer1'], $q['wrong_answer2'], $q['wrong_answer3']] 16 ]; 17 } 18 } else { 19 $this->_quizSet[] = [ 20 'q' => 'What is A?', 21 'a' => ['A0', 'A1', 'A2', 'A3'] 22 ]; 23 } 24 } 25} 26?>
試したこと
config.phpでdbconnect.phpとQuiz.phpを読み込む。
dbconnect.phpでデータベース接続かつテーブル内の値をquery関数とfetchAll関数で取り出し、変数に代入。
Quiz.phpでクラス作成、配列を定義し、インスタンスを生成時にデータベースから取り出した値をセット。
セットできなければQuiz.php内で任意の値をセット。
補足情報(FW/ツールのバージョンなど)
ローカル開発環境(vagrant)
php バージョン5.6.40
MySQL バージョン5.6.45