当前位置: 首页 > 面试题库 >

我的Zend框架“引用”一团糟

汪驰
2023-03-14
问题内容

我遇到了一个可能非常简单的问题,在《 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时需要使用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_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



 类似资料:
  • 在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。