theprogrammeur Posté 11 Août 2007 Partager Posté 11 Août 2007 Bonjour J'ai une erreur dans une requete et je ne parvient pas à la comprendre. Voici la requete: $query = "SELECT * FROM recherche WHERE titre,description,keywords LIKE '%$recherche%' ORDER BY id DESC"; Et voici l'erreur affichée: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'description,keywords LIKE '%php%' ORDER BY id DESC' at line 1 Merci d'avance; Lien vers le commentaire Partager sur d’autres sites More sharing options...
Anonymus Posté 11 Août 2007 Partager Posté 11 Août 2007 Tu devrais plutot mettre : $query = "SELECT * FROM recherche WHERE titre LIKE '%".$recherche."%' AND description LIKE '%".$recherche."%' AND keywords LIKE '%".$recherche."%' ORDER BY id DESC"; Lien vers le commentaire Partager sur d’autres sites More sharing options...
theprogrammeur Posté 11 Août 2007 Auteur Partager Posté 11 Août 2007 (modifié) Ca fonctionne , mais est-ce que ça n'alourdit pas la requête MySQL? Modifié 11 Août 2007 par theprogrammeur Lien vers le commentaire Partager sur d’autres sites More sharing options...
Anonymus Posté 11 Août 2007 Partager Posté 11 Août 2007 Ca permet de la faire marcher, surtout Lien vers le commentaire Partager sur d’autres sites More sharing options...
theprogrammeur Posté 11 Août 2007 Auteur Partager Posté 11 Août 2007 Encore des bugs MySQL dans ce script, un problème de mysql_num_rows(); $recherche est ce que l'utilisateur entre. Le else signifie s'il faut rechercher mot par mot dans la BDD. else{$mots = explode(" ", $recherche); //séparation des mots$nombre_mots = count ($mots); //compte le nombre de mots$valeur_requete = '';$nombre_mots_boucle = 0;while($nombre_mots_boucle < $nombre_mots){$valeur_requete .= ''.$and_or.'titre LIKE \'%'.$mots[$nombre_mots_boucle].'%\'AND description LIKE \'%'.$mots[$nombre_mots_boucle].'%\'AND keywords LIKE \'%'.$mots[$nombre_mots_boucle].'%\'';$nombre_mots_boucle++;}$valeur_requete = ltrim($valeur_requete, $and_or); //suppression de AND ou de OR au début de la boucle$selection_recherche = mysql_query("SELECT * FROM recherche WHERE '$valeur_requete' ORDER BY id DESC"); //requête avec le résultat de la boucle dedans}$nombre_resultats = mysql_num_rows($selection_recherche); Voici l'erreur qui s'affiche: Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in C:\wamp\www\recherche\recherche.php on line 80 Lien vers le commentaire Partager sur d’autres sites More sharing options...
TheRec Posté 11 Août 2007 Partager Posté 11 Août 2007 Lorsque tu es confronté à une telle erreur c'est parce que la fonction que tu as essayé d'utiliser pour traiter ta ressource MySQL (retournée par mysql_query en l'occurrence) n'a pas pu fonctionner. Ceci parce que comme le dit si bien l'erreur "supplied argument is not a valid MySQL result resource" (l'argument fourni n'est pas une ressource valide de résultats de MySQL). Donc ton problème vient de la requête SQL et pour connaître l'erreur qui a été générée par ton serveur MySQL, tu dois faire appel à la fonction mysql_error, comme ceci par exemple : echo mysql_errno().": ".mysql_error(); Ceci juste après avoir exécuté ta requête avec mysql_query Une fois l'erreur affichée tu pourras reformuler ta requête correctement. Un autre moyen et d'afficher ta requête une fois générée (après ta boucle) avec un simple echo et t'assurer que la syntaxe et la cohérence de ta requête soient correctes. Lien vers le commentaire Partager sur d’autres sites More sharing options...
theprogrammeur Posté 12 Août 2007 Auteur Partager Posté 12 Août 2007 Le problème vient de la fonction ltrim() qui ne retire pas le 'and' ou le 'or' au début de la requête. Je ne sais pas pourquoi il ne fonctionne pas. Si ca peut vous aider, je teste le script sous WAMP5 Lien vers le commentaire Partager sur d’autres sites More sharing options...
petit-ourson Posté 12 Août 2007 Partager Posté 12 Août 2007 Tu as bien initialisé la variable '$and_or' ?? Lien vers le commentaire Partager sur d’autres sites More sharing options...
theprogrammeur Posté 12 Août 2007 Auteur Partager Posté 12 Août 2007 Comme tu peux le voir dans ce bout de code, oui, elle a bien été intialisée! if(isset($_POST['rechercher'])){//calcul du temps avant la fonction pour être sûr que ça soit exact$execution = microtime();$execution = explode(' ',$execution);$execution_debut = $execution[1]+$execution[0];//fin du calcul du temps $recherche = mysql_real_escape_string(htmlspecialchars($_POST['recherche'])); $mode = mysql_real_escape_string(htmlspecialchars($_POST['mode']));if($mode == "tous_les_mots"){$and_ou_or = 'AND';}else{$and_ou_or = 'OR';}if($mode == "expression_exacte"){$query = "SELECT *FROM rechercheWHERE titre LIKE '%".$recherche."%'AND description LIKE '%".$recherche."%'AND keywords LIKE '%".$recherche."%'ORDER BY id DESC";$selection_recherche = mysql_query($query) or die(mysql_error());}else{$mots = explode(" ", $recherche); //séparation des mots$nombre_mots = count ($mots); //compte le nombre de mots$valeur_requete = '';$nombre_mots_boucle = 0;while($nombre_mots_boucle < $nombre_mots){$valeur_requete .= ' '.$and_ou_or.' titre LIKE \'%'.$mots[$nombre_mots_boucle].'%\'AND description LIKE \'%'.$mots[$nombre_mots_boucle].'%\'AND keywords LIKE \'%'.$mots[$nombre_mots_boucle].'%\'';$nombre_mots_boucle++;}$valeur_requete = ltrim($valeur_requete, $and_ou_or); //suppression de AND ou de OR au début de la boucle$sql = "SELECT * FROM recherche WHERE $valeur_requete ORDER BY id DESC";$selection_recherche = mysql_query($sql) or die(mysql_error()); //requête avec le résultat de la boucle dedans}$nombre_resultats = mysql_num_rows($selection_recherche); Lien vers le commentaire Partager sur d’autres sites More sharing options...
Anonymus Posté 12 Août 2007 Partager Posté 12 Août 2007 Comme tu le dis plus haut, ltrim n'enlève pas ton 'and_ou_or' du début de la requète. Fais un simple substr dessus, pour l'enlever Là > if($mode == "tous_les_mots"){ $and_ou_or = 'AND'; } else{ $and_ou_or = 'OR'; } Tu mets plutot : $and_ou_or = ' OR'; Ca te fait une variable qui fait toujours le même nombre de caractères ( 3 ). Avec ca, un coup de substr($query,3) suffit pour enlever la condition de départ. Une autre solution (il y en a pas mal, en fait.) est de mettre un compteur au début de ton while qui ajoute les conditions : $cpt=0; while( ajouteConditions){ $cpt++; if($cpt>1) $query .= $and_ou_or".$etc.. } Nicolas. Lien vers le commentaire Partager sur d’autres sites More sharing options...
theprogrammeur Posté 12 Août 2007 Auteur Partager Posté 12 Août 2007 J'ai du mettre 4 caractères et pas trois (encore un mystère de PHP), mais ça fonctionne. Merci beaucoup au hub Lien vers le commentaire Partager sur d’autres sites More sharing options...
TheRec Posté 12 Août 2007 Partager Posté 12 Août 2007 ltrim, rtrim ou trim ne sont pas faites pour supprimer un mot ou une suite de caractères, elles prennent une liste de caractères (ou un intervalle) comme paramètre optionnel et la traitent caractère par caractère et lorsqu'un caractère correspond à ce qui doit être supprimé elles suppriment tout ce qui vient respectivement avant, après ou les deux... Il y a un bon exemple de ce fonctionnement dans le manuel PHP. Aucun "mystère" concernant le 4, substr compte le nombre de caractères à "sauter" et non sa position par rapport au caractère 0. Lien vers le commentaire Partager sur d’autres sites More sharing options...
binarygirl Posté 12 Août 2007 Partager Posté 12 Août 2007 C'est peut-être peu hors sujet mais maintenant que votre pb est résolu vous pouvez envisager d'utiliser les fonctionnalités FULL TEXT de mySQL. Si votre db devient très grosse votre script risque d'être long... au moins veillez à bien indexer les champs sur lesquels vous faites des recherches Lien vers le commentaire Partager sur d’autres sites More sharing options...
theprogrammeur Posté 12 Août 2007 Auteur Partager Posté 12 Août 2007 C'est peut-être peu hors sujet mais maintenant que votre pb est résolu C'est pas grave, on peut toujours discuter pour s'instruire! vous pouvez envisager d'utiliser les fonctionnalités FULL TEXT de mySQL.Si votre db devient très grosse votre script risque d'être long... au moins veillez à bien indexer les champs sur lesquels vous faites des recherches J'ai pas très bien compris avec fulltext. Comment ça marche? De plus, comment fonctionne les clés MySQL? J'ai compris que ça pouvait accélérer les recherches dans la BDD, mais comment ça fonctionne? Lien vers le commentaire Partager sur d’autres sites More sharing options...
dimko Posté 27 Août 2010 Partager Posté 27 Août 2010 Hi to all. Sorry that this is in english, but I have even no idea how I found this forum and succeed to register Hope you'll have no problem with my english. So, this it the case: I have this code: $recherche = $searchsql; $mots = explode(' ', $recherche); //separation des mots de la recherche a chaque espace $nombre_mots = count ($mots); //compte le nombre de mots $valeur_requete = ''; for($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++) //tant que le nombre de mots de la recherche est superieur a celui de la boucle, on continue en augmentant la variable $nombre_mots_boucle de 1 a chaque fois { $valeur_requete .= 'AND a.adtitle RLIKE \'[[:<:]]' . $mots[$nombre_mots_boucle] . '[[:>:]]\''; //modification de la variable $valeur_requete $valeur_requete2 .= 'AND a.addesc RLIKE \'[[:<:]]' . $mots[$nombre_mots_boucle] . '[[:>:]]\''; //modification de la variable $valeur_requete } $valeur_requete = ltrim($valeur_requete,'AND'); //suppression de AND au debut de la boucle $valeur_requete2 = ltrim($valeur_requete2,'AND'); //suppression de AND au debut de la boucle $whereA[] = "(" . $valeur_requete . " OR " . $valeur_requete2 . ")"; So, what I want to do, is to merge a.adtitle and a.addesc and the code should look something like this: $recherche = $searchsql; $mots = explode(' ', $recherche); //separation des mots de la recherche a chaque espace $nombre_mots = count ($mots); //compte le nombre de mots $valeur_requete = ''; for($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++) //tant que le nombre de mots de la recherche est superieur a celui de la boucle, on continue en augmentant la variable $nombre_mots_boucle de 1 a chaque fois { $valeur_requete .= 'AND a.merged RLIKE \'[[:<:]]' . $mots[$nombre_mots_boucle] . '[[:>:]]\''; //modification de la variable $valeur_requete } $valeur_requete = ltrim($valeur_requete,'AND'); //suppression de AND au debut de la boucle $whereA[] = "(" . $valeur_requete . ")"; So, my point is that the search doesn't check first the Ad Title, and then the Ad Description, one by one, and sees them like a separate text, but I want to merge them, so the search should sees them as one whole text, which will contain the text from the Ad Title and the text from the Ad Description, as a whole. I'm trying to make the search function to search through Ad Title and Ad Descriptin at the same time, like it's one text, not separately like it's doing it with the first code. So, if anyone know how to make this, please post the solution here. P.S. I found the code googleing it on some other forum, and it works perfectly, exept the thing I asked for. So, tnx in advance, and sorry again for my english and if I post this in a wrong section. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant