[zend] [db] fetchAll包含多个变量

Max*_*Max 5 zend-framework parameterized fetchall zend-db

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

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

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

$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
Run Code Online (Sandbox Code Playgroud)

我之所以要用?而不是将变量直接放入查询是我已经学会了使用?允许查询由db引擎一般编译并提高性能.

Bil*_*win 12

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

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

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

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

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

大多数品牌的SQL数据库本身只支持一种风格或另一种风格,但PDO尝试通过在准备查询之前重写SQL(如有必要)来支持这两种风格.由于Zend_Db是在PDO之后建模的,因此Zend_Db也支持两种参数样式.


jmb*_*cci 5

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

我建议开始在Zend_Db中使用Zend_Db_Select.我最近在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();
Run Code Online (Sandbox Code Playgroud)

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

如果要为表或参数使用别名,可以使用别名为索引值的关联数组:

# SELECT p.* FROM products AS p
$select->from('p' => 'products');
Run Code Online (Sandbox Code Playgroud)

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

# SELECT model FROM products
$select->from(products, array(model));
Run Code Online (Sandbox Code Playgroud)

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

SELECT 'products'.model FROM 'products'
Run Code Online (Sandbox Code Playgroud)

但为了简洁和清晰,我在上面写了上面的例子.

我刚遇到的一件事是在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);
Run Code Online (Sandbox Code Playgroud)

请注意,无论您使用以下哪个"where"函数,都将与前一个语句组合为该操作数.好吧,这听起来很混乱.

如果第二个"where"是"OR",则它将是"OR"条件.如果第二个"where"是"AND",则该语句将为"AND".

换句话说,第一个WHERE函数在它将使用的条件方面被忽略.

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

希望有所帮助!干杯!