我正在尝试在包含2个变量的查询中使用fetchAll。我无法弄清楚语法。 我只能管理一个变量:
$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引擎一般编译并提高性能。
答案 0 :(得分: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也支持两种参数样式。
答案 1 :(得分:5)
这个问题有点陈旧,但我想我只是为了参考而添加它。
我建议开始在Zend_Db中使用Zend_Db_Select。我最近在Zend_Db上做了很多。更多来自Zend_Db_Select reference guide。
让我们假设你有一个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();
这是您给出的示例中的基础知识,但是关于select对象的Zend Framework参考指南有很多关于如何使用JOINS,UNIONS,GROUP BY,LIMIT,HAVING等构建更复杂查询的信息。< / p>
如果要为表或参数使用别名,可以使用别名为索引值的关联数组:
# 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问了一个关于做complex WHERE using select的问题。
希望有所帮助! 干杯!
答案 2 :(得分:2)
试试这个:
$sql = "SELECT * FROM mytable WHERE field1 = ? AND field2 = ?";
$statement = $this->_db->query($sql,array("field1"=>$value1,"field2"=>$value2));
$data = $statement->fetchAll();
$ this-&gt; _db必须是Db适配器的实例。
答案 3 :(得分:0)
这是实际的Zend编码方式。
$ sql =“SELECT * FROM mytable WHERE field1 =:param1 AND field2 =:param2”; $这 - &GT; _db-&GT;使用fetchall($ SQL,阵列( “参数1”=&GT; $值1, “参数2”=&GT; $值2));
$where = $this->_db->select()
->from('mytable')
->where('field1 = ?',$value1)
->where('field2 = ?',$value2);
$rowSet = $this->_db->fetchAll($where);
这对我很有用