特定機能の有無を確認

広告

前のページで見たプリペアドステートメントなどは、データベースによってはサポートしていない場合もあります。利用するデータベースで特定の機能を持っているかどうかを確認が必要な場合、DB_commonクラスで用意されている"provides"メソッドで確認が可能です。

選択されたデータベースで、その機能が使用可能であるかどうかを調べます。

パラメータ:
  string $feature  調べたい機能。
返り値:
  boolean - 機能がサポートされている場合に TRUE を返します。

確認が可能な機能は下記の4つです。

prepare      SQL文の事前チェックを行います。
pconnect     持続的接続をサポートします。
transactions トランザクションをサポートします。
limit        SELECTの出力結果を制限する LIMIT をサポートしています。

例えばMySQLに接続した時に、持続的接続をサポートしているかどうかは下記のように確認します。

$dsn = 'mysqli://testuser:testuser@localhost/uriage';

$db = DB::connect($dsn);

if ($db->provides('pconnect')) {
    print('持続的接続が利用可能です。');
}

サンプルプログラム

では実際に試してみます。

sample13-1.php

<html>
<head><title>PHP TEST</title></head>
<body>

<?php

require_once 'DB.php';

print('MySQLへの接続:<br>');

$dsn = 'mysqli://testuser:testuser@localhost/uriage';

$db = DB::connect($dsn);
if (PEAR::isError($db)) {
    die($db->getMessage());
}

hantei($db);

$db->disconnect();

print('<br>PostgreSQLへの接続:<br>');

$dsn = 'pgsql://pguser:pguser@localhost/uriage';

$db = DB::connect($dsn);
if (PEAR::isError($db)) {
    die($db->getMessage());
}

hantei($db);

$db->disconnect();

print('<br>SQLiteへの接続:<br>');

$dsn = array(
    'phptype'  => 'sqlite',
    'database' => 'D:¥Apache Group¥Apache2¥htdocs¥sqlite¥test.db',
);

$db = DB::connect($dsn);
if (PEAR::isError($db)) {
    die($db->getMessage());
}

hantei($db);

$db->disconnect();


function hantei($db){
    if ($db->provides('prepare')) {
        print('プリペアドステートメント:利用可能<br>');
    }else{
        print('プリペアドステートメント:不可<br>');
    }

    if ($db->provides('pconnect')) {
        print('持続的接続:利用可能<br>');
    }else{
        print('持続的接続:不可<br>');
    }

    if ($db->provides('transactions')) {
        print('トランザクション:利用可能<br>');
    }else{
        print('トランザクション:不可<br>');
    }

    if ($db->provides('limit')) {
        print('LIMIT:利用可能<br>');
    }else{
        print('LIMIT:不可<br>');
    }
}

?>

</body>
</html>

上記をWWWサーバに設置しブラウザで見てみると下記のようなりました。

PEAR::DBで特定機能サポートの確認

例えばMySQLであってもデータベースの種類によってはサポートしている機能に違いがありますのであくまで参考程度にして下さい。実際には各データベースの機能を確認することが必要です。またサポートされていない場合でもプリペアドステートメントのようにPEARでエミュレートしてくれる場合もあります。

( Written by Tatsuo Ikura )