Zend Frameworkでカスタムsql文を実行
Zend FrameworkのZend_Db_Tableクラスはデータテーブルに対してselect,insert,deleteなどの操作をうまく実現できる.しかし、sql文を自分で実行したい場合があります.
ZFももちろんサポートしています.
1つの方法は、ZFドキュメントに記載されていないZend_を直接使用することです.Db_Adapterのquery文はsqlを実行します.
たとえば、あるクラス(Zend_DB_Tableが継承されている)では、次のように使用できます.
注意したいのは、ZFのヘルプドキュメントでは、すべて採用されていますか?を選択します.これは、データベースadapterをmysqliに設定したときに使用されます.データベースadapterがPDO_を使用している場合MYSQLは、疑問符プレースホルダを使用するのではなく、パラメータ化された方法を使用しなければなりません.例えば、上記のsqをPDO_に変更する場合MYSQL環境では、次のようになります.
実際にget_を使うとclassメソッドは両者のAdapterの違いを表示し、異なる環境でget_class($this->getAdapter())の戻り値は異なります.
PDO_MYSQL環境ではZend_Db_Adapter_Pdo_Mysql
mysqli環境ではZend_Db_Adapter_Mysqli
ZFヘルプの1つの方法はZend_を使用することです.Db_Statement,Zend_Db_Statementクラスは抽象クラスで、使用する場合は特定のサブクラスを使用する必要があります.同様に、現在のデータベース接続方式によってサブクラスが異なり、mysqliであればZend_を使用します.Db_Statement_Mysqli、PDOならMYSQL、Zend_を使用Db_Statement_Pdo.
例は、プレースホルダの違いに注意してください.
PDO_MYSQL環境下:
mysqli環境では:
注目すべきは、ZFでZend_を使用しない場合Db_Statementではなく、独自のAdapterを使用し、whereメソッドを使用する場合は、データベース接続方式がPDO_であることにかかわらずMYSQLまたはmysqliは、疑問符プレースホルダを使用します.たとえば、次の例です.
まとめ,ZFを用いてsqlを実行する場合,データベース接続方式に注意し,sqlパラメータを正確に渡す.
ZFももちろんサポートしています.
1つの方法は、ZFドキュメントに記載されていないZend_を直接使用することです.Db_Adapterのquery文はsqlを実行します.
たとえば、あるクラス(Zend_DB_Tableが継承されている)では、次のように使用できます.
$sql = "delete from options where id=?";
$this->getAdapter()->query($sql, array('1'));
注意したいのは、ZFのヘルプドキュメントでは、すべて採用されていますか?を選択します.これは、データベースadapterをmysqliに設定したときに使用されます.データベースadapterがPDO_を使用している場合MYSQLは、疑問符プレースホルダを使用するのではなく、パラメータ化された方法を使用しなければなりません.例えば、上記のsqをPDO_に変更する場合MYSQL環境では、次のようになります.
$sql = "delete from options where id=:id";
return $this->getAdapter()->query($sql, array("id"=>1));
実際にget_を使うとclassメソッドは両者のAdapterの違いを表示し、異なる環境でget_class($this->getAdapter())の戻り値は異なります.
PDO_MYSQL環境ではZend_Db_Adapter_Pdo_Mysql
mysqli環境ではZend_Db_Adapter_Mysqli
ZFヘルプの1つの方法はZend_を使用することです.Db_Statement,Zend_Db_Statementクラスは抽象クラスで、使用する場合は特定のサブクラスを使用する必要があります.同様に、現在のデータベース接続方式によってサブクラスが異なり、mysqliであればZend_を使用します.Db_Statement_Mysqli、PDOならMYSQL、Zend_を使用Db_Statement_Pdo.
例は、プレースホルダの違いに注意してください.
PDO_MYSQL環境下:
$sql ='delete from options where id=:id';
$stmt = new Zend_Db_Statement_Pdo($this->getAdapter(), $sql);
return $stmt->execute(array(":id" => $id));
mysqli環境では:
$sql = 'delete from options where id=?';
$stmt = new Zend_Db_Statement_Mysqli($this->getAdapter(), $sql);
return $stmt->execute(array($id));
注目すべきは、ZFでZend_を使用しない場合Db_Statementではなく、独自のAdapterを使用し、whereメソッドを使用する場合は、データベース接続方式がPDO_であることにかかわらずMYSQLまたはmysqliは、疑問符プレースホルダを使用します.たとえば、次の例です.
$where = $this->getAdapter()->quoteInto('id=?', 37);
$result = $this->fetchAll($where);
return $result->toArray();
まとめ,ZFを用いてsqlを実行する場合,データベース接続方式に注意し,sqlパラメータを正確に渡す.