🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

Q&A

解決済

1回答

1309閲覧

DB接続文字列の関数化について

noizi.

総合スコア27

PHP

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

0グッド

0クリップ

投稿2021/03/05 08:34

編集2021/03/05 12:53

前提・実現したいこと

PHPでDBに接続する命令は分かるのですが、その接続する命令を関数化して関数のみのファイルにまとめる(共通処理)にはどのようなコードを書くといいんでしょうか?

単にfunction{}で接続文字列を囲むといいのでしょうか?

しかし、仮に囲んだとして、どのようにしたら中身の命令を実行できるのでしょうか?

追記

require_once()で下記のプログラムに接続したいのですが、エラーが出てきます。
dbhは書かない方がよかったのでしょうか?
一応このような形で追記しておきますことをご了承ください。
自分で何とかしてみます。
よろしくお願いします。

functions.php

<?php function db(){ $dsn = 'mysql:dbname=example;host=localhost'; $user = 'root'; $password = 'shapshap'; $dbh = new PDO($dsn, $user, $password); return $dbh; } ?>

エラー

Warning: Undefined variable $dbh in C:\xampp\htdocs\customer\c_search.php on line 26 Fatal error: Uncaught Error: Call to a member function query() on null in C:\xampp\htdocs\customer\c_search.php:26 Stack trace: #0 {main} thrown in C:\xampp\htdocs\customer\c_search.php on line 26

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

maisumakun

2021/03/05 08:38

今のコードと、どのようにしたいかを書いていただけないでしょうか?
m.ts10806

2021/03/05 08:45

もっと「関数とは」という根本的なところから理解が必要では。 得られたアドバイスを理解できない懸念があります。PHPマニュアル確認してください。
m.ts10806

2021/03/05 08:48 編集

ただ、接続文字列自体を関数に入れ込むメリットはかなり薄いかと。定数で済みます。
m.ts10806

2021/03/05 09:58

質問者さんのような状態だと、文章にしたときの語句と実態があっていないことは往々にしてあります。 用語が正しく使えてないとかそういう意味ですね。 ただし、回答者は言葉の通り取ります。文章で使われた言葉本来の意味のままとります。 そして文章に違和感を覚えることはよくあるのですが、結局質問者が何を表現したいかまでは正確にくみ取ることはできません。 なので、コードが必要です。もしくは絵や参考にした記事が必要です。 つらつらと覚束ない文章を書かれるよりも、コードや絵をドーンと提示して、どこのことをどう表現しているのかを説明してもらった方が助かるのです。 日常会話でもコミュニケーションにおいて、ちょっとした認識のズレが大きな誤解を生み、あらぬ方向にいくことはよくあります。 プログラムは書いたとおりにしか動かないので、その傾向がより顕著です。 エスパーして回答することも時にはありますがそれは「回答者の思い込み」でしかなく、 技術や経験が近いわけではないことのほうが多いこのQAサイトにおいてはお互いのすれ違いを生むことのほうが多いのです。 自己解釈をしなくていいように配慮することができれば解決も早く、 自身の理解にも繋がります。 回答者はあくまでプログラミングをより正しく理解しているだけの赤の他人でしかないので、 投げとけばどうにかなるわけではないのです。 赤の他人を過信しないようにしてください。書いたとおりにしか伝わりません。 そのための「質問するときのヒント」であり「推奨していない質問」含めた「ヘルプ」ページです。 よく、考えてみてください。自身の質問はどこまで伝わるように書けているか。
guest

回答1

0

ベストアンサー

webページやwebサイトとして成り立たせるためには、
php上で様々なデータ処理をして、
出力用にデータ加工して出力しないといけないですよね。
その処理の流れをやる順番通りに長々と書いているのが現状なのだとお察しします。

あれもやって、これもやって、こっちもやって・・。
思いついたら思いついた順序にこなす。

ちょっと待って下さい。
ひとくくりになる処理や、何度もやる処理などあるのではないでしょうか。

構造化プログラミング - Wikipedia
構造化プログラミングとは - IT用語辞典 e-Words
っていう概念があります。
プログラムの「段階的な抽象化」(step-wise abstraction)と
抽象的なデータ構造(abstract data structures)と
これに関連付けられた抽象的な構文(abstract statements)の「共同詳細化」(joint refinement)がキモなのですが、
用語だらけではわかりづらいですね。

ページの処理の中で、データベースを操作する場面が何度も出てきます。
順序を組み替えても差し支えない箇所は組み替えてしまい、
前段でデータベースを操作する箇所をなるべくまとめ、
後段でHTML出力する箇所にまとめる、
という構造に見直しができるはずです。
(出力用に最終的に加工するのは、データベースから直接でなく、変数や配列から取り出すなどするとか。)
PHPはHTMLから離脱してサーバー上でコードを実行できるのですが、
だからといってHTMLの中に頻繁にPHPコードが出現してしまうと読みづらくて
処理の流れもわかりにくくなってしまいがちで、
大変なことになります。なってますよね。

その上で、
じゃぁデータベースを操作する箇所がこのページだけではなく、
他のページでも同じようにデータベースに接続して、クエリー実行しているよな、
共通化したいよな、っていうふうに考えたら、
手っ取り早く関数化してしまうという考え方になるでしょうね。

表を出力しよう、っていう場面で
いきなりデータベース接続するコードや、データベース出力ように加工するコードがまぜこぜにならないよう、
まずはさっきもあげた
前段でデータベースを操作する箇所をなるべくまとめ、
後段でHTML出力する箇所にまとめる、
っていうのを工夫してみてください。

それができるようになってから、
データベース処理を共通関数化して別のphpファイルに追い出す、
というところに踏み出したらいいと思います。

ほしい答えになっていないかもしれませんが、
感じた違和感を少しでも分かっていただけたらと思い、
こういう内容になりましたので、ご容赦ください。

投稿2021/03/05 09:17

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

m.ts10806

2021/03/05 11:12

>感じた違和感を少しでも分かっていただけたらと思い、 ここにすごく同意+
noizi.

2021/03/05 12:36

回答ありがとうございます。 とりあえず回答を読ませていただきました。 どうも私はいきなり難しいことをやっているなと感じました。 もっと言うと「段階」を無視してるなと。。。 なのでもう一度いろんなことを確認していきたいと思います。 ありがとうございました。 回答は今後大事にしていきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問