2013年08月26日

[Web] AWSを使ってみる BEC2からRDSにPDOを使ってアクセスしてみた

EC2からPHPを使って外部APIを使えたので、次は返ってきた値をDBに保存したいところです。
AWSでは、DBだけで独立したRDSというサービスがあるのでそれを利用しています。

今回のやることです。

@PDO(PHP Data Object)を知る
APDOを使ってRDS(MySQL)にアクセス
BPDOを使ってクエリを発行
CSQLにパラメーターを渡す


■前提条件
[Web] AWSを使ってみる @EC2とRDSの立ち上げを済ませて、
コマンドラインでRDS(MySQL)に接続できる状態になっていること


@PDO(PHP Data Object)を知る
PHP5から、MySQLを使うときに便利なクラスが登場しました。
「PDO」でググると詳しい説明が出てくるのでそちらを参照ください。

【参考】はじめてのPDO


APDOを使ってRDS(MySQL)にアクセス
BPDOを使ってクエリを発行

簡単な例を挙げます。
接続に必要な情報を揃えてから、new PDO() でMySQLにアクセスします。
それから query() を使ってSQLを発行します。
===========================================
<?php
try {
// AWS管理画面ではMySQL5.6.12なので、charset=utf8 を設定する
$dbs = "mysql:host=[RDSのインスタンスのEndpoint];dbname=[DB名];charset=utf8";
$user = "[RDSのインスタンスのユーザー名]";
$pass = "[RDSのインスタンスのパスワード]";
$sql = "INSERT INTO [テーブル名] (columnNum, columnStr) VALUES(10, 'テスト');";
// PDOを使ってRDSに接続
$pdo = new PDO($dbs, $user, $pass);
// SQLを発行
$pdo->query($sql);
// 切断
$pdo = null;
} catch (PDOException $e) {
die();
}
?>
===========================================
これだと固定のSQL文です。
たとえば「WHERE句」を柔軟に使えるようにするために条件にパラメーターを渡したいときは、
「query()」ではなくて「execute()」を使います。

ここで重要なのが、
EC2のデフォルトの設定では、PDOが使える設定になっていない
という点でした。

対処方法は、php.ini にPDOを有効にする設定を書き込むことでした。

まずは、PDOがインストールされているかチェック。
/usr/lib64/php/modules にpdo.so、pdo_mysql.soがあればOK。なければインストール↓
$ sudo yum -y install php-pdo

次にPDO用の設定を追記↓
$ sudo vim /etc/php.ini
;;;;
; Note: packaged extension modules are now loaded via the .ini files  ←こんな行があったのでその下に追記
; found in the directory /etc/php.d; these are loaded by default.
;;;;
extension=pdo.so
extension=pdo_mysql.so


【参考】
[AWS][PDO]AWSにMySQL用のPDOをインストールする


CSQLにパラメーターを渡す
SELECT文を例に挙げます。
先ほどの「query()」が「execute()」に変わり、「bindValue()」を使ってパラメーターを渡しています。
===========================================
<?php
try {
// AWS管理画面ではMySQL5.6.12なので、charset=utf8 を設定する
$dbs = "mysql:host=[RDSのインスタンスのEndpoint];dbname=[DB名];charset=utf8";
$user = "[RDSのインスタンスのユーザー名]";
$pass = "[RDSのインスタンスのパスワード]";
// :num のところがパラメーター
$sql = "SELECT * FROM [テーブル名] WHERE columnNum = :num;";
// PDOを使ってRDSに接続
$pdo = new PDO($dbs, $user, $pass);
// 先ほどのSQLを読み込んでおく
$stmt = $pdo->prepare($sql);
// SQLにパラメーターを渡す(整数なので、PDO::PARAM_INT)
$stmt->bindValue(':num', 10, PDO::PARAM_INT);
// SQLを発行
$pdo->execute($sql);
// SQLの結果を受け取る
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
// チェック
var_dump($result);
// 切断
$pdo = null;
} catch (PDOException $e) {
die();
}
?>
===========================================
これである程度柔軟なSQLを扱うことができるようになりました。

【参考】
queryメソッド
PDOの利用
PDOStatement::bindValue


よかったね。
めでたし、めでたし。

とはなりませんでした!
一番ハマった、RDSの文字化け問題が次に待ち構えるのでした。。。
posted by be-style at 21:30| Comment(0) | Web
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。