Warning: count(): Parameter must be an array or an object that implements Countable in /home/nir87/www/flatflag/wp-includes/post-template.php on line 284

PHPでMySQLに接続する(PDO)

  • このエントリーをはてなブックマークに追加
  • Pocket

スポンサードリンク

PDOは「PHP Data Objects」の略称で、PHP5.1よりサポートされたデータベース接続のための抽象化レイヤーです。

抽象化レイヤーってよく分かんないですけど、MySQLだろうがPostgreSQLだろうがSQLiteだろうが、同じ関数を使っても「よしな」にPHPとデータベースの間を取り持ってくれる便利なヤツですね。

mysql_connect()がPHP5.5で非推奨となり7.0で削除されたため、現在のPHPによるデータベース接続の主流となっています。

今回は、このPDOを使ったMySQLとの接続方法をご紹介します。

接続を失敗した際のエラーも見ていきますので、エラーで上手く行かない人はエラーメッセージを確認してみましょう。

 

MySQLに接続するコード全文

まずは、MySQLに接続するPDOのコードを見てみましょう。

DSNやユーザー、パスワードをご自分の環境のもので設定すれば、これだけでMySQLに接続できます。

最初はよく分からないと思いますが、定型文と思ってコピペで動かしてみましょう。

それぞれの役割は以下で説明していますので、興味ある方はご覧ください。

コードの説明

DSN(データベースに接続するための情報)

まず、ホスト名などのデータソースを用意します。

先ほどのサンプルの最初に出てくるこのコードは、データベースに接続するために必要な情報を用意しました。

$dsn = ‘mysql:host= ホスト名 ;dbname= データベース名 ;charset= 文字エンコード ‘;

$dsnはデータソース名(Date Source Name)の略です。

mysql:のあとに、以下3つのパラメータを;(セミコロン)で区切りました。

 

  1. ホスト名
    データベースが稼働しているサーバーマシン名です。
    わたくしは「さくらインターネット」というレンタルサーバーを使いましたが、その場合「mysql***.db.sakura.ne.jp」というホスト名になりました。
    使っているサーバー環境によって変わります。
  2. データベース名
    上記サーバーで稼働しているデータベースの名前です。
    サーバーというマシンに割り当てられたデータの部屋みたいなものですかね。
    さくらインターネットでは、「ユーザー名_データベース名」となっていました。
  3. 文字エンコード
    エンコードを指定しなくても動きますが、文字化けの原因となるため指定しておきましょう。
    ただし、PHP5.3.6以前のバージョンでは文字エンコードを指定しても無視されるため無意味です。
    オプションで設定しましょう。

ユーザー名・パスワード

データベースにログインするためのユーザー名とパスワードを用意します。

レンタルサーバーだと、ユーザー名とパスワードは必ず設定するでしょう。

ローカル環境では、MySQLを導入した際に設定したものになります。

データベース接続のPDOインスタンスを生成

new PDO( DSN , ユーザー名 , パスワード );

インスタンス生成

ここでは、PDOクラスから、データベース接続のPDOインスタンスを生成します。

MySQLに接続するためのパーツを作ってあげましょう。

接続に成功したら、PDOオブジェクトを返します。

このPDOオブジェクトから、SQL文を使ってデータを引っ張ったりします。

インスタンスとは?

インスタンスってなんでしょう?

わたくしもよく分かっていませんでしたが、以下を引用させていただきます。

インスタンス(instance)とは、実体という意味で、オブジェクト指向プログラミングなどで使用される用語。 クラスと対比して用いられることが多く、クラスを「型」、インスタンスを「実体」として説明されることもある。

出典:日立ソリューションズ

オブジェクト指向のプログラミングで使われ、「クラスという設計図から、インスタンスという製品を作りました!」というイメージですかね。

try catchで例外処理

上記インスタンス生成のコードをtry {}catch {}というブロックが囲っているのはお気付きのことと思います。

tryブロックでデータベース接続のコードを記述し、例外(エラー)が発生したらcatchブロックの方で記述した処理が発動します。

PDOExeption

PDOが発するエラーのクラスです。

エラーメッセージやエラーを起こしたファイル、エラーコード、DSNなどが格納されています。

catchブロックでPDOExceptionクラスを指定し、半角スペースを空け、変数$eに格納しています。

PDOExceptionクラスが格納された変数$eから、->getMessage()でエラーメッセージを取り出しechoで出力しています。

参考:PHPのアロー演算子(->)をできるだけ分かりやすく

try catchしなかったら?

trycatchの例外処理をせずにもしエラーが出た場合、プログラムがそこで中断してしまいます。

そして、ユーザー名やデータソース名などに誤りがあった場合や、その他データベースの接続エラーがあった場合に、いつものPHPのエラーが表示されます。

そこに、パスワードや重要な情報が表示されてしまいます。怖いですね。

本番環境ではPHPのエラーは非表示にさせることが多いですが、きちんと例外処理をして、エラーが出た場合の処理もきちんとしてあげる必要があるでしょう。

接続を閉じる

通常、PHPのスクリプトが終了したら自動的に接続は閉じられますが、任意に閉じることも可能です。

プログラムの最後に上記を追加すると接続は閉じられます。

当然、接続を閉じると、以後データベース名にアクセスできません。

以下のようなエラーが出ます。

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 サーバーのエラーコードおよびメッセージ

スポンサードリンク

  • このエントリーをはてなブックマークに追加
  • Pocket

コメントを残す

*