【PDO】PHPでデータベースに接続する方法【SELECT編】

php

この記事では、《PHPでデータベースに接続する方法について、ITエンジニアの僕が学習した内容をまとめています。
  • PDOって何なの?
  • PHPでデータベースにどうやって接続するの?
  • データベースに登録したユーザーを検索する機能を実装したい

こういった疑問に答えます。
※本記事は、自分で学習したことのまとめ用として書いています。
尚、PHPの解説で誤った点があれば、スローして頂ければ喜んでキャッチしますのでお願い致します。

PDOの基礎

PDOの基礎
現在、PHPでデータベースに接続する際は、『PDO』を使う方法が主流です。そこで、PDOの基本的な使い方を解説していきます。

概要:PDOとは?

『PDO』とは『PHP Data Objects』の略で、ざっくり言うと…
PHPからデータベースへいい感じにアクセスしてくれるもの
って感じです。
通常データベースサーバーへのアクセスは、以下のようなデータベース固有のドライバがしようされます。

  • MySQL
  • PostgreSQL
  • SQLite
  • Oracle
  • MS SQL Server

etc…

ですが、PDOを使用することにより、接続するデータベースにかかわらず、同じ操作でデータにアクセスすることが可能になります。
PDOの基礎
ざっくりのイメージ図ですが、PDOはこんな感じの仕事をしているかと思います。

MEMO
冒頭で『PDO(PHP Data Objects)』を一言で説明すると…
PHPからデータベースへいい感じにアクセスしてくれるもの
と説明しましたが、PDO以外にもdbxなど、データベースに抽象的にアクセスしてくれるものがいくつかあります。
使うデータベース抽象化レイヤによって、対応しているデータベースの種類や処理速度などが異なります。なので、PDO以外にも興味がある方はググってみてください。

PDOを使ってPHPでデータベースに接続する方法【ユーザー検索】

PDOを使ってPHPでデータベースに接続する方法【ユーザー登録】
PDOを使ってデータベースに接続しユーザー検索するのは、下記の手順で行います。

  1. PDOクラスをインスタンス化
  2. プリペアドステートメントを準備する
  3. 値をバインドする
  4. プリペアドステートメントを実行する
  5. SELECTの結果を取得する

それでは、ひとつずつ見ていきましょう。

Step①:PDOクラスをインスタンス化

PDOクラスをインスタンス化して、データベースに接続します。

PHP

上記の通り、インスタンス化するときに引数に必要な情報を記述することで、データベースに接続できます。
※データベースに接続する際は、例外処理を記述する必要がありますが、現時点ではデータベースへ接続する箇所だけ見ていきます。
また、コンストラクタには、以下のような引数を指定します。

  • DSN (Data Source Name) ※必須
  • ユーザー名
  • パスワード
  • オプション

DSN (Data Source Name) ※必須

データベースに接続するために必要な情報です。
以下に各データベース製品に応じたDSNの書き方が掲載されています.
≫ PHP Manual – PDOクラスのデータベース別DSN一覧
例えば、MySQLの場合は以下のような書き方をします。

PHP

●mysql:host
ホスト名またはIPアドレスを指定します。ローカル環境で動かす場合は、省略しても問題ない場合が多いです。localhostは、自分自身のホスト名、127.0.0.1 は自分自身のIPアドレスを指します。
●dbname
データベース名を指定します。基本的には必須ですが、データベースを後で USE test のようにSQL文で選択する場合は、省略することができます。
●charset
文字セットを指定します。SET NAMES とするのは避けて、ここで指定するべきです。UTF-8ではなくutf8であることに注意してください。ハイフンは入りません。

ユーザー名

ユーザー名を指定します。ルート権限を使う場合は、デフォルトで root です。

パスワード

パスワードを指定します。ルート権限を使う場合は、デフォルトで空白にします。

オプション

接続時のオプションを連想配列で渡します。キーはあらかじめ用意されている定数を取ります。値はあらかじめ用意されている定数以外に、論理値・文字列などの一般的な値も取り得ます。
なお、オプションの内容については次で触れますので、詳しい解説はスルーします。

インスタンス化するときにオプションを設定する方法

データベースに接続するコードを思い出してください。

PHP

PDOクラスをインスタンス化するときにオプションを記述することが可能です。
PDOを使う上で、例外を投げるかどうかなど様々な機能があり、その機能を使うか使わないかをオプションで設定します。
オプションは連想配列で指定します。(わからない方はググってください。)
下記のような記述になります。
PHP

また、よく使われるオプションについては、以下の通りです。

  1. PDO::ATTR_ERRMODE
  2. PDO::ATTR_DEFAULT_FETCH_MODE

ひとつずつ簡単に解説していきます。

オプション①:PDO::ATTR_ERRMODE

SQL実行でエラーが起こった際にどう処理するかを指定します。
なお、デフォルトでは “PDO::ERRMODE_SILENT” と設定されています。

  • PDO::ERRMODE_EXCEPTION を設定すると例外をスローしてくれます。基本的にこれを選択しておきます。
  • PDO::ERRMODE_WARNING はSQLで発生したエラーをPHPのWarningとして報告します。
  • PDO::ERRMODE_SILENT は何も報告しません。

オプション②:PDO::ATTR_DEFAULT_FETCH_MODE

PDOStatement::fetch メソッドや PDOStatement::fetchAll メソッドで引数が省略された場合や、ステートメントがforeach文に直接かけられた場合のフェッチスタイルを設定します。
なお、デフォルトでは “PDO::FETCH_BOTH” と設定されています。

  • PDO::FETCH_BOTH
    カラム番号とカラム名の両方をキーとする連想配列で取得する。
  • PDO::FETCH_NUM
    カラム番号をキーとする配列で取得する。
  • PDO::FETCH_ASSOC
    カラム名をキーとする連想配列で取得する。なお、これが一番ポピュラーな設定です。
  • PDO::FETCH_OBJ
    カラム名をプロパティとする基本オブジェクトで取得する。

Step②:プリペアドステートメントを準備する

ユーザー入力を受け取ってSQL文を動的に生成する場合は、プリペアドステートメントプレースホルダを使わなければなりません.

  • プレースホルダ
    直訳すると「場所取り」。何かユーザ入力を当てはめる場所としてあらかじめ確保しておくもの。
  • プリペアドステートメント
    直訳すると「予約文」。文を予約したもの。通常「予約文」は「場所取り」を使うために作られる。もし「場所取り」が無ければ普通に PDO::query などで実行するだけで十分なためである。

プレースホルダには2種類あり、疑問符プレースホルダを使う方法と、名前付きプレースホルダを使う方法があります。
仮にこれらが混ざってしまうと…

PHP

が発生するので、どちらか一方のみを選択してください。
尚、ここでは『名前付きプレースホルダ』についてのみ解説します。『疑問符プレースホルダ』についても知りたい方は個人的にググってみてください。

名前付きプレースホルダ

  • :を頭につけ、半角英数字とアンダースコアにて構成する
  • バインド時の頭の:は省略することが出来る

PDOクラスのprepareメソッドを使い、SQL文を実行する準備を行います。
prepareメソッドの返り値としてPDOStatementのインスタンスを受け取ります。
prepareメソッドを使うとPDOStatementをインスタンス化し、作成したインスタンスを返します。
そのため、作成されたインスタンスを変数(下記の記述では$stmt)に代入します。

PHP

Step③:値をバインドする

値をバインドするには、PDOStatement::bindValueまたはPDOStatement::bindParamを使います。ここでは、bindValueを使って値をバインドします。
bindValueメソッドを使うときは、下記のように記述します。

PHP

第1引数にはパラメータIDを指定します。
パラメータID、は名前付きプレースホルダの場合は『:名前』となります。また、疑問符プレースホルダの場合は、『1からはじまる値』になります。
第2引数にはバインドする値を指定します。値は直接入力するか、変数を入れて指定します。
第3引数にはデータ型を指定します。
データ型は、PDO::PARAM_からはじまる定義済み定数を指定します。主な定義済み定数は下記になります。

  • PDO::PARAM_STR(デフォルト)⇨ 文字列型
  • PDO::PARAM_INT ⇨ 整数型
  • PDO::PARAM_BOOL ⇨ 真偽型
  • PDO::PARAM_NULL ⇨ NULL型

デフォルトでは、PDO::PARAM_STRが指定されており、省略すると(何も指定しないと)デフォルト値になります。
また、ここで注意すべきは、第3引数に指定したデータ型に必ず変換される訳ではないという点です。
具体例を出して解説すると、例えば下記の記述したとします。

PHP

$priceには ‘100’ という文字列を代入しています。
bindValueの第3引数でPDO::PARAM_INTと整数型を指定していますが、結果的に文字列として処理されてしまいます。
なので、整数型に型変換したいのであればキャストする必要があります。
文字列以外の型を指定するときは、第2引数に型を明示するのが無難で、下記のように記述します。
PHP

第2引数に(int)と記述し、型キャストをしています。
実際に名前付きプレースホルダを用いた場合を見ていきましょう。
PHP

また、値をバインドするのにbindValueメソッド以外にbindParamメソッドがあります。
このメソッドは、第2引数に変数のみしか指定できず、変数を参照としてバインドするため少しややこしいので、使わなくてOKです。
なので、基本的にはbindValueメソッドを使いましょう。
(bindParamメソッドはここでは紹介しません。なので、気になる方はググってください。)

Step④:プリペアドステートメントを実行する

プリペアドステートメントを実行するには、PDOStatement::executeメソッドを使います。

PHP

Step⑤:SELECTの結果を取得する

データを取得するには、下記のような方法があります。

  1. fetchメソッドでデータを取得する
  2. fetchAllメソッドでデータを取得する

①:fetchメソッドでデータを取得する

fetchメソッドは該当するデータを1件のみ配列として返します。そして、該当するデータがない場合はfalseを返します。
また、ループ処理をすることで該当する全てのデータを取得することもできます。
fetchメソッドを使って取得したデータを変数$resultに代入します。

PHP

②:fetchAllメソッドでデータを取得する

fetchAllメソッドは、該当する全てのデータを配列として返します。
fetchメソッドを使って取得したデータを変数$resultに代入します。

PHP

基本コーディング

そして、まとめると、下記が書き方のテンプレになります。

PHP

まとめ

まとめ
PDOについて基礎の基礎は理解できたかと思います。
今回はPDOでデータベースに接続する方法の解説なので、例外処理などについては触れていません。
なので、より深く、より正確に理解するために下記の記事も読んでください。

また…
POSTなどでユーザーから値を受け取るときは、入力された値を必ずチェックする必要があります。
なので、下記の記事も読んでおきましょう。

そもそも、GETやPOSTを理解していない方は、下記を読んでください。

そして、下記にPHP関連の記事をまとめていますので、初心者の方はぜひご覧ください。

人気記事

≫【2019年最新】IT転職におすすめの転職サイト・転職エージェント3選
≫【無料あり】現役エンジニアおすすめすのプログラミングスクール3社 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です