Bon je vous explique!
Je fait une requete pour un moteur de recherche multi-critere et sa plante !
Mon probléme est que je n'arrive pas à generer une requete correct en SQL, voila ce que je genere :
SELECT count(*) from vivacances where TITLE like ''%sejour%' or TITLE like '%hotel%' or TITLE like '%maroc%'' order by PRIX ASC ;
erreur d'interrogation de la base, Unknown column 'sejour' in 'where clause'
Vous comprennez je pense ce que je voulais avoir au final !!!
Voila le code light :
Mon formulaire est en GET, je recup bien les variables, le seul pb est la génération de ma requete !!!
La variable mot contient l'ensemble des mots clé recherchés
$mot=strtolower($_GET['mot']);
$mots=split(" ",$mot);
$nombre_mots=count($mots);
$z=1;
$texte="Pages contenant "$mots[0]"";
$phrase="'%$mots[0]%'";
while($z<$nombre_mots)
{
$phrase.=" ".$et_ou." TITLE like '%$mots[$z]%'";
$texte.=" ";
if($et_ou=="and"){$texte.="et";}else{$texte.="ou";}
$texte.=" "$mots[$z]"";
$z++;
}
$requete='SELECT count(*) from vivacances where TITLE like \''.$phrase.'\' order by PRIX ASC ;';
$req = mysql_query($requete) or die ("erreur d'interrogation de la base, ".mysql_error());
$nb_total=mysql_result($requete,0,"count(*)");
Voila donc c'est un pb de ' et de " je pense mais ou !!!!!
Merci à tous de me corriger mon erreur.
# guillement
Posté par Hardy Damien . Évalué à 3.
> ... ''%sejour ...<
Dam
[^] # Re: guillement
Posté par nicodache . Évalué à 2.
SELECT count(*) FROM vivacances WHERE (title LIKE '%sejour%') OR (title like '%hotel%') OR (title like '%maroc%') ORDER BY prix ASC ;
(autre chose, c'est quoi cette table qui contient une colonne titre de différent type ?
la colonne title peut contenir un type de séjour, un type de logement ou un pays ?!)
[^] # Re: guillement
Posté par roule007 . Évalué à 1.
Ce n'est pas la requete SQL qui me pose pb mais la façon en php de pouvoir la génerer avec mes variables !
Donc le rendu que je veux c bien :
SELECT count(*) FROM vivacances WHERE (title LIKE '%sejour%') OR (title like '%hotel%') OR (title like '%maroc%') ORDER BY prix ASC ;
Mais ce qui me pose un vrai pb c de génerer cette requete en php avec l'intégration de mes varaibles !
[^] # Re: guillement
Posté par nicodache . Évalué à 2.
[^] # Re: guillement
Posté par roule007 . Évalué à 1.
print_r($mots) donne : Array ( [0] => maroc )
Et avec maroc et hotel comme mot clé :
print_r($mots) donne : Array ( [0] => maroc [1] => hotel )
Voili ...
[^] # Re: guillement
Posté par nicodache . Évalué à 2.
si tu as maroc et hotel, tu veux arriver à un ruc du genre
$requete = "select * from tatable where (title like '%maroc%') or (title like '%hotel%')";
c'est bien ca ?
[^] # Re: guillement
Posté par roule007 . Évalué à 1.
maroc hotel séjour safari..... et bien d'autres encores.
D'ou l'interet d'une requete crée dynamiquement !
[^] # Re: guillement
Posté par nicodache . Évalué à 2.
[^] # Re: guillement
Posté par roule007 . Évalué à 1.
Mais bon dans tous les cas, je ne pense pas que se soit elle qui crée des pb...
[^] # Re: guillement
Posté par Gyro Gearllose . Évalué à 2.
Je procède ainsi dans ce genre de cas, mais je suis avec postgreSQL, je ne sais pas si ç fonctionnera avec mysql :
$requete = sprintf ("select count(*) from vivacances where title in ('%%%s%%') order by prix asc;", implode ("%', '%", $mots));
Voilà, en espérant que ça aide, comme on dit !
[^] # Re: guillement
Posté par roule007 . Évalué à 1.
Dans ma requete ce n'est pas un guillemet (") mais deux cotes(' ')
Et si j'en enleve un sa ne marche pas !
A L'AIDE !
[^] # Re: guillement
Posté par Jllc . Évalué à 2.
http://www.nexen.net/docs/php/annotee/language.types.string.syntax.(...)
Contrairement aux autres syntaxes, les variables présentes dans la chaîne ne seront PAS remplacées par leurs valeurs.
http://www.nexen.net/docs/php/annotee/language.types.string.syntax.(...)
Le plus important pour les chaînes à guillemets doubles est le fait que les variables qui s'y trouvent seront remplacées par leur valeur.
Tu dois donc écrire ta chaîne $requete comme ceci :
$requete = "SELECT count(*) from vivacances where TITLE like \'".$phrase."\' order by PRIX ASC ;";
Qui devrait faire la chaîne suivante :
"SELECT count(*) from vivacances where TITLE like 'contenu-de-la-variable-phrase' order by PRIX ASC ;"
[^] # Re: guillement
Posté par roule007 . Évalué à 1.
$requete="SELECT count(*) from vivacances where TITLE like \'".$phrase."\' order by PRIX ASC ;";
Résultat des courses :
SELECT count(*) from vivacances where TITLE like \''%maroc%'\' order by PRIX ASC ;erreur d'interrogation de la base, You have an error in your SQL syntax near '\''%maroc%'\' order by PRIX ASC ' at line 1
Je craque !!!!!!!!
[^] # Re: guillement
Posté par Gyro Gearllose . Évalué à 2.
$requete=sprintf ("SELECT count(*) from vivacances where TITLE like '%%%s%%' order by PRIX ASC ;", $phrase);
Ou ça :
$requete="SELECT count(*) from vivacances where TITLE like '{$phrase}' order by PRIX ASC ;";
Je trouve cette dernière moins élégante, mais bon, c'est une question de goûts !
[^] # Re: guillement
Posté par roule007 . Évalué à 1.
SELECT count(*) from vivacances where TITLE like '%'%maroc%' or TITLE like '%hotel%'%' order by PRIX ASC ;erreur d'interrogation de la base, Unknown column 'maroc' in 'where clause'
La deuxiéme donne :
SELECT count(*) from vivacances where TITLE like ''%maroc%' or TITLE like '%hotel%'' order by PRIX ASC ;erreur d'interrogation de la base, Unknown column 'maroc' in 'where clause'
La deuxiéme me donne l'impression de ne pas être loin mais bon...
[^] # Re: guillement
Posté par nicodache . Évalué à 2.
[^] # Re: guillement
Posté par roule007 . Évalué à 1.
Parse error: parse error, unexpected '%' in /home/publicid/sd/julien/moteur.php on line 44
[^] # Re: guillement
Posté par nicodache . Évalué à 2.
'".%$mots[$z]%."'
par
'%".$mots[$z]."%'
ca devrait aller mieux comme ca ;)
et si ca va toujours pas, affichez le query :
echo "la requete est : ".$requete."";
[^] # Re: guillement
Posté par roule007 . Évalué à 1.
Désolé les gars :(
Voila la requete et l'erreur générée :
SELECT count(*) FROM vivacances WHERE (TITLE like '%hotel%') ORDER BY prix ASC ;
Warning: mysql_result(): supplied argument is not a valid MySQL result resource in /home/publicid/sd/julien/moteur.php on line 83
Et avec deux champs de recherche :
SELECT count(*) FROM vivacances WHERE (TITLE like '%hotel%') or (TITLE like '%maroc%') ORDER BY prix ASC ;
Warning: mysql_result(): supplied argument is not a valid MySQL result resource in /home/publicid/sd/julien/moteur.php on line 83
[^] # Re: guillement
Posté par roule007 . Évalué à 1.
$nb_total=mysql_result($requete,0,"count(*)");
Voila !
[^] # Re: guillement
Posté par nicodache . Évalué à 2.
count te renvoie le nombre de tuples concernés par le reste de ta requete, mais ce n'est pas un champ de la table.
tu peux toujours essayer de faire un truc du genre
$query = "select count(*) as total from tagada where (plop = "truc")";
$result = mysql_query($query);
$nb_total = mysql_result($query,0,total);
mais je suis pas sur que ca marche ;)
sinon, t'as toujours une autre solution moins propre, mais qui marche autant :
$query = "select * from latable where (conditions)";
$result = mysql_query($query);
et à ce point-ci, tu peux retrouver la meme valeur que count avec un
$total = mysql_num_rows($result);
[^] # Re: guillement
Posté par nicodache . Évalué à 2.
(ou alors j'ai oublié comment ca fonctionne ce truc :D)
# Un exemple de code un peu plus complet et concis :
Posté par Gyro Gearllose . Évalué à 2.
$mots = explode (' ', $mot);
$requete = "select count(*) from vivacance where title in ('%" . implode ("%', '%", $mots) . "%') order by prix asc;";
explode remplace avantageusement ta boucle (plus rapide et compréhensif). Au pire aller, tu peux utiliser preg_split qui peux t'éviter les chaînes vides. En effet, un visiteur peux frapper plusieurs fois la barre d'espace entre deux mots... Faut bien gérer ça !
implode rassemble le tableau. Si tu ne veux pas passer par un tableau, tu peux aussi passer par une expression régulière et la fonction preg_replace.
Le code ci-dessus deviendrait :
$requete = "select count(*) from vivacance where title in ('%" . preg_replace ('/([:[space:]]{1,})/', "%', '%", $mots) . "%') order by prix asc;";
C'est du non testé, mais ce doit être approchant !
[^] # Re: Un exemple de code un peu plus complet et concis :
Posté par nicodache . Évalué à 2.
[^] # Re: Un exemple de code un peu plus complet et concis :
Posté par Gyro Gearllose . Évalué à 2.
Alors, je fais partager, c'est l'esprit du libre, non ?!
Tiens, à propos, j'en profite pour dire que je trouve la methode GET pour un formulaire dégueulasse, car elle pollue l'URL pour rien et que je préfère la méthode post, plus propre à mon goût, na ;-) !
[^] # Re: Un exemple de code un peu plus complet et concis :
Posté par roule007 . Évalué à 1.
Bon ton code marche bien mais le résultat de la requete n'est pas le même si ?
Car quand je la lance, j'ai zéro resultat pour un truc qui est rempli pourtant !
Je m'explique :
SELECT count( * ) FROM vivacances WHERE TITLE LIKE '%hotel%' ORDER BY prix ASC
Me donne 10 résultats, alors que :
select count(*) from vivacances where TITLE in ('%hotel%') order by prix asc;
Me donne 0 résultats !
Mes lacunes en SQL me perderont !
[^] # Re: Un exemple de code un peu plus complet et concis :
Posté par nicodache . Évalué à 2.
et pour le fait qu'il renvoie rien, je crois que c'est parce que le IN prend une suite de string, du genre
where variable IN ('un','deux','trois')
alors que dans ce cas-ci, on souhaite retrouver les titres qui contiennent un truc du genre un, deux ou trois, mais avec des trucs devant ou derrière...
et ici, avec le IN, je crois qu'il fait une recherche qui est équivalente à
select * from latable where (variable == '%un%') or (variable == '%deux%'), mais bien sur, tu n'as nulle par de %un% dans une colonne d'un de tes tuples...
forcément, ca va moins bien :D
[^] # Re: Un exemple de code un peu plus complet et concis :
Posté par Gyro Gearllose . Évalué à 2.
Mais on doit pouvoir renverser la vapeur en faisant un truc dans ce genre (pour utiliser un in quand même !) :
where true in (title like '%mot1%', title like '%mot2%' ...).
Je laisse le soin d'adapter le code ci-dessus pour obtenir ce résultat...
[^] # Re: Un exemple de code un peu plus complet et concis :
Posté par nicodache . Évalué à 2.
[^] # Re: Un exemple de code un peu plus complet et concis :
Posté par Gyro Gearllose . Évalué à 2.
Après, je suis presque d'accord, c'est quand même un peu porc. Et puis, ça fait une projection de la table à un moment où à un autre, ce qui fait que c'est bien moins rapide qu'un "or". D'un autre côté, sql est fait pour manipuler des ensembles plus que la logique....
Bref, dans ce cas, c'est évident, il faut un "or"....
[^] # Re: Un exemple de code un peu plus complet et concis :
Posté par roule007 . Évalué à 1.
Apres un Mix de toutes vos méthodes sa tourne, MERCI A TOUS !
J'abuse et vous pose une autre question :
Comment faire pour que si l'utilisateur tape trois mots clés, on affiche les resultats en fonctions de 3 requetes, celles avec les 3 mots, puis celle avec un moins 2 mots puis celle avec au moins 1 mot ???
Merci encore à tous !
[^] # Re: Un exemple de code un peu plus complet et concis :
Posté par nicodache . Évalué à 2.
Comment faire pour que si l'utilisateur tape trois mots clés, on affiche les resultats en fonctions de 3 requetes
- on prépare et on execute un query par mot clé :
while (j'ai des mot clé) {
$query = select truc from brol where champ = mot_clé[index];
// executer query, afficher, etc
}
celles avec les 3 mots :
- on prépare un query avec les 3 mots clés concaténés derrière le where :
$condition = "";
while (j'ai des mot clé) {
rajouter les mot clés dans $condition
}
$query = select truc from brol where $condition
// executer query, afficher, etc
puis celle avec un moins 2 mots puis celle avec au moins 1 mot ???
- la ca devient trop casse bonbon pour le codeur moyen
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.