RadPHP XEで任意のSQLを実行する方法

RadPHP XEで任意のSQLを実行する方法を紹介します。

(1)戻り値のあるSELECT文

戻り値のあるSELECT文では、Queryコンポーネントを使用します。

$this->Query1->SQL = 'SELECT * FROM blogs WHERE ID=?';
$this->Query1->Params = array(1);
$this->Query1->LimitStart = -1;
$this->Query1->LimitCount = -1;
$this->Query1->open();
for($this->Query1->first();  !$this->Query1->EOF; $this->Query1->next()) {
   $fields = $this->Query1->Fields;
   print_r($fields);
}
$this->Query1->close();

解説。

SQL文は、SQLプロパティに設定します。
パラメータを適用する部分には「?」を指定します。

$this->Query1->SQL = 'SELECT * FROM blogs WHERE ID=?';

※SQLはarrayで複数行のSQLも指定できます。
SQL文が長文になるときは、複数行に分けると読みやすくなります。

$this->Query1->SQL = array('SELECT *',
                           'FROM blogs',
                           'WHERE ID=?');

パラメータはParamsプロパティに設定します。

$this->Query1->Params = array(1);

※追記 コメント欄で教えていただきました。
次のコードをopen()の前に入れておいた方がいいそうです。

$this->Query1->LimitStart = -1;
$this->Query1->LimitCount = -1;

確かにソースコードを見ると、LimitStartとLimitCountが-1のときは”$this->Database->Execute”が呼ばれ、それ以外の時は”$this->Database->ExecuteLimit”が呼ばれています。
件数を指定しないときはLimitStartとLimitCountを-1にしておいた方が良さそうです。

SQL文を実行します。

$this->Query1->open();

取得したレコードの終わりまで処理を繰り返します。
# $this->Query1->first() は不要かも。

for($this->Query1->first(); !$this->Query1->EOF; $this->Query1->next()) {

Fieldsプロパティで結果を取得できます。
戻り値は 列名 => 値 のarrayです。

   $fields = $this->Query1->Fields;

次のような書き方もできます。

  $id = $this->Query1->Fields['ID'];
  $title = $this->Query1->Fields['TITLE'];

終わったら、Queryを閉じます。

$this->Query1->close();

(2)戻り値のないINSERT/UPDATE/DELTE文

戻り値のないINSERT/UPDATE/DELTE文では、Databaseコンポーネントのexecute()メソッドを使用します。

$sql = 'DELETE FROM blogs WHERE ID=?';
$params = array(1);
$resultset = $this->Database1->execute($sql, $params);

解説。

Databaseコンポーネントのexecuteメソッドは引数に、SQL文とパラメータを受け取ります。(パラメータは省略可能)

戻り値はResultSetオブジェクトです。

コメント

  1. DBにもよると思いますが(mssqlとか範囲指定のできない奴)
    $this->Query1->LimitStart = -1;
    $this->Query1->LimitCount = -1;
    をopen()の前に入れた方がいいかもしれません。

  2. ikaneko様
    なるほど。参考になります。
    コメントありがとうございます。

  3. もいっこ
    $this->Query1->SQL = <<<EOS
    SELECT *
    FROM blogs
    WHERE ID={$変数名}
    EOS;
    とヒアドキュメントするのも、SQLが長い場合は読みやすいかもしれません。
    ソースコードフォーマッタ通らないけどw

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください