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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

Q&A

解決済

2回答

1094閲覧

関数を別のファイルにまとめたら元ファイルで関数を呼び出しても実行できません。

imawork

総合スコア6

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

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

0グッド

0クリップ

投稿2020/07/16 10:54

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)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

該当のソースコード

php

1 2try{ 3 $db=new PDO('mysql:dbname=keijiban1;host=127.0.0.1;charset=utf8','root',''); 4 5 function inputdb(){ 6 //コメントをデータベースに登録 7 $statement=$db->prepare('INSERT INTO comments SET comment=?, created_at=NOW()'); 8 $statement->execute(array($_POST['comment'])); 9 } 10 11 function outputdb(){ 12 //コメントをデータベースから取り出し 13 $comments=$db->prepare('SELECT * FROM comments ORDER BY id DESC LIMIT ?,5'); 14 $comments->bindParam(1,$start,PDO::PARAM_INT); 15 $comments->execute(); 16 } 17}catch(PDOException $e){ 18 echo 'DB接続エラー:'.$e->getMessage(); 19}

試したこと

try{}の中に書かれているデータベース登録、取出しの処理をtry{}catch{}の下に書いてみた。
データベース登録、取り出しの処理を元のファイルの関数呼び出しの部分に書いていた時は正常に動作していた。

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

元のファイルでの関数の呼び出しは、
inputdb();

outputdb();
で書いています。

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

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

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

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

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

guest

回答2

0

素直に

php

1inputdb($db); 2//とか 3outputdb($db);

みたいな感じにする方がなにかと分かりやすい気がします。

投稿2020/07/16 12:31

takasima20

総合スコア7464

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

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

0

ベストアンサー

これらの関数は、グローバル変数である$dbを参照しているので、関数内の先頭にglobal $db;と書く必要があります。

また、tryはスコープを作らないので、関数宣言はtryの外に出しても大丈夫だと思います。

投稿2020/07/16 11:14

編集2020/07/16 11:14
magf

総合スコア212

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

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

imawork

2020/07/16 12:29

回答ありがとうございます。 global $db; を関数の先頭に入力したら下記のエラーに変わりました。 dbについてのエラーは解決されたと思うのですが、、、 関数宣言はtryの外に出しました。 Notice: Undefined variable: comments in /opt/lampp/htdocs/keijiban1.copy/comment.php on line 24 Fatal error: Uncaught Error: Call to a member function fetch() on null in /opt/lampp/htdocs/keijiban1.copy/comment.php:24 Stack trace: #0 {main} thrown in /opt/lampp/htdocs/keijiban1.copy/comment.php on line 24
magf

2020/07/16 15:49

`$comment->fetch`メソッドが呼び出せていないというエラーなので、`$comment`について何か似たようなことが起きているのではないでしょうか 詳細な回答はcomment.phpの該当部分のソースがないと難しいです
magf

2020/07/16 15:53 編集

おそらくoutputdp関数の先頭にglobal $comments;と書くととりあえず解決するのではないでしょうか
imawork

2020/07/17 04:22

ありがとうございます。 global $comments;と書いたらエラー表示がなくなりました! データベースにも無事登録されています。 しかし、データベースからの取り出しができず、記事が表示されません。 以下がcomment.phpです。 <?php require('model.php'); require('template.html'); if(isset($_POST['comment'])){ print('投稿しました<br>'); inputdb(); }else{ } if(isset($_REQUEST['page']) && is_numeric($_REQUEST['page'])){ $page=$_REQUEST['page']; }else{ $page=1; } $start=5*($page-1); outputdb(); //コメント、時間を繰り返し表示 while($comment=$comments->fetch()){ print('<p>'); print($comment['comment']); print('</p>'); print('<time>'); print($comment['created_at']); print('</time>'); print('<hr>'); } ////2ページ目以降なら前のページを表示する(1ページ目は表示しない) if($page>=2){ print('<a href="comment.php?page='.($page-1).'">前へ</a >'); } //最終ページは表示コメント数/5の繰り上げで表示 $counts=$db->query('SELECT COUNT(*) AS cnt FROM comments'); $count=$counts->fetch(); $max_page=ceil($count['cnt']/5); //現在のページ<最終ページなら次ページを表示する if($page<$max_page){ print('<a href="comment.php?page='.($page+1).'">次へ</a>'); } ?>
imawork

2020/07/17 13:15

outputdp関数の先頭にglobal $db、global $comments、global $startを追加したら全て解決しました!!スコープの内容についても知ることができたのですごく勉強になりました。ありがとうございました!!
imawork

2020/07/24 11:42

ちなみに、globalを使わないためのアイデアもありましたら教えて頂きたいです。
imawork

2020/07/28 06:29

たびたびありがとうございます。クラスの勉強を進めていきたいと思います。助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問