我遇到了一个可能非常简单的问题,在《 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();
我知道,使用此解决方案,我不需要引用任何内容,因为数据库会为我处理此问题。
$ 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时需要使用d)?标识符?
免责声明: 该信息自该答案的原始发布日期起有效。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
或的实例传递Zend_Db_Select
给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);
注意: 如果传递的实例Zend_Db_Select
,则该fetchRow()
方法的行为与之完全相同,fetchAll()
只是
它在内部limit()
使用参数调用select对象的方法1
。
在Zf3项目中,我添加了条令和迁移模块,并配置了条令和迁移配置。 现在我通过以下命令创建迁移 有人帮我吗有什么问题吗?
问题内容: 有没有一种方法可以在Zend Framework中将SQL字符串作为查询执行? 我有一个像这样的字符串: 现在,我想直接执行此字符串,然后对其进行解析并“手动” 创建一个对象。或者,如果可能的话,从此字符串创建一个对象,以执行该对象。 我怎样才能做到这一点?我在Zend文档中找不到解决方案。 问题答案: 如果要在一开始创建Zend_DB对象,则可以使用该对象创建查询。请查看手册中的以下
目前我尝试使用Zend Framework 2的CSRF保护。 但每次我发送表单时,都会收到以下错误消息: 提交的表格不是来自预期的网站 我以这种方式实施了CSRF保护: 1)创建了一个Form Class并添加了csrf: 2)在view文件中呼应csrf元素: 我发现csrf令牌没有存储在会话中,但是为什么呢?
您好,我遵循了Zend framework 3的入门教程,并设法使其正常工作。因此,我决定下载一个新的框架应用程序,并像在线商店一样对其进行调整。但是当我去运行模块时。php文件通过wamp我收到以下错误消息: 致命错误:在C:\wamp64\www\shop\module\shop\src\module中找不到接口“Zend\ModuleManager\Feature\ConfigProvide
我目前正在阅读“带有Zend框架的简易PHP网站”。在某种程度上,它引入了原则,并给出了一个src代码以及一个关于如何正确安装东西的文本。我正确地遵循了所有步骤,但在其中一个步骤中,您必须使用“seed.php”,它读取一些ASIN并将一些amazon产品详细信息加载到数据库中。但是,执行脚本会给我带来错误,而且它似乎找不到文件。 PHP警告:include_once(WJG\Controller
我使用的是Spring framework(不是Spring Boot)版本5。 我如何强制Spring framework使用我的日志框架,例如log4j2? Log4J-Web-2<...> LOG4J-JCL-2<...> log4j-jul-2<...> 通用日志-1.2 Spring仍然忽略log4j2.xml设置,并输出到控制台上的StdErr。