0

在阅读 Zend Framework 2 文档时:http: //framework.zend.com/manual/2.0/en/modules/zend.db.sql.html给出了两个示例,说明如何从数据库中查询数据。作为参考,它们是:

准备(使用 Select 对象):

use Zend\Db\Sql\Sql;
$sql = new Sql($adapter);
$select = $sql->select();
$select->from('foo');
$select->where(array('id' => 2));

$statement = $sql->prepareStatementForSqlObject($select);
$results = $statement->execute();

执行(使用 Select 对象)

use Zend\Db\Sql\Sql;
$sql = new Sql($adapter);
$select = $sql->select();
$select->from('foo');
$select->where(array('id' => 2));

$selectString = $sql->getSqlStringForSqlObject($select);
$results = $adapter->query($selectString, $adapter::QUERY_MODE_EXECUTE);

我无法在文档中找到任何进一步的说明,说明在某些情况下一种方法可能比另一种方法有哪些优点/缺点。我可以看到,如果我们需要调试 SQL 查询,getSqlStringForSqlObject 将帮助我们这样做。但除此之外,有没有人知道一种方法可能比另一种更好的情况?

谢谢。

4

3 回答 3

3

我当然会使用 prepareStatementForSqlObject() 来准备要执行的语句。

prepareStatementForSqlObject() will return a StatementInterface type object.

getSqlStringForSqlObject() will get you back an actual raw SQL string.

prepareStatementForSqlObject() 在库中的任何地方都没有使用,并且可能无论如何都不打算在外部使用。如果可以的话,我会坚持使用语句对象来执行查询。

第二个示例可能只是为了说明您可以在需要时执行原始 SQL 字符串。

于 2013-02-21T10:20:58.250 回答
0

我认为您的疑问与这些特定的 Zend 方法没有直接关系,而更多地来自于不了解准备好的 SQL 语句是什么。维基百科有一个很好的概述

总而言之,我希望 prepareStatementForSqlObject() 使用数据库系统对准备好的查询的支持,这具有以下优点:a) 在多次执行的情况下提供更好的性能;b) 有助于防止 SQL 注入。

于 2013-02-21T12:20:14.580 回答
0

ZF1 和 ZF2 如此不同和令人难过的部分令人困惑,以至于大多数公共文档都是 ZF1

阅读 PDO 文档是值得的,因为 ZF2 DB 主要作为 PDO 的包装器

我花了几个小时调试,直到决定跟踪 SQL

如果使用 MYSQL,您必须跟踪 SQL 以了解和调试 ZF2

如何查看实时 MySQL 查询? 很容易

以下代码有效 $sql = new Sql(self::getadapter()); $select = $sql->select(); $select->from('tbl_login');

$select ->where('logincd = ?', $logincd);
$select ->where('password = ?', $password);
$select ->where('active = ?', "Y");

$statement = $sql->prepareStatementForSqlObject($select);
// $result = $statement->execute(); // WRONG
$result = $statement->execute(array($logincd,$password,"Y")); // RIGHT

$rowset = new ResultSet;
$rowset->initialize($result);
$onerow=$rowset->current();  

我错过了 array($logincd,$password,"Y") 并且到达 MSQL 服务器的 SQL 是 SELECT tbl_login.* FROM tbl_loginWHERE logincd = NULL AND password= NULL AND active = NULL

当我将数组参数放入执行时,它是 SELECT tbl_login.* FROM tbl_loginWHERE logincd = 'jnc' AND password = 'secret' AND active = 'Y'

追踪并没有帮助我解决我编写的噩梦般的错误

$dbtable=new TableGateway('tbl_event_log',self::getadapter());

$dbtable->insert( array(
  'logincd' => $logincd  ,
  'eventdttm' => date('Y-m-d H:i:s'),
  'storecd'   => "S01", // $_SESSION["storecd"],
  'eventcd'   => $eventcd ,
  'eventtxt'  => $eventtxt )
 );

但我的错误是,我在“logincd”中有 1 个额外的空间,得到了 PDO 例外码,没有 trce!

经过很多痛苦后,将适配器(驱动程序是 Pdo_Mysql)更改为“驱动程序”=>“Mysqli”在“字段列表”中使用解决方案“未知列 'logincd'

在驱动程序的两种选择中,SQL INSERT 都没有到达服务器;跟踪没有帮助

所以我的建议是使用 SQL Trace 和翻转驱动程序来解决 ZF2 DB 问题

尽管有这些小故障,ZF2 DB 还是很不错的

贾扬塔@加尔各答

于 2013-07-21T12:37:50.440 回答