2012-12-14 3 views
0

Possible en double:
PDO with “WHERE… IN” queriesCréer un formulaire de recherche utilisant PDO

Dans mon formulaire de recherche, il y a beaucoup de cases à cocher et les champs.
Certaines cases appartiennent au groupe.
Exemple de groupe, ville.
requête comme les suivantes

SELECT id, city_id, area, city FROM an_objects 
       WHERE livedays > 0 AND type_id = :typeoffer AND rubric_id = :typerelaty 
       AND CASE 
        WHEN :1r = '' THEN true 
        ELSE city_id IN (:1r, :2r, :99r, :100r) 
       END 
       GROUP BY id ORDER BY date ASC 

Dans cet exemple, la nécessité de remplir 4 paramètres, ou une centaine.
Mais je veux faire

SELECT id, city_id, area, city FROM an_objects 
      WHERE livedays > 0 AND type_id = :typeoffer AND rubric_id = :typerelaty 
      AND CASE 
       WHEN :1r = '' THEN true 
       ELSE city_id IN (:arrCity) 
      END 
      GROUP BY id ORDER BY date ASC 

cordes forment ce

if(isset($param['city'])) 
{ 
    for($i=0; $i < 9; $i++) 
    { 
     if(isset($param['city'][$i])) 
      $raion .= $param['city'][$i] . ","; 
     else 
      break; 
    } 
    $arrCity = substr($city, 0, -1);   
} 

Nous avons les éléments suivants
(: arrCity) substitué ("1,2,3,4,5,6 "). Ceci est obtenu en une seule chaîne, mais comment effectuer les opérations suivantes
(: arrCity) (1,2,3,4,5,6)

+0

Bien sûr, ce n'est pas un doublon, mais qui s'en soucie ... –

Répondre

1

C'est une question intéressante, qui a clairement démontre le fait que PDO s'avère être plus difficile à utiliser que le vieux mysql_ * et ne fournit pas une bonne sécurité pour le large éventail de requêtes réelles.

Pour rendre ces tâches plus faciles, une bibliothèque d'accès de base de données devrait permettre à 2 choses importantes:

  • espaces réservés supplémentaires pour les types de données complexes à traiter en interne.
  • espaces réservés processus dans la partie de la requête, pas dans arbitraire toute requête ne

et AOP échoue avec les deux. Donc, un programmeur doit prendre soin d'eux-mêmes.

Ainsi, en utilisant une bibliothèque qui implémente ces principes, le code sera court et en toute sécurité:

if(isset($param['city'])) 
{ 
    $raion = $db->parse("AND (city_id IN (?a)", $param['city']); 
} 
// you can add any number of such conditions making your search flexible 
// the only thing you have to keep in mind: add a value ONLY via placeholder 

$sql = "SELECT id, city_id, area, city FROM an_objects 
     WHERE livedays > 0 AND type_id = ?i AND rubric_id = ?i 
     ?p 
     GROUP BY id ORDER BY date ASC"; 
$data = $db->getAll($sql, $typeoffer, $typerelaty, $raion); 

Oui, ces quelques lignes de code lisible et concize!

Si j'ai mal compris vos conditions - n'hésitez pas à demander plus de détails, en fournissant la logique exacte de la construction de votre requête. Je serai heureux d'écrire le code exact selon vos conditions, juste pour démontrer la puissance de la bibliothèque dont je parle.

+0

Vous me comprenez correctement. Mais c'est la bibliothèque personnellement votre? En tout cas, merci! tu m'as donné l'idée intéressante. – Vayas

+0

Il est écrit par moi, mais il est libre d'utiliser pour tout le monde. Vous pouvez trouver le lien dans mon userinfo. Ou vous êtes invités à utiliser toutes les idées que vous trouvez utiles. –

+0

Merci. Une bonne chose est qu'il y a des passionnés comme vous. Des créations uniques, prêtes à donner gratuitement, pour quoi la programmation mondiale aurait été meilleure.Merci de m'avoir écrit. J'utilise déjà votre bibliothèque, et réduit de plus de 300 lignes de code dans mon application)) – Vayas

Questions connexes