Zend Framework中的Zend_Db_Table類可以很好的對數據表實現select,insert,delete等操作。但是有時候還是希望自己運行一些sql語句。
ZF當然也是支持的。
一種方法是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_html' target='_blank'>class方法查看兩者Adapter的區別,不同環境下get_class($this->getAdapter())返回值是不同的。
PDO_MYSQL 環境下 為Zend_Db_Adapter_Pdo_Mysql
mysqli 環境下為 Zend_Db_Adapter_Mysqli
ZF幫助中提到的一種做法是使用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參數。
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答