6

我正在尝试在具有 2 个变量的查询上使用 fetchAll。我无法弄清楚语法。我只能用 1 个变量来管理:

$sql = "SELECT * FROM mytable WHERE field1 = ?";
$this->_db->fetchAll($sql,$value1);  # that works

但是,当查询有多个变量时,我遇到了一些问题

$sql = "SELECT * FROM mytable WHERE field1 = ? AND field2 = ?";
$this->_db->fetchAll($sql,$value1,$value2); # doesn't work
$this->_db->fetchAll($sql,array("field1"=>$value1,"field2"=>$value2)); # doesn't work either

我要使用的原因是什么?而不是将变量直接放入查询中,我已经了解到使用 ? 允许由 db 引擎对查询进行一般性编译并提高性能。

4

4 回答 4

12

有两种类型的参数,命名参数和位置参数。你混合了这两种类型,这是行不通的。

命名参数按名称匹配占位符。名称以:符号开头。参数名称与您碰巧使用它们的列的名称不同。您在关联数组中提供参数值,使用参数名称(而不是列名称)作为数组键。例如:

$sql = "SELECT * FROM mytable WHERE field1 = :param1 AND field2 = :param2";
$this->_db->fetchAll($sql,array("param1"=>$value1,"param2"=>$value2));

位置参数使用?占位符的符号。您使用简单(非关联)数组提供参数值,并且数组中值的顺序必须与查询中参数占位符的顺序相匹配。例如:

$sql = "SELECT * FROM mytable WHERE field1 = ? AND field2 = ?";
$this->_db->fetchAll($sql,array($value1,$value2));

大多数品牌的 SQL 数据库本身只支持一种风格或另一种风格,但 PDO 试图同时支持这两种风格,必要时在准备查询之前重写 SQL。由于 Zend_Db 是在 PDO 之后建模的,所以 Zend_Db 也支持这两种参数样式。

于 2010-07-22T01:45:48.050 回答
5

这个问题有点老了,但我想我只是为了参考而添加它。

我建议开始将 Zend_Db_Select 与 Zend_Db 一起使用。最近我一直在用 Zend_Db 做很多事情。更多来自Zend_Db_Select 参考指南

假设您有一个 Zend_Db 适配器: $this->_db

# this will get the Zend_Db_Select object
$select = $this->_db->select();

# now you build up your query with Zend_Db_Select functions
$select->from('mytable');
$select->where('field1 = ?', $field1);
$select->where('field2 = ?', $field2);
[...]

# echo to see the SQL (helps in debugging)
# SELECT * FROM mytable WHERE field1 = ? AND field2 = ? [...]
echo '<p>My SQL: ' . $select . '</p>';

# Execute the SQL / Fetch results
$results = $select->query()->fetchAll();

这是您给定示例的基础知识,但是关于选择对象的 Zend Framework 参考指南有很多关于如何使用 JOINS、UNIONS、GROUP BY、LIMIT、HAVING 等构建更复杂查询的有用信息。

如果您想为表或参数使用别名,请使用关联数组,别名为索引值:

# SELECT p.* FROM products AS p
$select->from('p' => 'products');

如果您只想返回选定的字段,请添加字段名称数组作为第二个参数:

# SELECT model FROM products
$select->from(products, array(model));

实际上,上面可以生成完全限定的 SQL:

SELECT 'products'.model FROM 'products'

但为了在示例中简洁明了,我写了上面的内容。

我刚刚遇到的一件事是在 WHERE 条件下使用 AND 和 OR。

# WHERE a = $a
$select->where('a = ?', $a);

# WHERE a = $a AND b = $b
$select->where('a = ?', $a);
$select->where('b = ?', $b);

# WHERE a = $a OR b = $b
$select->where('a = ?', $a);
$select->orWhere('b = ?', $b);

# WHERE a = $a AND b = $b
$select->orWhere('a = ?', $a);
$select->where('b = ?', $b);

请注意,无论您使用以下“where”函数,都将与前面的语句组合为该操作数。好吧,这听起来令人困惑。

如果第二个“where”是“OR”,它将是“OR”条件。如果第二个“where”是“AND”,则语句将是“AND”。

换句话说,第一个 WHERE 函数在使用什么条件时会被忽略。

事实上,我昨天刚刚在 Stack Overflow 上问了一个关于使用 select 做一个复杂的 WHERE的问题。

希望有帮助!干杯!

于 2010-12-08T15:28:39.020 回答
2

试试这个:

$sql = "SELECT * FROM mytable WHERE field1 = ? AND field2 = ?";
$statement = $this->_db->query($sql,array("field1"=>$value1,"field2"=>$value2));
$data = $statement->fetchAll();

$this->_db 必须是 Db 适配器的实例。

于 2010-07-08T09:30:47.557 回答
0

下面是实际的 Zend 编码方式。

$sql = "SELECT * FROM mytable WHERE field1 = :param1 AND field2 = :param2"; $this->_db->fetchAll($sql,array("param1"=>$value1,"param2"=>$value2));

$where = $this->_db->select()
->from('mytable')
->where('field1 = ?',$value1)
->where('field2 = ?',$value2);

$rowSet = $this->_db->fetchAll($where);

这对我很有用

于 2012-09-06T23:01:49.623 回答