PDOは「PHP Data Objects」の略称で、PHP5.1よりサポートされたデータベース接続のための抽象化レイヤーです。
抽象化レイヤーってよく分かんないですけど、MySQLだろうがPostgreSQLだろうがSQLiteだろうが、同じ関数を使っても「よしな」にPHPとデータベースの間を取り持ってくれる便利なヤツですね。
mysql_connect()
がPHP5.5で非推奨となり7.0で削除されたため、現在のPHPによるデータベース接続の主流となっています。
今回は、このPDOを使ったMySQLとの接続方法をご紹介します。
接続を失敗した際のエラーも見ていきますので、エラーで上手く行かない人はエラーメッセージを確認してみましょう。
目次
MySQLに接続するコード全文
まずは、MySQLに接続するPDOのコードを見てみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// データベースに接続するために必要なデータソースを変数に格納 // mysql:host=ホスト名;dbname=データベース名;charset=文字エンコード $dsn = 'mysql:host=mysql000.db.sakura.ne.jp;dbname=example_php;charset=utf8'; // データベースのユーザー名 $user = 'user'; // データベースのパスワード $password = 'pass'; // tryにPDOの処理を記述 try { // PDOインスタンスを生成 $dbh = new PDO($dsn, $user, $password); // エラー(例外)が発生した時の処理を記述 } catch (PDOException $e) { // エラーメッセージを表示させる echo 'データベースにアクセスできません!' . $e->getMessage(); // 強制終了 exit; } |
DSNやユーザー、パスワードをご自分の環境のもので設定すれば、これだけでMySQLに接続できます。
最初はよく分からないと思いますが、定型文と思ってコピペで動かしてみましょう。
それぞれの役割は以下で説明していますので、興味ある方はご覧ください。
コードの説明
DSN(データベースに接続するための情報)
まず、ホスト名などのデータソースを用意します。
1 2 |
// mysql:host=ホスト名;dbname=データベース名;charset=文字エンコード $dsn = 'mysql:host=mysql000.db.sakura.ne.jp;dbname=example_php;charset=utf8'; |
先ほどのサンプルの最初に出てくるこのコードは、データベースに接続するために必要な情報を用意しました。
$dsn = ‘mysql:host= ホスト名 ;dbname= データベース名 ;charset= 文字エンコード ‘;
$dsn
はデータソース名(Date Source Name)の略です。
mysql:
のあとに、以下3つのパラメータを;
(セミコロン)で区切りました。
- ホスト名
データベースが稼働しているサーバーマシン名です。
わたくしは「さくらインターネット」というレンタルサーバーを使いましたが、その場合「mysql***.db.sakura.ne.jp」というホスト名になりました。
使っているサーバー環境によって変わります。 - データベース名
上記サーバーで稼働しているデータベースの名前です。
サーバーというマシンに割り当てられたデータの部屋みたいなものですかね。
さくらインターネットでは、「ユーザー名_データベース名」となっていました。 - 文字エンコード
エンコードを指定しなくても動きますが、文字化けの原因となるため指定しておきましょう。
ただし、PHP5.3.6以前のバージョンでは文字エンコードを指定しても無視されるため無意味です。
オプションで設定しましょう。
ユーザー名・パスワード
データベースにログインするためのユーザー名とパスワードを用意します。
1 2 3 4 5 |
// データベースのユーザー名 $user = 'user'; // データベースのパスワード $password = 'pass'; |
レンタルサーバーだと、ユーザー名とパスワードは必ず設定するでしょう。
ローカル環境では、MySQLを導入した際に設定したものになります。
データベース接続のPDOインスタンスを生成
1 2 |
// PDOインスタンスを生成 $dbh = new PDO($dsn, $user, $password); |
new PDO( DSN , ユーザー名 , パスワード );
インスタンス生成
ここでは、PDOクラスから、データベース接続のPDOインスタンスを生成します。
MySQLに接続するためのパーツを作ってあげましょう。
接続に成功したら、PDOオブジェクトを返します。
このPDOオブジェクトから、SQL文を使ってデータを引っ張ったりします。
インスタンスとは?
インスタンスってなんでしょう?
わたくしもよく分かっていませんでしたが、以下を引用させていただきます。
インスタンス(instance)とは、実体という意味で、オブジェクト指向プログラミングなどで使用される用語。 クラスと対比して用いられることが多く、クラスを「型」、インスタンスを「実体」として説明されることもある。
出典:日立ソリューションズ
オブジェクト指向のプログラミングで使われ、「クラスという設計図から、インスタンスという製品を作りました!」というイメージですかね。
try catchで例外処理
上記インスタンス生成のコードをtry {}
catch {}
というブロックが囲っているのはお気付きのことと思います。
try
ブロックでデータベース接続のコードを記述し、例外(エラー)が発生したらcatch
ブロックの方で記述した処理が発動します。
PDOExeption
PDOが発するエラーのクラスです。
エラーメッセージやエラーを起こしたファイル、エラーコード、DSNなどが格納されています。
1 2 |
// エラー(例外)が発生した時の処理を記述 } catch (PDOException $e) { |
catch
ブロックでPDOException
クラスを指定し、半角スペースを空け、変数$e
に格納しています。
1 2 |
// エラーメッセージを表示させる echo 'データベースにアクセスできません!' . $e->getMessage(); |
PDOException
クラスが格納された変数$e
から、->getMessage()
でエラーメッセージを取り出しecho
で出力しています。
try catchしなかったら?
try
catch
の例外処理をせずにもしエラーが出た場合、プログラムがそこで中断してしまいます。
そして、ユーザー名やデータソース名などに誤りがあった場合や、その他データベースの接続エラーがあった場合に、いつものPHPのエラーが表示されます。
そこに、パスワードや重要な情報が表示されてしまいます。怖いですね。
本番環境ではPHPのエラーは非表示にさせることが多いですが、きちんと例外処理をして、エラーが出た場合の処理もきちんとしてあげる必要があるでしょう。
接続を閉じる
通常、PHPのスクリプトが終了したら自動的に接続は閉じられますが、任意に閉じることも可能です。
1 2 |
// データベースとの接続を閉じる $dbh = null; |
プログラムの最後に上記を追加すると接続は閉じられます。
当然、接続を閉じると、以後データベース名にアクセスできません。
以下のようなエラーが出ます。
Fatal error: Call to a member function exec() on a non-object in …
エラーメッセージ
ユーザー名やパスワード、DSNの設定などが間違っているとエラーとなりますが、実際にはどんなエラーメッセージが出るでしょうか?
エラーが起きたらメッセージを確認し、適切に対処しましょう。
ホスト名のエラー
ホスト名が間違っていると以下のようなエラーが表示されます。
SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: hostname nor servname provided, or not known
そんなホスト名はないよ!とエラーが出ました。
データベース名のエラー
データベース名が間違っていると以下のようなエラーが表示されます。
SQLSTATE[HY000] [1044] Access denied for user ‘example’@’%’ to database ‘mple_php’
最後の引数に間違ったデータベース名が表示されています。
ユーザー名、パスワードのエラー
ユーザー名やパスワードが間違っていると以下のようなエラーが表示されます。
SQLSTATE[HY000] [1045] Access denied for user ‘mple’@’127.0.0.1’ (using password: YES)
ユーザー名が間違っていた場合、エラー文中央の@
の前に間違ったユーザー名が表示されています。
そこに正しいユーザー名が表示されていた場合、パスワードが間違えているかと思います。
SQLSTATE
に続くエラーコードで大体のエラーの種類が分かります。
他にも様々なエラーが存在しますので、下記公式サイト等でチェックしてみましょう。
参考:MySQL公式 – B.3 サーバーのエラーコードおよびメッセージ