gpt4 book ai didi

php - 我的 Zend Framework 'quoting' 一团糟

转载 作者:可可西里 更新时间:2023-10-31 23:00:23 25 4
gpt4 key购买 nike

我有一个可能非常简单的问题,我无法在 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 = new 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)?标识符?

最佳答案

免责声明:此信息自本答案的原始发布日期起有效。 ZF 经常更改,此信息可能会随着 future 的版本而过时,但是,出于存档目的,此信息将保持不变。

如果您将一个字符串传递给 Zend_Db_Table_Abstract 子类的 fetchRow() 方法(您正在做的),它将被视为一个 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_Select 的实例传递给 fetchRow()方法代替...

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

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

这样做的好处是,您可以构建更复杂的查询,因为您可以控制很多,而不仅仅是 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() except 它在内部调用 select 对象的 limit() 方法,参数为 1

关于php - 我的 Zend Framework 'quoting' 一团糟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1168708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com