Zend framework [zend][db]带多个变量的fetchAll

Zend framework [zend][db]带多个变量的fetchAll,zend-framework,zend-db,parameterized,fetchall,Zend Framework,Zend Db,Parameterized,Fetchall,我试图在一个有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->

我试图在一个有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引擎对查询进行常规编译,并提高性能。

尝试以下操作:

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

$this->\u db必须是db适配器的实例。

有两种类型的参数,命名参数和位置参数。你把这两种类型混在一起,那是行不通的

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

$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 = "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也支持这两种参数样式。

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

我建议开始使用Zend_Db_Select和Zend_Db。最近我和Zend_Db做了很多事。更多来自

假设您有一个Zend_Db适配器:$this->\u 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();
如果要仅返回选定字段,请添加字段名称数组作为第二个参数:

# 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”或“will是”或“conditional”。如果第二个“where”是“a”和“the statement will”是“AND”

换句话说,第一个WHERE函数根据它将使用的条件被忽略

事实上,我昨天刚刚问了一个关于堆栈溢出的问题,关于做一个测试

希望有帮助!
干杯

这里是实际的Zend编码方法

$sql=“从mytable中选择*,其中field1=:param1和field2=:param2”; $this->_db->fetchAll($sql,数组(“param1”=>$value1,“param2”=>$value2))

这对我很有用