###『回答』『参考サイトの紹介』『NetBeans デバッグ方法』
回答です。
PhpBlogApplication.php (MiniBlogApplication.php)
誤 protected function cofigure()
正 protected function configure()
既に、指摘されていますが、DB への接続ミスです。
NetBeans IDE デバッグ機能 を使って解決しました。
参考サイトの紹介です。
パーフェクトPHP デバッグ (処理の流れ | ユーザ登録機能作成)
パーフェクトPHP デバッグ (チェックポイント)
パーフェクトPHP デバッグ (その他) (具体的な 環境設定手順)
パーフェクトPHP デバッグ (NetBeans デバッグ方法) (具体的な デバッグ例)
パーフェクトPHP をデバッグしました (学習方法)
パーフェクトPHP をデバッグしました (やる気のある初心者)
パーフェクトPHP をデバッグしました (学習方法) や
パーフェクトPHP をデバッグしました (やる気のある初心者) に
書いてありますが、「写経」はおすすめしません。
【パーフェクトPHP デバッグ 動作環境】
- XAMPP 5.6.31
- NetBeans 8.2
学習環境なので XAMPP 7.x.x (PHP 7.x.x) にする必要はありません。
XAMPP 7.x.x でも動作しますが、Xdebug の準備が必要です。
XAMPP 7.1.14 と NetBeans IDE 8.2 の不具合
サンプルコードは、フレームワークの 使い方 ではなく、
フレームワークとオブジェクト指向の 考え方 について書かれているので
バージョンは、関係ありません。
####NetBeans デバッグ方法
【エラーの原因】
NetBeans IDE デバッグ機能 を使った デバッグ です。
注意点
- 公式サイト サンプルコード(mini-blog.zip) を使用 (不具合 2ヶ所修正)
- デバッグ中の変数の変更は、メモリ上です (ファイルは元のまま)
- index.php ではなく index**_dev**.php を使用します
サンプルコードの仕様 と orangefarmerさんの仕様 との違い (ホームページ表示とログイン)
サンプルコードの仕様
- ホームページ (エラー ログ #5 Application->runAction('status', 'index', Array))
orangefarmerさんの仕様
- 未ログインで、ホームページ表示が実行されます (今回は DB への接続ミス で 処理は中断)
- エラー ログ #2 StatusRepository->fetchAllPersonalArchivesByUserId(NULL) 本来は、NULLの部分に ログインユーザ ($user['id']) の 値 がセットされます
- ログインする 仕様の場合、ホームページ表示前に userテーブル使用で DB への接続ミス が発生します
デバッグ対策 下記 NetBeans ブレークポイント Session 49 参照
orangefarmerさんの仕様 に合わせるため、強引に 未ログイン状態 可 にしています
参考
エラー ログ
- #5 Application->runAction('status', 'index', Array))
- #2 StatusRepository->fetchAllPersonalArchivesByUserId(NULL)
#6 C:\xampp\htdocs\php-blog.localhost\web\index_dev.php(7): Application->run()
#5 C:\xampp\htdocs\php-blog.localhost\core\Application.php(103): Application->runAction('status', 'index', Array)
#4 C:\xampp\htdocs\php-blog.localhost\core\Application.php(123): Controller->run('index', Array)
#3 C:\xampp\htdocs\php-blog.localhost\core\Controller.php(41): StatusController->indexAction(Array)
#2 C:\xampp\htdocs\php-blog.localhost\controllers\StatusController.php(8): StatusRepository->fetchAllPersonalArchivesByUserId(NULL)
#1 C:\xampp\htdocs\php-blog.localhost\models\StatusRepository.php(22): DbRepository->fetchAll('select a.*, u.u...', Array)
#0 C:\xampp\htdocs\php-blog.localhost\core\DbRepository.php(32): DbRepository->execute('select a.*, u.u...', Array)
Fatal error: Call to a member function prepare() on bool
NetBeans ブレークポイント (3ヶ所設定 *) と 処理順序
PHP | 行 | 内容 | 次のアクション |
---|
Application | 184* | $controller("status"), $action("index") | 続行 (F5) |
Session | 103* | isAuthenticated ログインチェック | ステップ・イン (F7) 2回 |
Session | 49 | $default true に変更 (上記 仕様) | 続行 (F5) |
DbRepository | 41* | $this->con false に変更 | 続行 (F5) |
注 Session 49 は、ブレークポイントではありません
NetBeans デバッグ方法 参照
原因
デバッグを実行すると、最後に エラーが「再現」 されます
「正しい」データベースへの接続設定 (PDO インスタンス) の
$this->con を「壊しています」
(DbRepository 41* $this->con false に変更)
エラーの原因は、DB への接続ミスです
Application.php
PHP
1 ...
2173 public function run()
3174 {
4175 try {
5176 $params = $this->router->resolve($this->request->getPathInfo());
6177 if ($params === false) {
7178 throw new HttpNotFoundException('No route found for ' . $this->request->getPathInfo());
8179 }
9180
10181 $controller = $params['controller'];
11182 $action = $params['action'];
12183
13184* $this->runAction($controller, $action, $params); /* ブレークポイント */
14185 } catch (HttpNotFoundException $e) {
15186 $this->render404Page($e);
16187 } catch (UnauthorizedActionException $e) {
17188 list($controller, $action) = $this->login_action;
18189 $this->runAction($controller, $action);
19190 }
20191
21 ...
Session.php
PHP
1 ...
243 public function get($name, $default = null)
344 {
445 if (isset($_SESSION[$name])) {
546 return $_SESSION[$name];
647 }
748
849 return $default; /* $default true に変更 */
950 }
10 ...
11101 public function isAuthenticated()
12102 {
13103* return $this->get('_authenticated', false); /* ブレークポイント */
14104 }
15 ...
DbRepository.php
PHP
1 ...
239 public function execute($sql, $params = array())
340 {
441* $stmt = $this->con->prepare($sql); /* ブレークポイント $this->con false に変更 */
542 $stmt->execute($params);
643
744 return $stmt;
845 }
9 ...
【コードを調べる】
「DB への接続 のスタートである」"new PDO" を検索 検索ツール(Devas)
ファイル | メソッド |
---|
DbManager.php | public function connect($name, $params) |
"connect(" を検索 検索ツール(Devas)
ファイル | メソッド |
---|
MiniBlogApplication.php | protected function configure() |
DbManager.php | public function connect($name, $params) 同上 |
"configure(" を検索 検索ツール(Devas)
ファイル | メソッド |
---|
MiniBlogApplication.php | protected function configure() 同上 |
Application.php | public function __construct($debug = false) |
Application.php | protected function configure() |
DbManager.php
PHP
1 ...
220 public function connect($name, $params)
321 {
422 $params = array_merge(array(
523 'dsn' => null,
624 'user' => '',
725 'password' => '',
826 'options' => array(),
927 ), $params);
1028
1129 $con = new PDO( /* "new PDO" を検索 */
1230 $params['dsn'],
1331 $params['user'],
1432 $params['password'],
1533 $params['options']
1634 );
1735
1836 $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
1937
2038 $this->connections[$name] = $con;
2139 }
22 ...
MiniBlogApplication.php
PHP
1 ...
237 protected function configure()
338 {
439 $this->db_manager->connect('master', array(
540 'dsn' => 'mysql:dbname=mini_blog;host=localhost;charset=utf8',
641 'user' => 'root',
742 'password' => '',
843 ));
944 }
10 ...
Application.php
PHP
1 ...
221 public function __construct($debug = false)
322 {
423 $this->setDebugMode($debug);
524 $this->initialize();
625 $this->configure();
726 }
8 ...
960 protected function configure()
1061 {
1162 }
12 ...
上記 3ファイル の メソッド を調べる
3ファイルのうち、orangefarmer さんから コード提示されているのは、
MiniBlogApplication.php のみ
MiniBlogApplication.php にエラーが無い場合
DbManager.php と Application.php のコード提示をしてもらう予定
...
(MiniBlogApplication.php にエラーがあったので、コードの提示は必要無くなった)
【修正箇所が分かる & NetBeans IDE デバッグ機能】
差分ツール (WinMerge) で
MiniBlogApplication.php (サンプルコード) と
MiniBlogApplication.php (orangefarmer さん) を
比較する
画像 MiniBlogApplication.phpの比較 (クリックすると、拡大表示します)
正 protected function configure()
誤 protected function cofigure()
今回のエラーを解決しても、別の不具合が出ます
- ホームページのデータ件数 ゼロ
- エラー ログ #2 StatusRepository->fetchAllPersonalArchivesByUserId(NULL)
- ログイン機能のデバッグ (or 実装)
- 写経 未完成 (ルーティング registerRoutes 参照) 画像 MiniBlogApplication.phpの比較 ↑
すべての写経のエラーを解決しても、フレームワークの内部とオブジェクト指向は理解できません
「NetBeans IDE デバッグ機能」 使って「フレームワークの内部」と「オブジェクト指向」を理解しましょう (ダウンロードした サンプルコード 使用)
NetBeans IDE デバッグ機能 には、2通りの使い方があります
コードの理解のための NetBeans IDE デバッグ機能 は、バグを見つけるためではなく
サンプルコード の「処理の流れ」と「変数の値」を調べるために 使います
どんなツールも初めは大変ですが、すぐに慣れます
特に、初心者の方 には効果が大きいです
デバッグ例
詳細は、参考サイトのリンク をご覧ください
【エラーの理由】
子クラスのメソッド名 (cofigure) が親クラスのメソッド名 (configure) と違うために
オーバライドができず、データベースへの接続設定 が未定義 のためです。
class MiniBlogApplication extends Application
← extends (継承)
{
... 省略
}
MiniBlogApplication の cofigure メソッド
protected function cofigure()
← オーバライドできない (configure でないため)
{
↓ 以下 データベースへの接続設定
$this->db_manager->connect('master', array(
'dsn' => 'mysql:dbname=mini_blog;host=localhost;charset=utf8',
'user' => 'root',
'password' => '',
));
}
Application の 空 の configure メソッド
エラーが無ければ MiniBlogApplication の データベースへの接続設定 が Application に反映されます
protected function configure()
← configure
{
}
Application のコンストラクタ
public function __construct($debug = false)
{
$this->setDebugMode($debug);
$this->initialize();
$this->configure();
← 空 のメソッドのまま configure (データベースへの接続設定 が 未定義)
}
上記エラーで、フレームワークとオブジェクト指向の「考え方」が良く分かります