2010-05-08 5 views
4

de Possible en double:
Grouping WHERE clauses with Zend_Db_Table_AbstractMultiple/imbriqué "sélectionnez l'emplacement où" avec Zend_Db_Select

Je dois créer quelque chose comme ceci:

select name from table where active = 1 AND (name LIKE 'bla' OR description LIKE 'bla') 

La première partie est facile :

$sqlcmd = $db->select() 
->from("table", "name") 
->where("active = ?", 1) 

Maintenant vient la partie délicate. Comment puis-je nicher? Je sais que je peux simplement écrire

->orWhere("name LIKE ? OR description LIKE ?", "bla") 

Mais ce n'est wron, parce que je dois changer de façon dynamique toutes les parties. La requête sera construite tout le temps que le script s'exécute. Certaines parties sont supprimées, d'autres modifiées. Dans cet exemple, j'ai besoin d'ajouter ces OR-s parce que parfois je dois chercher plus large. « Ma logique Zend » me dit qui est comme la bonne façon suivante:

$sqlcmd = $db->select() 
->from("table", "name") 
->where("active = ?", 1) 
->where(array(
    $db->select->where("name LIKE ?", "bla"), 
    $db->select->orWhere("description LIKE ?", "bla") 
)) 

Mais cela ne fonctionne pas (moins je ne me rappelle pas fonctionner).

Veuillez. Quelqu'un peut-il me aider à trouver un objet chemin orienté pour la nidification « où » -s

+0

J'ai eu le même problème. Voir la réponse à ma question ici: http://stackoverflow.com/questions/1179279/grouping-where-clauses-with-zend-db-table-abstract – Mark

Répondre

1

Voici un exemple du manuel ZF

// Build this query: 
    // SELECT product_id, product_name, price 
    // FROM "products" 
    // WHERE (price < 100.00 OR price > 500.00) 
    //  AND (product_name = 'Apple') 

    $minimumPrice = 100; 
    $maximumPrice = 500; 
    $prod = 'Apple'; 

    $select = $db->select() 
       ->from('products', 
         array('product_id', 'product_name', 'price')) 
       ->where("price < $minimumPrice OR price > $maximumPrice") 
       ->where('product_name = ?', $prod); 

Il devrait répondre à vos besoins

+5

Cet exemple n'empêche pas l'injection SQL comme le remplacement '?' Est-ce que. Je ne sais pas pourquoi c'est même dans le manuel. – Sonny

+0

Eh bien, je crois que le manuel essaie de montrer qu'il est possible de construire la requête même sans le '?'. Mais je suis d'accord, les développeurs non expérimentés pourraient écrire du code qui n'est pas sûr. –

-3

Pour construire cette requête :

SELECT product_id, product_name, price FROM "products" WHERE (price > 100.00) AND (price < 500.00)

utilisent ce code:

$minimumPrice = 100; 
$maximumPrice = 500; 

$select = $db->select() 
      ->from('products', 
        array('product_id', 'product_name', 'price')) 
      ->where('price > ?', $minimumPrice) 
      ->where('price < ?', $maximumPrice); 
+2

Cette réponse est incorrecte car elle ne montre pas comment combiner certaines expressions par OR entouré de parenthèses. –

Questions connexes