Aller au contenu

Sujets conseillés

Posté

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;

Posté

Tu devrais plutot mettre :

$query = "
SELECT *
FROM recherche
WHERE titre LIKE '%".$recherche."%'
AND description LIKE '%".$recherche."%'
AND keywords LIKE '%".$recherche."%'
ORDER BY id DESC
";

Posté

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
Posté

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.

Posté

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

Posté

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 recherche
WHERE 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);

Posté

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.

Posté

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.

Posté

C'est peut-être peu hors sujet :hypocrite: mais maintenant que votre pb est résolu :1eye:

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 :smartass:

Posté
C'est peut-être peu hors sujet :hypocrite: mais maintenant que votre pb est résolu :1eye:

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 :smartass:

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?

  • 3 years later...
Posté

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.

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...