免责声明:此信息自本答案的原始发布日期起有效。 ZF 经常更改,此信息可能会随着未来版本的发布而过时,但是,出于存档目的,此信息将保持不变。
如果您将一个字符串传递给fetchRow()
子类的方法Zend_Db_Table_Abstract
(你正在做的),它将被视为where
的一部分Zend_Db_Table_Select
实例。
换句话说,在内部,Zend_Db_Table
做这个:
if (!($where instanceof Zend_Db_Table_Select)) {
$select = $this->select();
if ($where !== null) {
$this->_where($select, $where);
}
So...:
a) $users->fetchRow('userID = ' . $userID);
根本没有被引用。
b) $users->fetchRow('userID = ' . $users->getAdapter()->quote($userID, 'INTEGER'));
手动引用为整数。
c) $users->fetchRow('userID = ?', $userID);
被自动引用Zend_Db_Adapter_*::quoteInto()
d) $users->fetchRow('userID = ?', $users->getAdapter()->quote($userID, 'INTEGER'));
实际上是双引号,一次由您引用,一次通过自动引用。
就“最佳”而言,我会推荐选项C。框架会自动调用quoteInto
关于参数化值。
记住:你总是可以传递一个实例Zend_Db_Table_Select
or Zend_Db_Select
to the fetchRow()
方法而不是...
再次,在子类中Zend_Db_Table_Abstract
,看起来像这样:
$this->fetchRow($this->select()->where('userID = ?', $userID));
这样做的好处是,您可以构建更复杂的查询,因为您可以控制的不仅仅是WHERE
SQL 查询的子句。理论上,你可以轻松地做到:
$select = $this->select()->where('userID = ?', $userID)
->join(array('sat' => 'superAwesomeTable'), array('sat.user_id = userID', array('superAwesomeColumn'));
$this->fetchRow($select);
Note:如果传递了一个实例Zend_Db_Select
, the fetchRow()
方法的作用完全相同fetchAll()
except它在内部调用limit()
select对象的方法,参数为1
.