Zend Framework 1.12 Db Select - 在条件中为问号使用多个值的嵌套WHERE

时间:2014-07-16 09:11:46

标签: php zend-framework zend-db-select

我正在使用Zend Frameworks 1.12.3。我需要创建一个嵌套WHERE的查询,例如

SELECT * FROM table1
WHERE (id = 'foo' AND name = 'bar') OR (grade = 123)

这是我的尝试

$this->getDbTable()->select()
->from($this->getDbTable(), array('*')
->where('id = ? AND name = ?', $foo, $bar)
->orWhere('grade = ?', $grade);

然而,结果是

SELECT * FROM table1
WHERE (id = 'foo' AND name = 'foo') OR (grade = 123)

而不是name = 'bar'

基本上,我不能使用多个?为每个?分配不同的值。你知道任何解决方案吗?

由于

LE:使用诸如->where("id = $foo and name = $bar")之类的WHERE条件确实有效,但它不会像?那样阻止注入攻击

2 个答案:

答案 0 :(得分:1)

查看代码,我认为无法做到这一点,where子句仅适用于条件,但我认为添加括号,您可以使用正确的优先级管理AND和OR。

试试这个:

this->getDbTable()->select()
    ->from($this->getDbTable(), array('*')
    ->where('(id = ?', $foo) // add '(' before condition
    ->where('name = ?)', $bar) // add ')' after condition
    ->orWhere('grade = ?', $grade);

答案 1 :(得分:1)

我会使用命名参数进行绑定,如下所示:

    $sql = $this->getDbTable()->select()
        ->from($this->_name, array('*'))
        ->where('id = :foo AND name = :bar')
        ->orWhere('grade = ?', 'grade');
    $this->getDbTable()->fetchAll($sql, array('foo' => 'foo', 'bar' => 'bar'));