2014-07-16 3 views
3

Zend Framework 1.12.3을 사용하고 있습니다. 여기하지만 내 시도Zend Framework 1.12 Db 선택 - 조건에서 물음표에 대해 여러 값을 사용하여 중첩 된 조건

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

의 같은

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

으로 나는 결과가

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

대신 기본적으로 name = 'bar'

이다, 중첩 된 알의를 가지고 쿼리를 작성해야 , 각각 ?을 할당 할 수는 없습니다. 각 번호는입니다.다른 값입니다. 어떤 해결책을 알고 있습니까?

감사

LE : 같은 ->where("id = $foo and name = $bar") 같은 WHERE 조건을 사용하는 일, 그러나 그것은 코드를 찾고 ? 않습니다

답변

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); 
+0

이것은 단지 예를했다, 나는 여러 중첩 된 알의있어. 나는 그것을 시험해 볼 것이다. – Daniel

1

난과 같이, 바인딩의 이름을 딴 PARAMS을 사용합니다 :

$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'));