ステートメントはモデル(アクティブレコード)の下位のレイヤで、主に各データベースに合わせたSQLを組み立てる処理を行っています。下位のレイヤのため手続きは多少複雑であり、通常ステートメントを直接使うことはないでしょう。しかしながら、直接SQLを発行する場合などにステートメントの使用は有益です。
ステートメントオブジェクトは Sabel_Dbクラス より受け取ることができます。createStatement()メソッド の引数にはコネクションネームを渡すことができます。省略した場合はいつものように "default" が使用されます。
$stmt = Sabel_Db::createStatement();
SQLの実行は単純です。setQuery() でSQLをセットした後に execute()メソッド を実行してください。返り値はデータベースから取得した配列となります。
$stmt = Sabel_Db::createStatement();
$rows = $stmt->setQuery("SELECT * FROM user")->execute();
返された配列はモデルレイヤを通さないためデータ型に適した型にキャストはされません。
例えばPostgreSQLではINT型カラムのデータはint型で格納されていますが、MySQLでは文字列で格納されています。
foreach ($rows as $row) {
var_dump($row["age"]); // (int)20 or (string)"20"
}
直接SQLを発行する場合、エスケープ処理は開発者が行わなくてはなりません。値をエスケープするには、escapeString()メソッド を使用します。
$stmt = Sabel_Db::createStatement();
$sql = "SELECT * FROM user WHERE name = " . $stmt->escapeString($name);
$rows = $stmt->setQuery($sql)->execute();
他にも、プレースホルダにバインドする方法があります。プレースホルダはアットマークで囲んでください。
$stmt = Sabel_Db::createStatement();
$stmt->setQuery("SELECT * FROM user WHERE name = @name@");
$rows = $stmt->bind("name", $name)->execute();
配列で、複数のプレースホルダにバインドすることもできます。
$stmt = Sabel_Db::createStatement();
$stmt->setQuery("SELECT * FROM user WHERE name = @name@ AND age = @age@");
$rows = $stmt->binds(array("name" => $name, "age" => $age))->execute();
なお、同様のことが簡単に行える
db_query関数 もあります。