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

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

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

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

PHP

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

Q&A

解決済

2回答

984閲覧

phpでデータベースからの情報取得を関数化

kakedashi_php

総合スコア6

MySQL

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

PHP

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

0グッド

0クリップ

投稿2021/01/14 14:17

編集2021/01/15 06:37

前提・実現したいこと

phpとmySQLでデータベースに接続し、情報の取得・更新を行えるシステムを作っています。

情報を取得する際のコードを関数にして共通化したいと思いチャレンジしてみたのですが、
エラーコードが出てしまいます。

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

Fatal error: Uncaught Error: Call to a member function prepare() on null in C:\xampp\htdocs\www***\post.php:6 Stack trace: #0 C:\xampp\htdocs\www***\post.php(23): getCode() #1 {main} thrown in C:\xampp\htdocs\www***\post.php on line 6

該当のソースコード

function getCode() { $stmt = $dbh->prepare(' SELECT `id`, `code`, `value` FROM `code_area` WHERE `del` = 0 '); $stmt->execute(); $result = $stmt->fetchAll(); return $result; } getCode(); var_dump($result);

試したこと

関数にせず直接このように記載したら取得できます。

$stmt = $dbh->prepare(' SELECT `id`, `code`, `value` FROM `code_area` WHERE `del` = 0 '); $stmt->execute(); $result = $stmt->fetchAll(); var_dump($result);

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

XAMPP

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

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

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

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

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

m.ts10806

2021/01/14 19:19

>補足情報 ここには挨拶ではなく()にある通りバージョンや環境情報を記載します。 基本、要件を書くことに終始すべきで挨拶はむしろノイズにさえなり得ます。 「読まなくても問題解決できる部分」だからです。 「分かりづらい」と自ら書くのではなく、納得いくまで推敲されたら良いかなと。 質問は何度でも編集できます。
kakedashi_php

2021/01/15 06:38

ご指摘ありがとうございます。 以後質問の際気を付けたいと思います。
m.ts10806

2021/01/15 06:44

解決後なので「次から」でいいですが、 「XAMPP」はバージョン1つではないですし、 時間がたてば今ご自身が使っているものが今は最新でもそのうち最新ではなくなります。 バージョンをきちんと書きましょう。 OS,PHPのバージョン、DBの種類・バージョン
guest

回答2

0

ベストアンサー

変数のスコープに関する理解が足りていない様に見受けられますので、まずは参照先のサンプルコードをよく読む&実際に試して把握されることを強くお勧めします。

その後に
関数の引数
についても同様に学習してください。


Fatal error: Uncaught Error: Call to a member function prepare() on null in C:\xampp\htdocs\www*\post.php:6 Stack trace: #0 C:\xampp\htdocs\www*\post.php(23): getCode() #1 {main} thrown in C:\xampp\htdocs\www***\post.php on line 6

このエラーは、何もないところからprepare()を使おうとしているけどそれはアウト というエラーです。
具体的には

PHP

1function getCode() { 2$stmt = $dbh->prepare(' 3SELECT 4id, 5code, 6value 7FROM 8code_area 9WHERE 10del = 0 11'); 12

で、存在しない$dbhを使おうとしています。
引数で$dbhを渡すなどして$dbhを用意する必要があります。

前後のコードが無いので勘になりますが

PHP

1 2function getCode($dbh) { 3$stmt = $dbh->prepare(' 4SELECT 5id, 6code, 7value 8FROM 9code_area 10WHERE 11del = 0 12'); 13 14$stmt->execute(); 15$result = $stmt->fetchAll(); 16 17return $result; 18} 19 20$result = getCode($dbh); 21 22var_dump($result); 23

と言う感じにすれば想定している挙動をすると思います。
(修正部分の解説を全てするのは無理なので、まずは前述のリンクのサンプルを理解してみてから修正箇所を把握してみてください。)

投稿2021/01/14 14:29

tanat

総合スコア18727

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

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

kakedashi_php

2021/01/15 06:21

ご回答ありがとうございます。 変数・関数に関しての基本的な知識がありませんでした。 大変勉強になりました。 頂いたご指摘で関数ができました。 本当にありがとうございます。
guest

0

直接の回答は既に出ているので、今後に向けた提案をアドバイスとして置いておきます。

情報を取得する際のコードを関数にして共通化したいと思い

でしたら、一部ではなく「DB接続に関する一連の流れ」を全て関数化・・・
というより、クラス化したほうが良いように思います。

例えばコンストラクタで接続確立して、各メソッドで登録、参照、更新、削除を行う(各英語の頭文字を取り”CRUD”と言います)
テーブルが複数あるのでしたら継承なりなりで共通部分は親側に任せてテーブル個別の処理を書く、とか(もしくはテーブル名とカラム名の宣言だけとか)。
続けていったらフレームワークっぽいものが出来上がります。

関数化はその1歩目と思います。考え方は「役割分担」
「まとめられそうかな」と思ったら切り出すのは良い傾向と思います。

投稿2021/01/14 19:19

m.ts10806

総合スコア80875

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

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

kakedashi_php

2021/01/15 06:32

ご回答いただきありがとうございます。 クラス化に関しても知識がありませんでした。 目指しているところはご提案頂いている内容のものになります。 勉強して挑戦してみようと思います。 ありがとうございます。
m.ts10806

2021/01/15 06:33

既存のフレームワークのコードを読んでみるのが一番勉強になると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問