我的Zend框架“引用”烂摊子(My Zend Framework 'quoting'

2019-09-20 07:26发布

我有一个可能很简单的问题,我无法找到Zend框架手册或其他地方的一个令人满意的(主观上看到的)答案...

有这么多的方法,我怎么能我的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

$用户=新用户();

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'));  

问题

据我所知,)也不行,因为它不是在所有的报价。 但对于其他版本的,什么是最好的? 为C)被当做一份声明中,并自动报价或做我需要使用d)当我使用? 标识?

Answer 1:

免责声明:本资料是作为这个答案的原始发布日期有效。 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_SelectZend_Db_SelectfetchRow()方法,而不是...

再次,在子类Zend_Db_Table_Abstract ,那应该是这样的:

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

这样做的加分,就是你可以构建更复杂的查询,你可以控制很多,不仅仅是更WHERE的SQL查询的WHERE子句。 从理论上讲,你可以很容易做到:

$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()的选择对象的方法,其中的参数1



Answer 2:

我习惯了

$where = $this->getAdapter()->quoteInto('name = ?', $name);
$this->fetchRow($where);


文章来源: My Zend Framework 'quoting' mess