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

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

ただいまの
回答率

90.86%

  • PHP

    18185questions

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

  • PDO

    305questions

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

db_connect()について

解決済

回答 6

投稿

  • 評価
  • クリップ 3
  • VIEW 942

space_sss

score 58

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

+6

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/12 14:37

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

    キャンセル

  • 2017/01/12 14:47

    別のファイルにするというのは、関数化とは別の観点からも見る必要があります。

    例えば、接続情報をgitで管理したくない場合は、接続情報を別ファイルとしてそれを管理から外すといったことをします。

    まぁ、関数化と同じく見通しや再利用の為に別ファイルにするケースも多々あるので、全く違う観点という話でもないですが。。。

    キャンセル

  • 2017/01/12 15:43

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

    キャンセル

  • 2017/01/12 16:07

    関数化の最大のメリットを提示してませんでしたね^^;はずかしいw

    Kosuke_Shibuya さんの指摘通りスコープのメリットの割合が大きいと思います。

    キャンセル

checkベストアンサー

+5

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

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

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

<?php

// グローバル空間に定義した変数
$var = '';

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

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

<?php
/**
 * index.php
 */
require 'required_file.php';

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

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

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

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

<?php

require 'required_file.php';

$var = 'a'; // ここで定義した $var は func() 内の $var に影響を与えない。
var_dump($var);

var_dump(func());
<?php
/**
 * required_file.php
 */
function func(){
    $var = array(1, 2, 3);
    return $var;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/12 15:40

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

    キャンセル

  • 2017/01/12 15:49

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

    キャンセル

+3

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/12 14:37

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

    キャンセル

  • 2017/01/12 14:59

    >そもそも関数にする必要性がない

    いや、だからその必要性について説明したつもりだったんですが、
    うーん、どうも理解されていないようですね・・・これ以上どうやって説明したらいいだろうか・・・

    PDOの場合も同じです。db.phpとして接続に関する処理を別ファイルにしておけば、使い回しが簡単でしょう?

    キャンセル

  • 2017/01/12 15: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文
    表示
    ?>
    の違いがわからないんですよね
    的外れなことをいていたら申し訳ありません

    キャンセル

  • 2017/01/12 15:49

    もしかしたらハンドラーの概念を理解されていないために話が通じないのかもしれません。
    「php データベース ハンドラ」でググってみると良いかも。

    Kosuke_Shibuyaさんがお書きになったように、関数化しておけば、意図せずハンドラを書き換えてしまう心配もなくなります。

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/12 15:25

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

    キャンセル

-4

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/10 09:43

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

    キャンセル

  • 2017/01/12 14:40

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

    キャンセル

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

  • ただいまの回答率 90.86%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    18185questions

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

  • PDO

    305questions

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