前回、PHP-MySQLを使用したプログラムで失敗したので、今回はPDOを使用してDBにアクセスします。
前回の失敗記事 -> lolipopで、PHPとPDOを使用してDBに接続する
今回使用するPDOライブラリですがですが、以下の特長を持っています。
- PHP5以降の環境で標準インストールされているパッケージ
- 比較的速い(各DBネイティブのAPI程ではないが)
- MySQLに限らず、接続するDBに依存しないインターフェース(関数)
というわけで、いきなりプログラムです。
<?php $ermsg = ""; //--------------------------------------------------- // DBに接続する //--------------------------------------------------- function getConnection() { $server = "mysqlxxx.phy.lolipop.jp"; // 実際の接続値に置き換える $user = "LAxxxxxxxx"; // 実際の接続値に置き換える $pass = "xxxxxxxxxx"; // 実際の接続値に置き換える $database = "LAxxxxxx-dbname"; // 実際の接続値に置き換える //------------------- //DBに接続 //------------------- $pdo = new PDO("mysql:host=" . $server . "; dbname=".$database, $user, $pass ); return $pdo; } //--------------------------------------------------- // SQLを実行する //--------------------------------------------------- function execute( $conn, $sql, $param = array() ) { //------------------- //クエリのセット //------------------- $stmt = $conn->prepare( $sql ); //----------------------- // バインド変数のセット //----------------------- foreach( $param as $key => $value ) { //$stmt->bindValue( 1, "aaa" ); // ?でbindするとき(1 origin) $stmt->bindValue( $key, $value ); } //------------------- //クエリの実行 //------------------- $stmt->execute(); return $stmt; } //--------------------------------------------------- // PDOテストメイン //--------------------------------------------------- function testMain() { try { //---------------------------- //DBへ接続する //---------------------------- $conn = getConnection() ; //---------------------------- // SQLの実行 //---------------------------- $sql = <<< QUERY select table_name from INFORMATION_SCHEMA.tables where table_name like "C%" QUERY; $stmt = execute( $conn, $sql ); //---------------------------- // 結果の出力 //---------------------------- echo "test case 1----------------------------------------------------\n"; while( $row = $stmt->fetch(PDO::FETCH_ASSOC ) ) { echo $row[ "table_name" ] . "\n"; } } catch ( PDOException $ex ) { $ermsg = $ex->getMessage(); return null; } $conn = null; } ?> <!-- 検索結果をダンプする --> <pre> <?php testMain(); ?> >/pre> <!-- エラー発生時のメッセージ --> <?php echo $ermsg; ?> |
上記の処理でDBアクセスが可能です。
実行結果:
test case 1---------------------------------------------------- CHARACTER_SETS COLLATIONS COLLATION_CHARACTER_SET_APPLICABILITY COLUMNS COLUMN_PRIVILEGES |
また、前回ダメだったプリペアステートメントもPDOでは使用可能です。
以下のような記述で…
<?php //--------------------------------------------------- // PDOテストメイン //--------------------------------------------------- function testMain() { try { //---------------------------- //DBへ接続する //---------------------------- $conn = getConnection() ; //---------------------------- // バインド変数もOK //---------------------------- $sql = <<< QUERY select table_name, engine from INFORMATION_SCHEMA.tables where engine = :engine and table_name like :tnamePrefix QUERY; $param = array( ":engine" => "MyISAM", ":tnamePrefix" => "P%" ); $stmt = execute( $conn, $sql, $param ); echo "test case 2----------------------------------------------------\n"; while( $row = $stmt->fetch(PDO::FETCH_ASSOC ) ) { echo $row[ "engine" ] . " => " . $row[ "table_name" ] . "\n"; } } catch ( PDOException $ex ) { $ermsg = $ex->getMessage(); return null; } $conn = null; } ?> |
ちゃんとバインド変数を適用して、SQLを発行してくれます。
test case 2---------------------------------------------------- MyISAM => PARTITIONS MyISAM => PLUGINS MyISAM => PROCESSLIST |
lolipopで、DB接続情報を確認する方法は、前回の記事を参照してください。
また、PDO使用時に文字コードを指定したい場合は、以下の記述でOKです。
$pdo = new PDO("mysql:host=" . $server . "; dbname=".$database, $user, $pass ); |
↓
$pdoParam = array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET utf8" ); $pdo = new PDO("mysql:host=" . $server . "; dbname=".$database, $user, $pass, $pdoParam ); |
関連記事
コメントを残す