質問: ### 前提・実現したいこと ここに質問の内容を詳しく書いてください。 (例)PHPで掲示板を作っています。 データベースへの接続処理を、別ファイルから関数で呼び出そうとしたら以下のエラーメッセージが発生しました。 関数を使わずに全て同じファイルに書いた場合は正常に動作しました。 ### 発生している問題・エラーメッセージ ``` Notice: Undefined variable: db in /opt/lampp/htdocs/keijiban1.copy/model.php on line 14 Fatal error: Uncaught Error: Call to a member function prepare() on null in /opt/lampp/htdocs/keijiban1.copy/model.php:14 Stack trace: #0 /opt/lampp/htdocs/keijiban1.copy/comment.php(20): outputdb() #1 {main} thrown in /opt/lampp/htdocs/keijiban1.copy/model.php on line 14 ``` ### 該当のソースコード ``` try{ $db=new PDO('mysql:dbname=keijiban1;host=127.0.0.1;charset=utf8','root',''); function inputdb(){ //コメントをデータベースに登録 $statement=$db->prepare('INSERT INTO comments SET comment=?, created_at=NOW()'); $statement->execute(array($_POST['comment'])); } function outputdb(){ //コメントをデータベースから取り出し $comments=$db->prepare('SELECT * FROM comments ORDER BY id DESC LIMIT ?,5'); $comments->bindParam(1,$start,PDO::PARAM_INT); $comments->execute(); } }catch(PDOException $e){ echo 'DB接続エラー:'.$e->getMessage(); } ``` ### 試したこと try{}の中に書かれているデータベース登録、取出しの処理をtry{}catch{}の下に書いてみた。 データベース登録、取り出しの処理を元のファイルの関数呼び出しの部分に書いていた時は正常に動作していた。 ### 補足情報(FW/ツールのバージョンなど) 元のファイルでの関数の呼び出しは、 inputdb(); と outputdb(); で書いています。
回答: これらの関数は、グローバル変数である`$db`を参照しているので、関数内の先頭に`global $db;`と書く必要があります。 また、`try`はスコープを作らないので、関数宣言は`try`の外に出しても大丈夫だと思います。