クエリの実行

広告

データベースに接続したら、SQL文を使ってデータベースからデータを取得したり、また新しいデータをデータベースに追加したりします。

PEAR::DBにおいてデータベースへSQL文を発行するにはDB_commonクラスで用意されている"query"メソッド使います。

引数に指定したクエリを実行します。

パラメータ:
  string $query  SQLクエリあるいはプリペアドステートメント。
  mixed $params  プリペアドステートメントに適用する配列・文字列あるいは
    数値のデータ。 渡す項目数は、文中のプレースホルダの数と一致していな
    ければなりません。 プレースホルダがひとつだけの場合は配列でない値を
    指定し、複数存在する場合は個々の値を要素にもつ配列を指定します。
返り値:
  結果を返すクエリ (例えば SELECT クエリなど) の場合は新しい DB_result 
    オブジェクト、 データを操作するクエリ (例えば INSERT クエリなど) の
    場合は DB_OK、あるいは失敗した場合には DB_Error オブジェクトを返し
    ます。

"query"メソッドは、"connect"メソッドが成功した時に取得できるDB オブジェクトに対して実行します。

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

$res =& $db->query('SELECT ....');

"query"メソッド実行後もエラーの有無を確認するのが推奨されています。

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

$res =& $db->query('SELECT ....');
if (PEAR::isError($res)) {
    die($res->getMessage());
}

SQL文の記述方法

SQL文の指定は単にSQL文を記述する場合と、プレースホルダを使う方法の2通りがあります。

プログラムを記述する段階でSQL文が決まっているならSQLを表す文字列を"query"メソッドの引数に指定します。

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

$sql = 'select * from shouhin';
$res =& $db->query($sql);
if (PEAR::isError($res)) {
    die($res->getMessage());
}

プレースホルダーを使う

SQL文を実行時に動的に作成する場合は、SQLインジェクション対策のためにエスケープ処理してSQL文を作り上げることも可能ですが、このような場合はプレースホルダーを使うと便利です。具体的には実行時に値が決まる部分を「?」に置き換えてSQL文を作成し、「?」に当てはめたい値を配列で指定します。

例えば「select * from shouhin where id > 1 and id < 4」のようなWHERE句で条件を指定する場合を考えます。この「1」と「4」の部分を実行時にユーザーからの入力した値を設定したいとした場合に、プレースホルダーを使って記述すると下記のようになります。

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

$sql = 'select * from shouhin where id > ? and id < ? ';
$data = array(1, 4);

$res =& $db->query($sql, $data);
if (PEAR::isError($res)) {
    die($res->getMessage());
}

このようにプレースホルダーを使ってSQL文を作成すると自動でエスケープ処理が行われるため、個々の値に対してエスケープ処理を行うよりも簡潔に記述することができます。

プレースホルダーを使用した場合には、その部分に当てはめたい実際の値を別に用意し、queryメソッドの2番目の引数として指定します。1つのSQL文の中で複数のプレースホルダーがある場合は上記のように配列を使って指定します。1つの場合は単に値を指定します。下記の指定する値が1つの場合の例を記述します。

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

$sql = 'select * from shouhin where id > ?';
$data = 1;

$res =& $db->query($sql, $data);
if (PEAR::isError($res)) {
    die($res->getMessage());
}

サンプルプログラム

では実際に試してみます。下記ではSQL文を発行後、取得したデータを表示する部分がありますが、この部分は次のページ以降で詳細を確認します。

sample7-1.php

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

<?php

require_once 'DB.php';

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

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

print('接続に成功しました<br>');

$db->query('SET NAMES sjis');
if (PEAR::isError($db)) {
    die($db->getMessage());
}

$sql = 'select * from shouhin';
$res =& $db->query($sql);
if (PEAR::isError($res)) {
    die($res->getMessage());
}

while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
    print($row['id']);
    print($row['name'].'<br>');
}

$db->disconnect();

?>

</body>
</html>

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

PEAR::DBのqueryメソッド

( Written by Tatsuo Ikura )