yabublogyabublogホームプログラミングPHP【PDO】PHPでデータベースに接続する方法【SELECT編】2019/08/13SHAREツイートシェアはてブLINEPocketこの記事では、《PHPでデータベースに接続する方法》について、ITエンジニアの僕が学習した内容をまとめています。PDOって何なの?PHPでデータベースにどうやって接続するの?データベースに登録したユーザーを検索する機能を実装したいこういった疑問に答えます。※本記事は、自分で学習したことのまとめ用として書いています。PHPの解説で誤った点があれば、スローして頂ければ喜んでキャッチしますのでお願い致します。現在、PHPでデータベースに接続する際は、『PDO』を使う方法が主流です。そこで、PDOの基本的な使い方を解説していきます。Objects』の略で、ざっくり言うと...PHPからデータベースへいい感じにアクセスしてくれるものって感じです。通常データベースサーバーへのアクセスは、以下のようなデータベース固有のドライバがしようされます。Serveretc...ですが、PDOを使用することにより、接続するデータベースにかかわらず、同じ操作でデータにアクセスすることが可能になります。イメージ図ですが、PDOはこんな感じの仕事をしているかと思います。Objects)』を一言で説明すると...PHPからデータベースへいい感じにアクセスしてくれるものと説明しましたが、PDO以外にもdbxなど、データベースに抽象的にアクセスしてくれるものがいくつかあります。使うデータベース抽象化レイヤによって、対応しているデータベースの種類や処理速度などが異なります。PDO以外にも興味がある方はググってみてください。PDOを使ってPHPでデータベースに接続する方法【ユーザー検索】PDOを使ってデータベースに接続しユーザー検索するのは、下記の手順で行います。PDOクラスをインスタンス化プリペアドステートメントを準備する値をバインドするプリペアドステートメントを実行するSELECTの結果を取得するそれでは、ひとつずつ見ていきましょう。Step1:PDOクラスをインスタンス化PDOクラスをインスタンス化して、データベースに接続します。PDO('DSN''ユーザーネーム'パスワード''オプション'</span>);上記の通り、インスタンス化するときに引数に必要な情報を記述することで、データベースに接続できます。※データベースに接続する際は、例外処理を記述する必要がありますが、現時点ではデータベースへ接続する箇所だけ見ていきます。コンストラクタには、以下のような引数を指定します。※必須データベースに接続するために必要な情報です。MySQLの場合は以下のような書き方をします。PDO('mysql:host=サーバー名;dbname=DB名;charset=文字エンコード','ユーザー名','パスワード','オプション');</span>●mysql:hostホスト名またはIPアドレスを指定します。ローカル環境で動かす場合は、省略しても問題ない場合が多いです。自分自身のIPアドレスを指します。●dbnameデータベース名を指定します。ようにSQL文で選択する場合は、省略することができます。●charset文字セットを指定します。するのは避けて、ここで指定するべきです。UTF-8ではなくutf8であることに注意してください。ハイフンは入りません。ユーザー名ユーザー名を指定します。パスワードパスワードを指定します。ルート権限を使う場合は、デフォルトで空白にします。オプション接続時のオプションを連想配列で渡します。キーはあらかじめ用意されている定数を取ります。値はあらかじめ用意されている定数以外に、論理値・文字列などの一般的な値も取り得ます。オプションの内容については次で触れますので、詳しい解説はスルーします。インスタンス化するときにオプションを設定する方法データベースに接続するコードを思い出してください。PDO('mysql:host=サーバー名;dbname=DB名;charset=文字エンコード','ユーザー名','パスワード','オプション');</span>PDOクラスをインスタンス化するときにオプションを記述することが可能です。PDOを使う上で、例外を投げるかどうかなど様々な機能があり、その機能を使うか使わないかをオプションで設定します。オプションは連想配列で指定します。(わからない方はググってください。)下記のような記述になります。PDO::FETCH_ASSOC]</span>);また、よく使われるオプションについては、以下の通りです。PDO::ATTR_ERRMODEPDO::ATTR_DEFAULT_FETCH_MODEひとつずつ簡単に解説していきます。オプション1:PDO::ATTR_ERRMODESQL実行でエラーが起こった際にどう処理するかを指定します。設定すると例外をスローしてくれます。基本的にこれを選択しておきます。SQLで発生したエラーをPHPのWarningとして報告します。メソッドで引数が省略された場合や、ステートメントがforeach文に直接かけられた場合のフェッチスタイルを設定します。PDO::FETCH_BOTHカラム番号とカラム名の両方をキーとする連想配列で取得する。PDO::FETCH_NUMカラム番号をキーとする配列で取得する。PDO::FETCH_ASSOCカラム名をキーとする連想配列で取得する。これが一番ポピュラーな設定です。PDO::FETCH_OBJカラム名をプロパティとする基本オブジェクトで取得する。Step2:プリペアドステートメントを準備するユーザー入力を受け取ってSQL文を動的に生成する場合は、プリペアドステートメントとプレースホルダを使わなければなりません.プレースホルダ直訳すると「場所取り」。何かユーザ入力を当てはめる場所としてあらかじめ確保しておくもの。プリペアドステートメント直訳すると「予約文」。通常「予約文」は「場所取り」を使うために作られる。実行するだけで十分なためである。プレースホルダには2種類あり、疑問符プレースホルダを使う方法と、名前付きプレースホルダを使う方法があります。parametersが発生するので、どちらか一方のみを選択してください。ここでは『名前付きプレースホルダ』についてのみ解説します。『疑問符プレースホルダ』についても知りたい方は個人的にググってみてください。名前付きプレースホルダ:を頭につけ、半角英数字とアンダースコアにて構成するバインド時の頭の:は省略することが出来るPDOクラスのprepareメソッドを使い、SQL文を実行する準備を行います。prepareメソッドの返り値としてPDOStatementのインスタンスを受け取ります。prepareメソッドを使うとPDOStatementをインスタンス化し、作成したインスタンスを返します。そのため、作成されたインスタンスを変数(下記の記述では$stmt)に代入します。$pdo-&gt;prepare($sql);</span>Step3:値をバインドする値をバインドするには、PDOStatement::bindValueまたはPDOStatement::bindParamを使います。ここでは、bindValueを使って値をバインドします。bindValueメソッドを使うときは、下記のように記述します。class="err">)</span>第1引数にはパラメータIDを指定します。パラメータID、は名前付きプレースホルダの場合は『:名前』となります。疑問符プレースホルダの場合は、『1からはじまる値』になります。第2引数にはバインドする値を指定します。値は直接入力するか、変数を入れて指定します。第3引数にはデータ型を指定します。データ型は、PDO::PARAM_からはじまる定義済み定数を指定します。主な定義済み定数は下記になります。NULL型デフォルトでは、PDO::PARAM_STRが指定されており、省略すると(何も指定しないと)デフォルト値になります。ここで注意すべきは、第3引数に指定したデータ型に必ず変換される訳ではないという点です。具体例を出して解説すると、例えば下記の記述したとします。いう文字列を代入しています。bindValueの第3引数でPDO::PARAM_INTと整数型を指定していますが、結果的に文字列として処理されてしまいます。整数型に型変換したいのであればキャストする必要があります。文字列以外の型を指定するときは、第2引数に型を明示するのが無難で、下記のように記述します。class="p">);</span></span>第2引数に(int)と記述し、型キャストをしています。実際に名前付きプレースホルダを用いた場合を見ていきましょう。PDO::PARAMS_STR);</span>また、値をバインドするのにbindValueメソッド以外にbindParamメソッドがあります。このメソッドは、第2引数に変数のみしか指定できず、変数を参照としてバインドするため少しややこしいので、使わなくてOKです。基本的にはbindValueメソッドを使いましょう。(bindParamメソッドはここでは紹介しません。気になる方はググってください。)Step4:プリペアドステートメントを実行するプリペアドステートメントを実行するには、PDOStatement::executeメソッドを使います。$stmt-&gt;execute();</span>Step5:SELECTの結果を取得するデータを取得するには、下記のような方法があります。fetchメソッドでデータを取得するfetchAllメソッドでデータを取得する1:fetchメソッドでデータを取得するfetchメソッドは該当するデータを1件のみ配列として返します。該当するデータがない場合はfalseを返します。ループ処理をすることで該当する全てのデータを取得することもできます。fetchメソッドを使って取得したデータを変数$resultに代入します。class="small">}</span>2:fetchAllメソッドでデータを取得するfetchAllメソッドは、該当する全てのデータを配列として返します。fetchメソッドを使って取得したデータを変数$resultに代入します。class="small">}</span>基本コーディングそして、まとめると、下記が書き方のテンプレになります。$prepare-&gt;fetch();</span>まとめPDOについて基礎の基礎は理解できたかと思います。今回はPDOでデータベースに接続する方法の解説なので、例外処理などについては触れていません。深く、より正確に理解するために下記の記事も読んでください。PHPオブジェクト指向入門(前半)また...POSTなどでユーザーから値を受け取るときは、入力された値を必ずチェックする必要があります。下記の記事も読んでおきましょう。$_POSTなどを受け取る際の処理そもそも、GETやPOSTを理解していない方は、下記を読んでください。-【PHP超入門】HTTP(GET・POST)についてそして、下記にPHP関連の記事をまとめていますので、初心者の方はぜひご覧ください。コメントをキャンセルメールアドレスが公開されることはありません。*サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。