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オブジェクトです。
DBにもよると思いますが(mssqlとか範囲指定のできない奴)
$this->Query1->LimitStart = -1;
$this->Query1->LimitCount = -1;
をopen()の前に入れた方がいいかもしれません。
ikaneko様
なるほど。参考になります。
コメントありがとうございます。
もいっこ
$this->Query1->SQL = <<<EOS
SELECT *
FROM blogs
WHERE ID={$変数名}
EOS;
とヒアドキュメントするのも、SQLが長い場合は読みやすいかもしれません。
ソースコードフォーマッタ通らないけどw