2014-07-16 5 views
3

J'utilise Zend Frameworks 1.12.3. Je dois créer une requête qui a obtenu oùS imbriqués, commeZend Framework 1.12 Db Select - imbriqués WHEREs utilisant plusieurs valeurs pour les points d'interrogation en condition

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

Voici ma tentative

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

Cependant, le résultat est

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

au lieu de name = 'bar'

Fondamentalement , Je ne peux pas utiliser plusieurs ? s affectant chaque ? une valeur différente. Connaissez-vous une solution?

Merci

LE: en utilisant une condition WHERE telle que ->where("id = $foo and name = $bar") fonctionne, mais il ne l'empêche pas d'attaques d'injection comme le ? ne

Répondre

1

En regardant le code, je ne vois aucun moyen de le faire, la clause where ne fonctionne qu'avec une condition, mais je pense qu'en ajoutant des parenthèses, vous pouvez gérer les AND et OR avec les bonnes priorités.

Essayez ceci:

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

C'était seulement un exemple, j'ai plusieurs oùS imbriqué. Je vais essayer cependant. – Daniel

1

J'utiliseraient params nommés pour la liaison, comme ceci:

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