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を発行します。
===========================================これだと固定の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();
}
?>
===========================================
たとえば「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()」を使ってパラメーターを渡しています。
===========================================これである程度柔軟なSQLを扱うことができるようになりました。
<?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();
}
?>
===========================================
【参考】
・queryメソッド
・PDOの利用
・PDOStatement::bindValue
よかったね。
めでたし、めでたし。
とはなりませんでした!
一番ハマった、RDSの文字化け問題が次に待ち構えるのでした。。。