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

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

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

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

Q&A

解決済

4回答

6255閲覧

パーフェクトPHP ミニブログ作成でのエラーについて

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2019/08/10 09:23

編集2019/08/10 11:38

前提・実現したいこと

パーフェクトPHPのミニブログの写経をしています。
下記のエラーが発生しており、自分でもなんども該当の部分を見比べてみたのですが、解決できません。
よろしくお願いします。

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

Fatal error: Uncaught Error: Call to a member function prepare() on bool in C:\xampp\htdocs\php-blog.localhost\core\DbRepository.php:19 Stack trace: #0 C:\xampp\htdocs\php-blog.localhost\core\DbRepository.php(32): DbRepository->execute('select a., u.u...', Array) #1 C:\xampp\htdocs\php-blog.localhost\models\StatusRepository.php(22): DbRepository->fetchAll('select a., u.u...', Array) #2 C:\xampp\htdocs\php-blog.localhost\controllers\StatusController.php(8): StatusRepository->fetchAllPersonalArchivesByUserId(NULL) #3 C:\xampp\htdocs\php-blog.localhost\core\Controller.php(41): StatusController->indexAction(Array) #4 C:\xampp\htdocs\php-blog.localhost\core\Application.php(123): Controller->run('index', Array) #5 C:\xampp\htdocs\php-blog.localhost\core\Application.php(103): Application->runAction('status', 'index', Array) #6 C:\xampp\htdocs\php-blog.localhost\web\index_dev.php(7): Application->run() #7 {main} thrown in C:\xampp\htdocs\php-blog.localhost\core\DbRepository.php on line 19

該当のソースコード

DbRepository.php

php

1<?php 2 3abstract class DbRepository 4{ 5 protected $con; 6 7 public function __construct($con) 8 { 9 $this->setConnection($con); 10 } 11 12 public function setConnection($con) 13 { 14 $this->con = $con; 15 } 16 17 public function execute($sql, $params = array()) 18 { 19 $stmt = $this->con->prepare($sql); //19行目です 20 $stmt->execute($params); 21 22 return $stmt; 23 } 24 25 public function fetch($sql, $params = array()) 26 { 27 return $this->execute($sql, $params)->fetch(PDO::FETCH_ASSOC); 28 } 29 30 public function fetchAll($sql, $params = array()) 31 { 32 return $this->execute($sql, $params)->fetchAll(PDO::FETCH_ASSOC); 33 } 34} 35

UserRepository.php

php

1<?php 2 3class UserRepository extends DbRepository 4{ 5 public function insert($user_name, $password) 6 { 7 $password = $this->hashPassword($password); 8 $now = new DateTime(); 9 10 $sql = "insert into user(user_name, password, created_at) values(:user_name, :password, :created_at)"; 11 $stmt = $this->execute($sql, array( 12 ':user_name' => $user_name, 13 ':password' => $password, 14 ':created_at' => $now->format('Y-m-d H:i:s'), 15 )); 16 } 17 18 public function hashPassword($password) 19 { 20 return sha1($password . 'SecretKey'); 21 } 22 23 public function fetchByUserName($user_name) 24 { 25 $sql = "select * from user where user_name = :user_name"; 26 27 return $this->fetch($sql, array(':user_name' => $user_name)); 28 } 29 30 public function isUniqueUserName($user_name) 31 { 32 $sql = "select count(id) as count from user where user_name = :user_name"; 33 34 $row = $this->fetch($sql, array(':user_name' => $user_name)); 35 if($row['count'] === '0'){ 36 return true; 37 } 38 39 return false; 40 } 41} 42

StatusRepository.php

<?php class StatusRepository extends DbRepository { public function insert($user_id, $body) { $now = new DateTime(); $sql = "insert into status(user_id, body, created_at) values(:user_id, :body, :created_at)"; $stmt = $this->execute($sql, array( ':user_id' => $user_id, ':body' => $body, ':created_at' => $now->format('Y-m-d H:i:s'), )); } public function fetchAllPersonalArchivesByUserId($user_id) { $sql = "select a.*, u.user_name from status a left join user u on a.user_id = u.id where u.id = :user_id order by a.created_at desc"; return $this->fetchAll($sql, array(':user_id' => $user_id)); } }

試したこと

本に書かれている通りのコードを写経しています。

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

php 7.3.8
Xampp v.3.2.4

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

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

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

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

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

m.ts10806

2019/08/10 10:22 編集

DbRepositoryを継承しているクラスとクラスを呼び出しているコードをご提示ください。 また、PHP7.3ではパーフェクトPHPが前提としているバージョンと大きく違います(書籍の発行は版によりますが5年以上前では) せめてPHP7対応の書籍を利用されたほうが良いですし、PHPマニュアルは必ず活用してください。
退会済みユーザー

退会済みユーザー

2019/08/10 11:40

UserRepositoryとStatusRepositoryのコードを追加させていただきました。 確かにこの本は古い本といえば、古い本なので今のバージョンとの食い違いなどがあるかもしれません。 今回は知り合いにPHPの勉強におすすめということでお勧めされ、やってみた次第です。
guest

回答4

0

ベストアンサー

###『回答』『参考サイトの紹介』『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内容次のアクション
Application184*$controller("status"), $action("index")続行 (F5)
Session103*isAuthenticated ログインチェックステップ・イン (F7) 2回
Session49$default true に変更 (上記 仕様)続行 (F5)
DbRepository41*$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.phppublic function connect($name, $params)

 
"connect(" を検索 検索ツール(Devas)

ファイルメソッド
MiniBlogApplication.phpprotected function configure()
DbManager.phppublic function connect($name, $params) 同上

 
"configure(" を検索 検索ツール(Devas)

ファイルメソッド
MiniBlogApplication.phpprotected function configure() 同上
Application.phppublic function __construct($debug = false)
Application.phpprotected 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の比較
画像 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 Applicationextends (継承)
{
... 省略
}

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 (データベースへの接続設定 が 未定義)
}

上記エラーで、フレームワークとオブジェクト指向の「考え方」が良く分かります

投稿2019/08/15 02:55

編集2019/11/15 01:35
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/08/16 06:18

コードのミスが原因だということがわかってよかったです。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2019/08/22 03:08

なんども詳しい説明ありがとうございます。 勉強方法はやはり写経ではよくないんですかね?
kyoya0819

2019/08/22 03:09

回答者さん。 複数行にまたがるコードの場合、 ```言語名 ここにコード ``` の文法での記述をお願いします。
退会済みユーザー

退会済みユーザー

2019/08/28 00:50 編集

【写経について】 「処理の流れ」と「変数の値」が分かるかどうかが、「写経をする」判断基準です。 サンプルコードは、コードが短いのに、内容が難しいので 「処理の流れ」と「変数の値」を知ることはできません。 「写経」には向いてません。 【NetBeans IDE デバッグ機能 について】 環境設定手順 http://beginner001.html.xdomain.jp/debug-03.html#Environment_setting から、始めてみてはどうでしょうか? 動作確認がふたつありますが、動作確認 (IDE デバッグ機能) をためしてみると、 「写経の無意味さ」が分かります。 【その他】 ・PHP 5.3.3 (本 P2) 以降であれば、バージョンは問題ありません   ・XAMPP or MAMP は、「Xdebug」の入っているものを使用してください  外部から持ってくると、新たな問題が起きます  XAMPP: 7.x.x 以前 (5.6.x) 同梱済  MAMP : 最新版 同梱済 ・MySQL の操作は、phpMyAdmin (GUI) を使用してください  (XAMPP or MAMP に同梱済)
退会済みユーザー

退会済みユーザー

2019/08/22 15:17

ありがとうございます!
退会済みユーザー

退会済みユーザー

2019/09/27 06:27 編集

『コード入力 Markdown記法 ```』 について (asuchi0819 さん コメント 2019/08/22 12:09 ↑) 【エラーの理由】以外では、 ``` を使っているのに、 なぜ、【エラーの理由】の中では ``` を使わないのか? 1. Markdown記法 ``` では、「折りたたむ」が初期値です 2. Markdown記法 ``` 内は、「太字」が使えません 3. ``` 内のコードは、興味ある人しか見ません 4. 目立たせたい 【エラーの理由】は、回答の 結論部分 にあたるもので、 読み飛ばされないことを意識しました。 さらに、「太字」の部分は 重要なところで、 特に、cofigure と configure は 太字でないと見落としがちです。
退会済みユーザー

退会済みユーザー

2020/01/13 00:33

デバッグ時の操作は、少しづつ慣れていけば良いと思います。 「何か面倒だな」と思った時は、楽な方法を探してください。 効率が変わります。
urlAddChange

2020/04/19 06:54 編集

--- url変更 --- パーフェクトPHP デバッグ (処理の流れ (1/5) | ユーザ登録機能作成) 全5パターン https://perfectphp-debug.netlify.com/debug-02-1.html パーフェクトPHP デバッグ (チェックポイント) https://perfectphp-debug.netlify.com/debug-01.html パーフェクトPHP デバッグ (その他) 環境設定等 https://perfectphp-debug.netlify.com/debug-03.html パーフェクトPHP デバッグ (NetBeans デバッグ方法) https://perfectphp-debug.netlify.com/debug-04.html
urlAddChange

2021/04/03 06:39 編集

--- url追加 --- 【動画 (YouTube)】 パーフェクトPHP をデバッグしました (デバッグ例 基本編) オートロード https://youtu.be/F-QJCXH2Xm0 パーフェクトPHP をデバッグしました (デバッグ例 応用編) CSRF対策 https://youtu.be/htohdTY26D0 パーフェクトPHP をデバッグしました (デバッグ例 応用編) アウトプットバッファリング https://youtu.be/U58DL8_iAvI パーフェクトPHP をデバッグしました (デバッグ例 応用編) DbManagerクラス https://youtu.be/najYeNBB1xM
guest

0

写経したとのことですが、正誤表で該当箇所に間違いはないですか?
http://gihyo.jp/book/2010/978-4-7741-4437-5/support#supportApology

あとソースコードも配布されているようなので少し見てみましたが、MiniBlogApplication.phpにmysqlの接続設定が書かれていますが、環境に合わせてありますか?

投稿2019/08/10 13:15

nullbot

総合スコア910

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

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

退会済みユーザー

退会済みユーザー

2019/08/12 13:33

回答ありがとうございます。すでにその正誤表を確認しましたし、僕が所有しております版は修正済みの版なので間違いがある可能性は少ないと思います。 なのでどちらかというと、僕の表示ミスか、接続の設定がうまくいっていないのでしょうか? ちなみに僕が作っているPhpBlogApplication.phpに記述している設定はこのようになっています。 ``` <?php class PhpBlogApplication extends Application { protected $login_action = array('account', 'signin'); public function getRootDir() { return dirname(__FILE__); } protected function registerRoutes() { return array( '/' => array('controller' => 'status', 'action' => 'index'), '/status/post' => array('controller' => 'status', 'action' => 'post'), '/account' => array('controller' => 'account', 'action' => 'index'), '/account/:action' => array('controller' => 'account'), ); } protected function cofigure() { $this->db_manager->connect('master',array( 'dsn' => 'mysql:dbname=php-blog;host=localhost', 'user' => 'root', 'password' => '', )); } } ```
退会済みユーザー

退会済みユーザー

2019/08/13 01:08

作成しています。ちゃんとshow databases;であることを確認しました。
nullbot

2019/08/13 02:09

xamppのPHP7.3.8のをインストールして、DB、テーブルを作成してミニブログのコードを試しみましたが動きました。気になったのはダウンロードしたコードだとDB名はmini_blogとして扱っていましたが、提示されたコードではphp-blogとなっています。本の版数の違いでしょうか?
退会済みユーザー

退会済みユーザー

2019/08/13 02:13

いえ、単に自分がそう書いているだけです。わかりづらいことをしてしまいもうしわけないです。 本で言うmini_blogと書かれている部分はphp-blogに変更して自分のほうでも動くようにはしているつもりですが、直しておいたほうがよろしいですかね?
nullbot

2019/08/13 02:23

作成したDB名を指定していれば問題ありませんが、一旦mini_blogで作り直して見ては?
nullbot

2019/08/13 02:31

apacheのerror.logとMysqlのlogを提示していただけますか?
退会済みユーザー

退会済みユーザー

2019/08/13 03:00

apacheのほうは同じエラー内容でした。 ``` [Tue Aug 13 11:44:27.936521 2019] [php7:error] [pid 16124:tid 1908] [client ::1:50107] PHP Fatal error: Uncaught Error: Call to a member function prepare() on bool in C:\xampp\htdocs\mini-blog.localhost\core\DbRepository.php:19\nStack trace:\n#0 C:\xampp\htdocs\mini-blog.localhost\core\DbRepository.php(32): DbRepository->execute('select a.*, u.u...', Array)\n#1 C:\xampp\htdocs\mini-blog.localhost\models\StatusRepository.php(22): DbRepository->fetchAll('select a.*, u.u...', Array)\n#2 C:\xampp\htdocs\mini-blog.localhost\controllers\StatusController.php(8): StatusRepository->fetchAllPersonalArchivesByUserId(NULL)\n#3 C:\xampp\htdocs\mini-blog.localhost\core\Controller.php(41): StatusController->indexAction(Array)\n#4 C:\xampp\htdocs\mini-blog.localhost\core\Application.php(123): Controller->run('index', Array)\n#5 C:\xampp\htdocs\mini-blog.localhost\core\Application.php(103): Application->runAction('status', 'index', Array)\n#6 C:\xampp\htdocs\mini-blog.localhost\web\index_dev.php(7): Application->run()\n#7 {main}\n thrown in C:\xampp\htdocs\mini-blog.localhost\core\DbRepository.php on line 19 ``` Mysqlのログというのはどういうものか調べてもよくわからず、今は提示できません。
退会済みユーザー

退会済みユーザー

2019/08/13 03:03

ちなみにmini_blogというデータベースで作り直しても同じようなエラーが出てくるので結局意味変わりはありませんでした。
退会済みユーザー

退会済みユーザー

2019/08/13 03:29

すみませんが、どうやってもうまくいかないので諦めて読むだけにしようと思います。これまで書いたコードが水の泡になってしまうのですが、読むだけでもいいかなと思うのでそうしようと思った次第です。 ここまで対応してくださったということもあり、こちらをBAとさせていただきクローズしたいと思います。
退会済みユーザー

退会済みユーザー

2019/08/31 00:47 編集

nullbot さんのコメントを無駄にしたくないので、コメントしましたが、 同様な内容を回答しましたので、削除しました。
退会済みユーザー

退会済みユーザー

2019/08/16 06:18

どうやら自分のコードが間違っていたみたいです。perfectPHPさんの回答をBAにさせていただきました。
guest

0

質問からは少し離れますが、こういうの読むと良いですよ。
PHP7 で堅牢なコードを書く - 例外処理、表明プログラミング、契約による設計 / PHP Conference 2016

php

public function __construct($con)

この辺とかナントカしたくなると思います。

投稿2019/08/10 12:19

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/08/12 13:35

回答ありがとうございます。 基本は本を写経しているだけなので、詳しいことがよくわからず引用されてらっしゃるエントリについても難しくて理解しがたいものでした。
退会済みユーザー

退会済みユーザー

2019/12/28 01:30

質問から、かなり離れています。 エラーは、解決しません。 何が目的ですか?
退会済みユーザー

退会済みユーザー

2019/12/28 02:44

フレームワークなら Error を正しく検出する前提を整えるといいって提案だけど?
guest

0

$this->con が bool型で
boolにはprepareなんてメソッドないですよ

って感じのエラーです。書いてあるままですが。
conが何か不明ですが、雰囲気的にDBの接続に失敗してるんじゃないですかね

投稿2019/08/10 09:35

mikkame

総合スコア5036

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

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

退会済みユーザー

退会済みユーザー

2019/08/10 11:08

> conが何か不明ですが うそつけぇ。connectionの略だって事くらい、おらでも分かんぞ。 DBへの参照がコンストラクタで渡される事になってるみてぇだが、 接続失敗して返ってきたfalseを検査しねぇで渡してんだろ。
mikkame

2019/08/10 11:29

おめぇすげーな!ソースコードからも気さぐれんのか!
退会済みユーザー

退会済みユーザー

2019/08/10 11:42

回答ありがとうございます。 多分接続に失敗しているのではないかなとは思っているのですが、解決策がうまく見つからず困っておりました。 実行環境の追記を上げております。 よろしくお願いいたします。
mikkame

2019/08/10 13:06 編集

とりあえずXXXRepository系のコードの提示は不要です こやつらをインスタンス化する時に与えるコスントラクタの引数がfalseなので そこをチェックするべきでは?
退会済みユーザー

退会済みユーザー

2019/08/10 11:51 編集

おす! UserRepository も StatusRepository も、抽象クラスのDbRepositoryを継承してんだろ? だから、UserRepository か StatusRepository のどっちかを new してインスタンス作ってるんだろ? どっかで。 その時に、DBに接続しようとしたハンドラを new UserRepository($hdl); みてぇにして渡してるハズだぞ。 その $hdl が接続に失敗して false が返ってるんだろ、きっと。 何も渡さねぇでいたから null が入ってます、ってぇエラーじゃねぇからな。
退会済みユーザー

退会済みユーザー

2019/08/10 11:54

このあたりかな? C:\xampp\htdocs\php-blog.localhost\controllers\StatusController.php(8)
退会済みユーザー

退会済みユーザー

2019/08/12 13:43

回答ありがとうございます。おっしゃっておられて個所を見てみても本と変わっておらず、依然としてエラーは出たままになっていしまいます。
mikkame

2019/08/12 13:47

うーん、十中八九dbに繋げてないだけかと思うんですが 他の所でdbにアクセスには成功しているんでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問