Tag Archives: PDO

SQLiteのインメモリDBを異なるPDOオブジェクトから参照するには

このエントリーをはてなブックマークに追加
はてなブックマーク - SQLiteのインメモリDBを異なるPDOオブジェクトから参照するには
Share on Facebook

どうにもSQLiteのインメモリDBの値が取得できなかったので、実験してみました。 いきなり結論を書くと、「あるPDOオブジェクトからは、別のPDOオブジェクトが作成したインメモリDBには接続できない」ようです。

テストコード

<?php
/**
 * SQLiteのオンメモリDBにテストデータを作成し、PDOからアクセスできることを確かめる
 */
try {
    $pdo1 = new PDO('sqlite::memory:', null, null);
    $pdo1->exec('CREATE TABLE uso(id INTEGER PRIMARY KEY, name STRING)');
    $pdo1->exec('INSERT INTO uso VALUES (1, "uhouho");');
    $pdo1->exec('INSERT INTO uso VALUES (2, "mojamoja");');

    // 接続済みのPDOオブジェクトからデータを取得できるか試してみる
    $stmt = $pdo1->query('SELECT * FROM uso');
    if (!$stmt) {
        echo 'Cannot fetch data via $pdo1.';
    } else {
        print_r($stmt->fetchAll(PDO::FETCH_ASSOC));
    }

    // 新たにPDOオブジェクトを作成し、データを取得できるか試してみる
    $pdo2 = new PDO('sqlite::memory:');
    $stmt = $pdo2->query('SELECT * FROM uso');
    if (!$stmt) {
        echo 'Cannot fetch data via $pdo2.';
    } else {
        print_r($stmt->fetchAll(PDO::FETCH_ASSOC));
    }
} catch (Exception $e) {
    exit($e->getMessage());
}

結果

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => uhouho
        )

    [1] => Array
        (
            [id] => 2
            [name] => mojamoja
        )

)
Cannot fetch data via $pdo2.

$pdo1で作成したインメモリDBに、$pdo2からは接続できていません。 どちらも同じ「sqlite::memory:」ですが、見ている領域は異なるようです。

考察

インメモリDB内に作ったテーブルに、複数のPDOオブジェクトからアクセスすることはできませんでした。 アクセスしたければ、テーブルを作ったPDOオブジェクトを使い回すしかなさそうです。

PDOをシンプルに使うためのラッパー

このエントリーをはてなブックマークに追加
はてなブックマーク - PDOをシンプルに使うためのラッパー
Share on Facebook

PHPでPDOを使う時、毎回毎回「DBハンドラを取得→クエリを書く→実行する→結果をフェッチする」といった流れを書く必要があり面倒です。使う機会が多いからもっと簡単に使えるラッパーでも作ろうかと思っていたら、すでにありました。

Simple PHP PDO Wrapper : light, static, easy – Let’s explore the web technologies together

使い方

非常に簡単です。下記のサンプルのように使います。

<?php
require_once('Db.php');

$query = <<<QUERY
SELECT  *
FROM    users
WHERE   name LIKE 'John Coltrane'
;
QUERY;

Db::setConnectionInfo('database', 'username', 'password', 'mysql', 'host');
$result = Db::getResult($query);
var_dump($result);
?>

特に結果をフェッチするあたりが簡潔になり、使い勝手が良いです。

注意: PEAR::DBと重複する場合

include_pathにPEARライブラリがあるとき、「require_once ‘Db.php’」などでロードしようとすると、PEAR::DBと重複してエラーになる場合があります。

この場合は、Db.phpを絶対パスで指定する、ファイル名を変更するなどの対策が必要です。