Problème de requêtes [TITRE MODERE CAR PEU EXPLICITE]
cs_skiso
Messages postés103Date d'inscriptiondimanche 19 janvier 2003StatutMembreDernière intervention19 septembre 2010
-
4 janv. 2006 à 17:00
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 2010
-
10 janv. 2006 à 14:59
j'ai concu un site pour une agence immobiliere,
en cherchant un bien sur ma base de donnee en multi-critere. je fait ce qui suit :
j'ai un formulaire de plusieur champ, ce sont les critere de recherche :
type de bien : (appartement ou villa ou ....)
lieu : (paris ou lion ou ....)
prix minimal : 1 ou 2 ...
prix maximal : 9999999 ou 9999999999
suprefacie : 100m ou 200m ou ....
le problem que j'ai et quant un champ est vide.
alors je cherche en testant tout les champ :
si le champ type est remplee et lieu et prix min et prix max et superfacie son vide
alors je accede a la requete qui chere que le champ type
et
si le champ lieu est remplee et type et prix min et prix max et superfacie son vide
alors je accede a la requete qui chere que le champ lieu
je fait ces test et ca fait des enormes ligne de code.
je veux savoir svp es que cette methode est exacte ou il y a une methode oplimal qui peut m'eviter toutes ces lignes de code.
merci .
A voir également:
Problème de requêtes [TITRE MODERE CAR PEU EXPLICITE]
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 4 janv. 2006 à 17:10
Hello,
le mieux aurait été de faire une fonction.
Tu mets tes champs à value="null" par défaut.
A la soumission, tu appelles la fonction qui crée la requête, en lui passant en paramètre tes différents $_POST.
Dans ta fonction, tu construits tes clauses WHERE (et éventuellement FROM) en fonction de la valeur des post.
Exemple à prendre avec des pincettes parce que c'est la copie de la méthode d'une des classes de mon projet actuel...C'est donc juste pour l'exemple :
function getList($comtId null, $entId null, $contId = null, $artId = null)
{
$whereClauseArr = array ();
if ($comtId !== null) {
$whereClauseArr[] = ' AND (sk.comt_id = '.$comtId.')';
}
if ($entId !== null) {
$whereClauseArr[] = ' AND (sk.ent_id = '.$entId.')';
}
if ($contId !== null) {
$whereClauseArr[] = ' AND (sk.cont_id = '.$contId.')';
}
if ($artId !== null) {
$whereClauseArr[] = ' AND (sk.art_id = '.$artId.')';
}
$sQuery = 'SELECT
sk.sk_id, rg.rg_libelle, zone.zone_libelle, etg.etg_libelle
FROM
stocks sk, sk_rangees rg, sk_zones zone, sk_etages etg
WHERE
(sk.rg_id = rg.rg_id) AND
(sk.zone_id = zone.zone_id) AND
(sk.etg_id = etg.etg_id)
';
foreach ($whereClauseArr as $qry) {
$sQuery .= $qry;
}
$sQuery .= ' ORDER BY
sk.rg_id, sk.zone_id, sk.etg_id';
$aTmp = array();
$this->oDB->query($sQuery);
----, mini </TD>
maxi
</TD></TR>
<TR>
<TD>Prix : </TD>
<TD>
mini ,
maxi
</TD></TR>
<TR>
<TD colSpan=2>
</TD></TR></TBODY></TABLE>
svp c tu veut me rendre service, par ce que je suis debutant en php et en sql
peut tu traduire ce que tu a ecrit au par avant (en haut) sur ce formulaire.
le nom des champ de haut en bas :
- type
- ville
- nbr pieces
- surfmin
- surrmax
- prixmin
- prixmax
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 9 janv. 2006 à 14:09
Juste pour toi Malalam au passage :)
"if ($comtId !null) {" Que c'est bien mocheuh :) En plus, tu ne testes même pas le type de ta variable si c'est différent de NULL ! Bon, j'en déduis que c'est tout sauf un objet, une ressource, ou alors un type NULL... donc de ce fait, pour tester une bonne fois pour toute> is_scalar() !
Donc : if ( is_scalar($comtId) ) { ... }
etc... Au moins comme ca, tu es assuré au pire :)
Pareil, pourquoi avoir fait ca sous forme de tableau pour tes requètes avec AND ?
$query_ext = '';
if ( is_scalar($comtId) ) { $query_ext .'AND (sk.comt_id '.$comtId.')';
}
// etc...
// et à la fin :
if ( !empty($query_ext) ) $sQuery .= $query_ext;
Voila, c'est qu'un conseil que je te donne, mais si c'est plus rapide ta facon, pourquoi pas :)
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 9 janv. 2006 à 14:19
FhX => disons qu'on est 2 à bosser là-dessus, et que je dois m'adapter... ;-)
le getList est appelé explicitement, à partir de valeurs connues; le but est simplement de dire : si on passe NULL, on ne fait rien. Sinon, c'est qu'on a passé un entier (c'est epxlicite, comme je te l'ai dit, on sait ce qu'on aura toujours : un entier).
Maintenant, oui, is_scalar () est plus joli :-)
Quant au tableau, je ne défends pas : mes portions de code étaient avec une bête concaténation, en effet. Mais comme mon collègue a plus de mal à s'adapter à mon code, que moi au sien, j'ai laissé tomber et j'ai calqué son mode de fonctionnement.
Bref, non, je ne pense pas que ce soit plus rapide, bien au contraire.
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 9 janv. 2006 à 20:25
oh quand même !! Sinon tu lui dis à quoi ca sert en commentaire :)
Par contre dis moi, si tu ne passes aucun argument dans ta méthode, quand tu fais un foreach, t'as pas une erreur du fait que ton tableau peut être vide ?
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 9 janv. 2006 à 20:26
Enfin moi je te dis ca comme ca, étant donnée que c'est une classe, et qu'une classe peut se faire hériter très vite, autant la faire la plus générique possible, et surtout la plus strict au niveau des valeurs qui viennent et qui repartent des méthodes :)
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 10 janv. 2006 à 09:11
Elle hérite déjà, en fait, d'une classe générique.
Mais bon, j'ai pas dit que j'appréciais cette façon de coder lol...seulement moi je suis ingénieur de dév, responsable de dév, certes, mais lui est le responsable informatique et code parce qu'il adore ça. Donc bon...