furious Gontran Posté 4 Janvier 2005 Posté 4 Janvier 2005 (modifié) Desolé pour une question aussi bete... C'est possible les requetes de type: SELECT * FROM Table1, Table2, Table3 WHERE Id, Titre, Resume LIKE.... Pour faire des requetes sur plusieurs colonnes de plusieurs tables ?? -------------- Autre question: J'ais trouvé ca sur le net: for ($i=0;$i=<(sizeof($Mot);$i++) { if ($Mot[$i]!="") { $exp=$Mot[$i]; $Where.="AND(Titre LIKE '%$exp%' OR Resume LIKE '%$exp%')"; } } //////////////Requete $requete= "SELECT * FROM Zoom, Traverse, Chroniques WHERE 1 $Where"; Ceque je ne comprend pas c'est le WHERE 1 AND... Que ca donne par la suite. A quoi sers ce 1 ?? Ce code marcherait il d'apres vous ? Modifié 4 Janvier 2005 par furious Gontran
Anonymus Posté 4 Janvier 2005 Posté 4 Janvier 2005 pour la question 1, je comprend pas trop, pour la 2, c'est souvent la méthode que j'utilise. Elle permet de travailler avec un $where vide ou non. Ce '1' sert à pouvoir mettre le WHERE. Si tu as plusieurs conditions, par exemple, tu peux avoir : $requete = "WHERE 1 " pour chaque condition $requete .=" AND condition"; ainsi, s'il n'y a pas de condition, ca marche. S'il y en a plusieurs, ca marche aussi. Juste une précision. Prend l'habitude de travailler avec foreach au lieu de for. C'est une erreur de travailler avec for.
furious Gontran Posté 4 Janvier 2005 Auteur Posté 4 Janvier 2005 Pour la question 1: Je veux que le SELECT * FROM s'effetue sur plusieurs table est ce que je peut les mettre a la suite en les separant par une virgule ? Je sais que c'est possible pour les champs... Pour la 2: Merci Ca va me faciliter la vie le WHERE 1 Et pour le foreach, promis j'm'y met.
MarvinLeRouge Posté 4 Janvier 2005 Posté 4 Janvier 2005 Salut Gontran, SELECT * FROM table1, table2, table3 ça marche. Tu risques seulement d'avoir des problèmes à la récupération des données si tu as des colonnes avec le même nom dans 2 tables. Autre chose : fais attention avec cette méthode : tu risques de ramasser des tonnes de données inutiles donc de ralentir ton script pour rien. Pense à optimiser ta requète (même si c'est facile de faire ça pendant les tests )
Compte supprimé Posté 4 Janvier 2005 Posté 4 Janvier 2005 Généralement on fait : SELECT table1.champ1,table2.champ2 FROM table1,table2 WHERE table1.champ3,table2.champ4 comme ça - tu peux avoir les mêmes nom de champs sur différentes tables - tu limites le nombre de réponses aux champs qui t'interessent -
smile Posté 5 Janvier 2005 Posté 5 Janvier 2005 Juste une précision. Prend l'habitude de travailler avec foreach au lieu de for. C'est une erreur de travailler avec for. <{POST_SNAPBACK}> En quoi c'est une erreur une boucle for ? C'est une instruction Simple et rapide, c'est ma préferé. Quand à foreach c'est une instruction de contrôle, donc on peut pas opposer ces deux instructions
Anonymus Posté 5 Janvier 2005 Posté 5 Janvier 2005 Ce n'est pas une erreur, ca peut être utile, mais dans ce cas ci, on se trouve devant le cas suivant : for ($i=0;$i=<(sizeof($Mot);$i++){ if ($Mot[$i]!="") On parcours tous les éléments de $Mot, sans savoir précisément s'ils existent ou pas. Dans cette discussion : http://www.webmaster-hub.com/index.php?showtopic=8402 il est dit à Gontran de détruire les variables vides (ce qui, à mon avis, peut créer des erreurs, si l'on ne maitrise pas ce que l'on fait). Et dans cette discussion, on le laisse travailler avec un tableau, et sa taille d'index pour le parcourir. C'est soi l'une, soit l'autre méthode, mais pas les 2 ensemble. On peut facilement créer des erreurs en parcourant des tableaux avec un 'for..sizeof alors que ce n'est pas possible avec un foreach. De plus, les foreach sont également faits pour parcourir des tableaux ayant des index non numeriques. (et tant que j'y suis) : Pour tester la ligne : $Where.="AND(Titre LIKE '%$exp%' OR Resume LIKE '%$exp%')"; essaies en entrant juste une lettre dans le champ de recherche (puisque ca parait destiné à un champ de recherche). Essaies avec juste une voyelle. Ca devrait te renvoyer toutes les lignes (enfin.. presque.). Ce qui n'est pas forcément ce que tu cherches Nico.
furious Gontran Posté 5 Janvier 2005 Auteur Posté 5 Janvier 2005 SELECT table1.champ1,table2.champ2 FROM table1,table2 WHERE table1.champ3,table2.champ4 Et pour rapeller mes données vous me conseillez mysql_fetch_objet() ou mysql_fetch_array() ?? Avec un objet il faut que je fasse: $objet= mysql_fetch_objet($resultatdelarequete) $camp=$objet->table1.champ1; ??????? Pour la recherche avec juste une voyelle, je suis en train de faire un script de verification pour que l'utilisateur entre des trucs coherents.
Compte supprimé Posté 5 Janvier 2005 Posté 5 Janvier 2005 (modifié) mysql_fetch_row() while ($row= mysql_fetch_row($resultatdelarequete)){$champ=$row[idduchampdanslarequete];...} Modifié 5 Janvier 2005 par jeroen
MarvinLeRouge Posté 5 Janvier 2005 Posté 5 Janvier 2005 On peut facilement créer des erreurs en parcourant des tableaux avec un 'for..sizeof alors que ce n'est pas possible avec un foreach. Quel type d'erreur stp ? La fonction sizeof étant ré-évaluée à chaque tour de boucle, je ne vois pas trop en quoi elle pourrait poser problème. En revanche, je me demande si, dans un cas pareil, on n'aurait pas le même risque avec for et foreach, à savoir oublier de traiter l'élément n+1 quand on a supprimé l'élément n. Avec un for, on le saute puisqu'il se retrouve décalé (à moins de penser à recaler l'index avec un $i-- juste après l'effacement). J'ignore s'il en est de même avec un foreach.
Anonymus Posté 5 Janvier 2005 Posté 5 Janvier 2005 Premier exemple : $array['nom']="machin"; $array['prenom']="truc"; On est obligé de passer par un 'foreach' pour dépiler le tableau. On ne peut le faire avec un for..sizeof, puisque l'index n'est pas numérique. Second exemple : $array[0]="machin"; $array[1]="truc"; $array[2]="bidule"; unset($array['1']); Sans autre opération de remise en ordre de l'index, le foreach marche, pas le for..sizeof.
furious Gontran Posté 5 Janvier 2005 Auteur Posté 5 Janvier 2005 probleme de foreach: Comment on fais pour remplacer une valeur dans un foreach ?? J'ai testé: foreach($Mot as $value) { $value= ereg_replace("é", "\(é|e)", $value); $value= ereg_replace("è", "\(è|e)", $value); $value= ereg_replace("ê", "\(ê|e)", $value); $value= ereg_replace("ë", "\(ë|e)", $value); $value= ereg_replace("ç", "\(ç|c)", $value); $value= ereg_replace("ù", "\(ù|u)", $value); $value= ereg_replace("ï", "\(ï|i)", $value); } Mais ca n'as servi a rien, ca ne marche pas... Comment faire sans utiliser d'index ?
Anonymus Posté 5 Janvier 2005 Posté 5 Janvier 2005 Je verrais bien comme ceci : $a_chercher=array("é","è");$a_remplacer=array("e","e");foreach($Mot as $key=>$value) $Mot[$key]=str_replace($a_chercher,$a_remplacer,$value);
furious Gontran Posté 6 Janvier 2005 Auteur Posté 6 Janvier 2005 (modifié) J'ais vu pour les foreach, c'est vrai que c'est plus pratique... Mais probleme. Cette requete: SELECT * FROM chroniques WHERE 1 OR (Titre LIKE '%batman%' OR Resume LIKE '%batman%') OR (Titre LIKE '%manga%' OR Resume LIKE '%manga%') OR (Titre LIKE '%carnaval%' OR Resume LIKE '%carnaval%') OR (Titre LIKE '%%' OR Resume LIKE '%%') LIMIT 0,20 Generée avec ca: $Where .=" OR (Titre LIKE '%$Mot[$i]%' OR Resume LIKE '%$Mot[$i]%')"; $requete="SELECT * FROM chroniques WHERE 1 ". $Where." LIMIT $position,$fin"; Me sors toutes les entrées dans ma base au lieu de me sortir les trois articles dont les nom contiennent les mots clefs. Alors que cette requete: SELECT * FROM chroniques WHERE 1 AND (Titre LIKE '%manga%' OR Resume LIKE '%manga%')AND (Titre LIKE '%batman%' OR Resume LIKE '%batman%') LIMIT 0,20 if ($Type=="Tous les mots") { foreach ($Mot as $value) { $Where .="AND (Titre LIKE '%".$value."%' OR Resume LIKE '%".$value."%')"; } }else if ($Type=="Au moins un mot") { foreach ($Mot as $value) { $Where .="OR (Titre LIKE '%".$value."%' OR Resume LIKE '%".$value."%')"; } }else if ($Type=="Expression exactes") { foreach ($Mot as $value) { $Where .="AND (Titre LIKE '%".$value."%' OR Resume LIKE '%".$value."%')"; } } He la ben je vois pas trop Modifié 6 Janvier 2005 par furious Gontran
Anonymus Posté 6 Janvier 2005 Posté 6 Janvier 2005 En fait, il faut faire : SELECT * FROM chroniques WHERE 1 AND ( (test1) OR (test2) ) Regardes bien le AND et les parenthèses qui entourent les conditions.
furious Gontran Posté 6 Janvier 2005 Auteur Posté 6 Janvier 2005 C'est pareil pour OR ? Parceque cette requete me sors toute ma table: SELECT * FROM chroniques WHERE 1 OR((Titre LIKE '%batman%') OR (Resume LIKE '%batman%'))OR((Titre LIKE '%%') OR (Resume LIKE '%%')) LIMIT 0,20
Anonymus Posté 6 Janvier 2005 Posté 6 Janvier 2005 Non, ce n'est pas pareil. Dans le cas du '1', il va demander : - que ce soit 'VRAI' (le '1' dans ce cas signifie 'TRUE') ET - qu'il y ait les mots. Donc, la première condition s'annule, il reste la seconde, autrement dit, qu'il y ait des mots. Dans le cas du 'OR', il va chercher : - que ce soit 'VRAI' (le '1' dans ce cas signifie 'TRUE') Ou - qu'il y ait les mots. Et des 2, il va prendre la plus facile, la plus large. Donc, si un champ est 'VRAI', il le renvoie. Le problème, c'est que tous les champs qui existent sont toujours VRAI, c'est un non sens. Donc, il te renvoie tous les champs. Des 2, il faut mettre le AND.
furious Gontran Posté 6 Janvier 2005 Auteur Posté 6 Janvier 2005 Merci j'ais compris !! (J'y ais mis du temps, mais bon...)
manito Posté 6 Janvier 2005 Posté 6 Janvier 2005 (modifié) Salut a tous Juste une petite question sans rentrer dans une polemique, a vrai dire je debute. C'est juste par rapport au message : (qui commence un peu a dater mais bon) Premier exemple :$array['nom']="machin"; $array['prenom']="truc"; On est obligé de passer par un 'foreach' pour dépiler le tableau. On ne peut le faire avec un for..sizeof, puisque l'index n'est pas numérique. Second exemple : $array[0]="machin"; $array[1]="truc"; $array[2]="bidule"; unset($array['1']); Sans autre opération de remise en ordre de l'index, le foreach marche, pas le for..sizeof. <{POST_SNAPBACK}> Voila c'est beaucoup plus long et surement moins efficace mais par rapport au 1er example , (en concidérant un nombre limités de d'entréés dans la var tab et une réutilisation dans plusieurs autres boucles for ) On pourrait utiliser la boucle for de cette maniére Ex: "Premier exemple :"$cle_v = array("nom","prenom");$resu_t = array("machin","truc");$tp ="";for($i=0;$i<2;$i++){//for$tp = $cle_v[$i];if($array[$tp]=$resu_t [$i]){echo"ok";}if($array[$tp]=$resu_t [$i]){echo"ok";}}//for Je veux juste savoir si c'est une methode acceptable. Merci @+ Modifié 6 Janvier 2005 par manito
furious Gontran Posté 6 Janvier 2005 Auteur Posté 6 Janvier 2005 Pfffffff La, ca deviens gonflant... SELECT * FROM chroniques WHERE chroniques.Titre LIKE '%batman%' OR chroniques.Resume LIKE '%batman%'OR chroniques.Titre LIKE '%manga%' OR chroniques.Resume LIKE '%manga%'OR chroniques.Titre LIKE '%carnaval%' OR chroniques.Resume LIKE '%carnaval%' LIMIT 0,20 Marche, ca me donne 3 resultats. Mais SELECT * FROM chroniques, zoom WHERE chroniques.Titre LIKE '%batman%' OR chroniques.Resume LIKE '%batman%' OR zoom.Titre LIKE '%batman%' OR zoom.Resume LIKE '%batman%'OR chroniques.Titre LIKE '%manga%' OR chroniques.Resume LIKE '%manga%'OR zoom.Titre LIKE '%manga%' OR zoom.Resume LIKE '%manga%'OR chroniques.Titre LIKE '%carnaval%' OR chroniques.Resume LIKE '%carnaval%'OR zoom.Titre LIKE '%carnaval%' OR zoom.Resume LIKE '%carnaval%' LIMIT 0,20 Me dis qu'il n'ya aucuns resultats !!
Anonymus Posté 6 Janvier 2005 Posté 6 Janvier 2005 Essaies avec Super man Non, sérieux : Me dis qu'il n'ya aucuns resultats !! Aucun résultat, ou la requète n'est pas bonne ? Autrement dit, si ca se trouve, ca te renvoie une erreur, mais ca ne te l'affiche pas, et donc tu as l'impression que ca ne te renvoie aucun résultat, alors que la requète n'est tout simplement pas bonne
furious Gontran Posté 6 Janvier 2005 Auteur Posté 6 Janvier 2005 (modifié) Non, pourtant, Le script qui execute les requetes me renvois toujours un message en cas d'erreur. D'ou mon incomprehension. Le script: if ($resultat) return $resultat; else { echo "<B>Erreur dans l'execution de la requete $requete.</B><BR>"; echo "<b>Message MySQL:</b>" .mysql_error($connexion); exit; } Modifié 6 Janvier 2005 par furious Gontran
Anonymus Posté 6 Janvier 2005 Posté 6 Janvier 2005 Pourtant, si tu as fait un 'copier/coller' de la requète, il serait étonnant qu'elle marche. Il manque pas mal d'espaces, avant les OR, par exemple là : LIKE '%manga%'OR chroniques.Titre
furious Gontran Posté 6 Janvier 2005 Auteur Posté 6 Janvier 2005 (modifié) SELECT * FROM chroniques, zoom WHERE chroniques.Titre LIKE '%batman%' OR chroniques.Resume LIKE '%batman%' OR zoom.Titre LIKE '%batman%' OR zoom.Resume LIKE '%batman%' LIMIT 0,20 Voici la requete avec les espaces, le resultat est le meme... Mon code affichant les erreurs n'est pas bon ou je dois ca a Murphy ?? Si je fais la meme requete avec seulement FROM chroniques ca marche bien... ...Comprend pas... Modifié 6 Janvier 2005 par furious Gontran
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant