4

我有一个可能非常简单的问题,我在 Zend Framework 手册或其他地方找不到令人满意的(主观上看到的)答案......

有很多方法可以将我的 php 变量交给我的 sql 查询,以至于我失去了概述,可能我对一般的引用缺乏一些了解。

准备好的报表

$sql =  "SELECT this, that
        FROM table
        WHERE id = ? AND restriction = ?";

$stmt = $this->_db->query($sql, array($myId, $myValue)); 
$result = $stmt->fetchAll();

我知道使用这个解决方案我不需要引用任何内容,因为数据库会为我处理这个。

通过 API 查询 Zend_Db_Table 和 _Row 对象

$users = 新用户();

a) $users->fetchRow('userID = ' . $userID);  
b) $users->fetchRow('userID = ' . $users->getAdapter()->quote($userID, 'INTEGER'));  
c) $users->fetchRow('userID = ?', $userID);  
d) $users->fetchRow('userID = ?', $users->getAdapter()->quote($userID, 'INTEGER'));  

问题

我知道 a) 不好,因为它根本没有被引用。但是其他版本呢,最好的呢?c) 是否被视为陈述并自动引用,还是在使用 d) 时需要使用?标识符?

4

2 回答 2

5

免责声明:此信息自本答案的原始发布日期起有效。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);
    }

所以...:

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_SelectfetchRow()方法...

同样,在 的子类中Zend_Db_Table_Abstract,它看起来像这样:

$this->fetchRow($this->select()->where('userID = ?', $userID));

这样做的好处是您可以构建更复杂的查询,因为您可以控制的不仅仅是WHERESQL 查询的子句。理论上,您可以轻松做到:

$select = $this->select()->where('userID = ?', $userID)
                         ->join(array('sat' => 'superAwesomeTable'), array('sat.user_id = userID', array('superAwesomeColumn'));

$this->fetchRow($select);

注意:如果传递了 的实例Zend_Db_Select,则该fetchRow()方法的行为与此完全相同,fetchAll() 只是它在内部调用limit()了 select 对象的方法,参数为1

于 2009-07-23T02:13:27.643 回答
0

我习惯了

$where = $this->getAdapter()->quoteInto('name = ?', $name);
$this->fetchRow($where);
于 2009-07-23T11:06:31.740 回答