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

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

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

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

PHP

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

Q&A

解決済

6回答

7582閲覧

db_connect()について

space_sss

総合スコア81

PDO

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

PHP

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

0グッド

4クリップ

投稿2017/01/09 23:21

よくデータベースに接続する際に
db_connect();
った関数を作るのをよく目にします。
これはなぜわざわざ関数にして使用するのでしょうか?
複数のデータベースに接続することを目的にしているのでしょうか?それともまた別の意味があるのでしょうか?
ご解答宜しくお願いいたします。

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

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

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

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

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

guest

回答6

0

ちょっと使用状況が分かりませんが、一般的なプログラミングを考えると、多分見通しの良さを求めていると考えられます。

プログラミングのコツに、分かりやすいコードを書くことがあげられますが、その一つが見通しの良さです。

コードの本筋を見決めやすくするため、機能を最小単位に分割し、それを関数等で実装、必要な箇所で呼び出すことで、本筋を見失わず、必要な機能を実行させます。
そうすると、本筋はわかりやすく、また最小単位に分割することで、デバッグもしやすくなります。

また、今後、作っていくシステムが大きくなると、db_connect() といったデータベース接続のための関数を自分で作る機会は減ります。
これは、フレームワークで実装したり、ライブラリとして、プログラムの本筋から分離/分割されるからです。
この時点で、見通しの良さに加えて、再利用性も向上します。

多分、参考にされているコードは、一番に見通しの良さ、二番に再利用を視野に入れたそういったコードになっているんだと思います。

投稿2017/01/10 00:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

space_sss

2017/01/12 05:37

ご解答ありがとうございます。 ただ疑問だったのがよくdb_connect()で関数を作りそのファイルを冒頭でrequireして表示させている例をよく見たのでそもそもがそれだけをrequireするのであればそもそも関数にする必要性がないのでは?と思ってしまいまして今回のような質問をさせていただきました。 よく見るPDOを使っての接続の説明をされているところでは必ずのように出てきてその関数を作りdb.phpなどのファイルにその関数だけをいれて話を進めていきそのことに関しては一切触れていないことが個人的にかなりの謎だったんですよね。
退会済みユーザー

退会済みユーザー

2017/01/12 05:47

別のファイルにするというのは、関数化とは別の観点からも見る必要があります。 例えば、接続情報をgitで管理したくない場合は、接続情報を別ファイルとしてそれを管理から外すといったことをします。 まぁ、関数化と同じく見通しや再利用の為に別ファイルにするケースも多々あるので、全く違う観点という話でもないですが。。。
space_sss

2017/01/12 06:43

ご解答ありがとうございます! おそらく自分の質問の仕方に問題があり理解しにくくお手数をかけてしまいました。 お忙しいところ手間を取らせていただき申し訳ありませんでした!
退会済みユーザー

退会済みユーザー

2017/01/12 07:07

関数化の最大のメリットを提示してませんでしたね^^;はずかしいw Kosuke_Shibuya さんの指摘通りスコープのメリットの割合が大きいと思います。
guest

0

ベストアンサー

ただ疑問だったのがよくdb_connect()で関数を作りそのファイルを冒頭でrequireして表示させている例をよく見たのでそもそもがそれだけをrequireするのであればそもそも関数にする必要性がないのでは?

require の機能というより、関数にすることによるメリットがわからないということのようですね。

関数化によるメリットは、変数のスコープを理解していなければなりません。

php

1<?php 2 3// グローバル空間に定義した変数 4$var = '';

このようにグローバル空間に定義した変数は、ファイルが読み込まれていれば、どこからでもアクセスできます。またどこからでも変数に代入することができるので、値を書き換えることができます。

このことは、require されたファイルに定義された変数であっても同じです。
以下の例。

php

1<?php 2/** 3 * index.php 4 */ 5require 'required_file.php'; 6 7$var = 'a';

php

1<?php 2/** 3 * required_file.php 4 */ 5$var = array(1, 2, 3);

この例で、PHPにおいては、なんのエラーもなく実行可能です。index.php のファイルを見る限り、$var に対し、新たに変数を定義したつもりであっても、required_file.php で何か重要な働きがあるはずの、$var に対しなんのチェックもなく、値を書き換えてしまうことが可能です。このことは、思いも寄らないバグを引き起こしてしまうリスクを伴います。

規模の大きなシステムにおいては、require されるファイルも多くなり、require されたファイルの先でまた require されるということもあり得ます。そうなると、とても把握しきれるものではありません。

そこで、function を利用することにより、この意図せず 変数を書き換えてしまうというバグを防ぐことができるようになります。

php

1<?php 2 3require 'required_file.php'; 4 5$var = 'a'; // ここで定義した $var は func() 内の $var に影響を与えない。 6var_dump($var); 7 8var_dump(func());

php

1<?php 2/** 3 * required_file.php 4 */ 5function func(){ 6 $var = array(1, 2, 3); 7 return $var; 8}

投稿2017/01/12 06:28

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

space_sss

2017/01/12 06:40

納得しました。 いつもご解答ありがとうございます。 書き換えを防止するために関数にして返り値で値を受け取るといった意味があったんですね。 ものすごくすっきりしました!!! ありがとうございます!!
退会済みユーザー

退会済みユーザー

2017/01/12 06:49

このことは、関数の働きの極一面でしかありません。じゃあ、関数でいけば安全なのかというとそれでは不足だから、Class の概念もあるわけです。規模が大きくなって、その必要性は身にしみて体で覚えることになるでしょうが、本来の目的は、他の回答者の言うように、「同じコードを繰り返し書きたくない」と同時に、「安全(バグを作りたくない)に楽をしたい」というプログラマの要求によって生み出された機能と言えます。
guest

0

データベースへの接続を関数化するのは、開発する人により色々な意味を持っている
と思うので、一つの例として回答します。
データベースサーバのIPアドレスや接続するユーザ名、パスワードが変更された
場合、db_connect()関数だけを修正すれば済みます。
接続情報が外部ファイルに設定されている場合でも、その読込方法等を変更したい
場合も関数以外の部分に影響ないように考えての関数化だと思います。

DBの変更が予定されていない場合でも、汎用化や将来性を考えて関数化するのでは
ないでしょうか。

投稿2017/01/10 00:38

Take-y

総合スコア91

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

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

0

DB接続に限らず、関数化する目的はたいてい「コード整理、見通しのよさ」と「再利用性のアップ」だと思います。
(※もっと言えばその目的でクラスがありますが、とりあえず今はクラスは無視します)

関数としてまとめておけば、繰り返し同じことを書かなくていいし、もしその処理部分を変更しようと思ったら一箇所修正するだけで済みます。

たとえば一つのサイトで一つのPHPファイルしか使わないなら、関数化の恩恵は少ないでしょう。
でも複数のファイルがあって、それぞれがDBに接続するとしたら? いちいち全ファイルにDB接続の処理コードを書くのは無駄だし、修正時に全ファイルを修正するのも手間です。
そういうときにdb_connect()という関数をつくり、別ファイル(function.phpとか)にしておけば、必要なときにrequireやincludeなどして「共通部品」として使えるようになります。

投稿2017/01/10 01:46

zico_teratail

総合スコア907

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

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

space_sss

2017/01/12 05:37

ご解答ありがとうございます。 ただ疑問だったのがよくdb_connect()で関数を作りそのファイルを冒頭でrequireして表示させている例をよく見たのでそもそもがそれだけをrequireするのであればそもそも関数にする必要性がないのでは?と思ってしまいまして今回のような質問をさせていただきました。 よく見るPDOを使っての接続の説明をされているところでは必ずのように出てきてその関数を作りdb.phpなどのファイルにその関数だけをいれて話を進めていきそのことに関しては一切触れていないことが個人的にかなりの謎だったんですよね。
zico_teratail

2017/01/12 05:59

>そもそも関数にする必要性がない いや、だからその必要性について説明したつもりだったんですが、 うーん、どうも理解されていないようですね・・・これ以上どうやって説明したらいいだろうか・・・ PDOの場合も同じです。db.phpとして接続に関する処理を別ファイルにしておけば、使い回しが簡単でしょう?
space_sss

2017/01/12 06:36

知識不足で大変申し訳ありません。 >>PDOの場合も同じです。db.phpとして接続に関する処理を別ファイルにしておけば、使い回しが簡単でしょう? はい。その際requireで接続するだけでいいと思っていまして例えばなのですが db.php内容 <?php function db_connect(){ データベース情報 return $dbh;//返り値 } ?> test.php <?php require_once("inc/db/db.php"); $dbh=db_connect(); SQL文 表示 ?> とあるのと <?php $dbh=データベース情報 ?> test.php <?php require_once("inc/db/db.php"); SQL文 表示 ?> の違いがわからないんですよね 的外れなことをいていたら申し訳ありません
zico_teratail

2017/01/12 06:49

もしかしたらハンドラーの概念を理解されていないために話が通じないのかもしれません。 「php データベース ハンドラ」でググってみると良いかも。 Kosuke_Shibuyaさんがお書きになったように、関数化しておけば、意図せずハンドラを書き換えてしまう心配もなくなります。
guest

0

例えば定期的にDBのパスワードを変更しなければならない場合、
PHPの各ファイルにDBのパスワードや接続先を書いていたりすると、全てのファイルを書き直さなければならなくなります。
このように、繰り返し使う同じ処理は1回しか書かないようにし、メンテナンスを容易にするのが鉄則です。

投稿2017/01/12 05:55

namimon

総合スコア726

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

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

space_sss

2017/01/12 06:25

ご解答ありがとうございます。 その場合わざわざ関数を使わずにしてもデータベース情報をひとつのファイルにしそれをrequireして表示するのだけでよいような気がするのですが関数を使う便利性がいまいちピンとこないんですよね
guest

0

http://dolem.jp/?m=builtin_function
そういう関数があるから?

投稿2017/01/10 00:04

編集2017/01/10 00:07
toutou

総合スコア2050

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

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

退会済みユーザー

退会済みユーザー

2017/01/10 00:43

DOLEM というリンク先のフレームワークでは関数として実装しているようですが、質問者はわざわざ関数にして使用と書いているので、この回答は的外れかと。 DOLEM になぜ db_connect() が用意されたのか記載していただければ回答としては面白いかとと思います。
space_sss

2017/01/12 05:40

DOLEMといったものではフレームワークで関数があるんですね。 ただ今回の質問に関してはそちらのことは一切関係のないことでした。 わざわざご解答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問