lolipopで、PHPとPDOを使用してDBに接続する

前回、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(); ?>
&gt;/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 );


関連記事

コメントを残す

メールアドレスが公開されることはありません。