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

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

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

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

5回答

1525閲覧

pdoを外部ファイル化して使ってみたい。

watta_00

総合スコア16

MySQL

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

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2019/12/09 06:32

編集2019/12/09 06:35

php

1<?php 2define('DB_HOST', 'localhost'); 3define('DB_NAME', 'test_01'); 4define('DB_USER', 'root'); 5define('DB_PASSWORD', 'root'); 6 7// 文字化け対策 8$options = array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET CHARACTER SET 'utf8'"); 9 10// PHPのエラーを表示するように設定 11error_reporting(E_ALL & ~E_NOTICE); 12 13// データベースの接続 14try { 15 $dbh = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASSWORD, $options); 16 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 17} catch (PDOException $e) { 18 echo $e->getMessage(); 19 exit; 20} 21 22$sql="SELECT * FROM mondai"; 23$stmt= $dbh->prepare($sql); 24$stmt->execute(); 25 26while(1){ 27 $result = $stmt->fetch(PDO::FETCH_ASSOC); 28 if($result==false){ 29 break; 30 } 31 print '<div class="card card-body"><a href="1_1.php">'.$result[top].'</a></div>'; 32} 33?>

まずはDBの接続を関数で呼び出せるようにしたいと考え、このように変更しました。
しかし、上のコードで表示されていたものが表示されなくなり、つまずいてしまいました。

php

1<?php 2define('DB_HOST', 'localhost'); 3define('DB_NAME', 'test_01'); 4define('DB_USER', 'root'); 5define('DB_PASSWORD', 'root'); 6 7// 文字化け対策 8$options = array(PDO::MYSQL_ATTR_INIT_COMMAND=>"SET CHARACTER SET 'utf8'"); 9 10// PHPのエラーを表示するように設定 11error_reporting(E_ALL & ~E_NOTICE); 12 13// データベースの接続 14function db() { 15 try { 16 $dbh = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASSWORD, $options); 17 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 18 } catch (PDOException $e) { 19 echo $e->getMessage(); 20 exit; 21 } 22 return $dbh 23} 24$hoge=$this->db(); 25$sql="SELECT * FROM mondai"; 26$stmt= $hoge->prepare($sql); 27$stmt->execute(); 28 29while(1){ 30 $result = $stmt->fetch(PDO::FETCH_ASSOC); 31 if($result==false){ 32 break; 33 } 34 print '<div class="card card-body"><a href="1_1.php">'.$result[top].'</a></div>'; 35} 36?>

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

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

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

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

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

guest

回答5

0

ベストアンサー

単純に、;がないからsyntax errorが出てるんじゃないでしょうか?

php

1// return $dbh 23 return $dbh;

以下のようにエラーを表示するようにしておきましょう。

php

1<?php 2ini_set('display_errors', 1); 3ini_set('error_reporting', E_ALL);

投稿2019/12/09 07:23

編集2019/12/09 07:30
Y.H.

総合スコア7914

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

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

watta_00

2019/12/09 07:33

試してみましたが、return $dbh;にしても動作は変わらずでした・・・。
Y.H.

2019/12/09 07:34

で、以下2行を追加してどういうエラーメッセージが表示されましたか? ini_set('display_errors', 1); ini_set('error_reporting', E_ALL);
watta_00

2019/12/09 07:39

はい、 Fatal error : Uncaught Error: Call to a member function prepare() on null in /Applications/MAMP/htdocs/demo/test/mondai_test.php:28 Stack trace: #0 /Applications/MAMP/htdocs/demo/test/1.php(69): include() #1 {main} thrown in /Applications/MAMP/htdocs/demo/test/mondai_test.php on line 28 というエラーが表示されています。
Y.H.

2019/12/09 07:43

その情報が非常に重要なので質問を編集し追記ください
watta_00

2019/12/09 07:44

エラーをみたところ、$dbhがnullだったということがエラーコードの内容でした。 $hoge=db(); $sql="SELECT * FROM mondai"; $stmt= $hoge->prepare($sql); $stmt->execute(); このように書くことで解決することができました。 PHPを勉強中で <?php ini_set('display_errors', 1); ini_set('error_reporting', E_ALL); これを書くことによりエラーが記載されることを知らなかったため、勉強になりました。 ありがとうございます。
guest

0

外部化するならクラスにしてください
表示部分はコンストラクタとは別メソッドにしたほうが使い勝手はよいでしょう

投稿2019/12/09 07:14

編集2019/12/09 07:15
yambejp

総合スコア114747

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

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

watta_00

2019/12/09 07:34

クラスにしなければ、この書き方では動作しないということでしょうか?
yambejp

2019/12/09 07:46

動作しないと言うよりはまともな運用ができないと思います
guest

0

クラスにしてないなら$this不要です。

投稿2019/12/09 06:37

m.ts10806

総合スコア80842

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

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

watta_00

2019/12/09 06:42

回答ありがとうございます。 $thisをなくし $hoge=db();としましたが、改善されませんでした。
m.ts10806

2019/12/09 07:19 編集

「うまくいきません」と同じで、結果が何も伝わりません。そこからなにが起きたか具体的に教えてもらわないと次の試行錯誤になりません。 質問者さんと完全に同じ環境で動作確認している人はいませんので、一発で通ると思ってアドバイスはしていませんよ。
watta_00

2019/12/09 07:51

アドバイスありがとうございます。 今後は気をつけたいと思います。
m.ts10806

2019/12/09 07:56

質問に追記してもらえれば良いのですけど
guest

0

ini_set('display_errors', 1);
ini_set('error_reporting', E_ALL);
をコードに追記し、エラーを確認したところ、

php

1Fatal error 2: Uncaught Error: Call to a member function prepare() on null in /Applications/MAMP/htdocs/demo/test/mondai_test.php:28 Stack trace: #0 /Applications/MAMP/htdocs/demo/test/1.php(69): include() #1 {main} thrown in 3/Applications/MAMP/htdocs/demo/test/mondai_test.php 4on line 528

このようなエラーが出ました。
以下のコード部分を変更することにより解決することができました。

php

1$hoge=$this->db(); 2$sql="SELECT * FROM mondai"; 3$stmt= $dbh->prepare($sql); 4$stmt->execute();

php

1$hoge=->db(); 2$sql="SELECT * FROM mondai"; 3$stmt= $hoge->prepare($sql); 4$stmt->execute();

投稿2019/12/09 07:48

watta_00

総合スコア16

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

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

m.ts10806

2019/12/09 07:57

$hoge=->db(); いや↑これ動かないですよね。
guest

0

PHP

1function db(){ 2}

の中で、

PHP

1$options

が利用できているかどうか?

投稿2019/12/09 07:45

Take_it

総合スコア357

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問