- Home ›
- PEAR入門 ›
- データベース接続(PEAR::DB) ›
- HERE
クエリの実行
データベースに接続したら、SQL文を使ってデータベースからデータを取得したり、また新しいデータをデータベースに追加したりします。
PEAR::DBにおいてデータベースへSQL文を発行するにはDB_commonクラスで用意されている"query"メソッド使います。
query mixed &query (string $query [, mixed $params = array()])
引数に指定したクエリを実行します。 パラメータ: 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文を発行後、取得したデータを表示する部分がありますが、この部分は次のページ以降で詳細を確認します。
<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サーバに設置しブラウザで見てみると下記のようなりました。
( Written by Tatsuo Ikura )