Forum Programmation.php Requete MYSQL en PHP

Posté par  .
Étiquettes : aucune
0
14
avr.
2005
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  . Évalué à 3.

    dans la requete remplece le guillement par un simple quote

    > ... ''%sejour ...<


    Dam
    • [^] # Re: guillement

      Posté par  . Évalué à 2.

      version corrigée, et comme on aime généralement bien la voir :

      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  . Évalué à 1.

        Pour nicodache,
        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  . Évalué à 2.

          tu pourrais pas nous faire un petit print_r($mots), pour qu'on voit à quoi ca ressemble la dedans ? ;)
          • [^] # Re: guillement

            Posté par  . Évalué à 1.

            En lançant la requete avec maroc uniquement comme mot clé :
            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  . Évalué à 2.

              et à quoi sert le $et_ou dans cette histoire ?


              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  . Évalué à 1.

                Oui sauf que c un pseudo moteur de recherche donc maroc et hotel était des exemples, on peux tres bien imaginer qu'un utilisateur tape :
                maroc hotel séjour safari..... et bien d'autres encores.
                D'ou l'interet d'une requete crée dynamiquement !
                • [^] # Re: guillement

                  Posté par  . Évalué à 2.

                  et tu veux un moteur de recherche inclusif (machin or truc or bazar) ou un truc exclusif (machin and truc and bazar) ?
                  • [^] # Re: guillement

                    Posté par  . Évalué à 1.

                    Je pense en effet que le OR sera utilisé tout le temps mais bon, pour prevoir j'ai mis cette variable qui me permettera dans changer si besoin il y a.
                    Mais bon dans tous les cas, je ne pense pas que se soit elle qui crée des pb...
                • [^] # Re: guillement

                  Posté par  . Évalué à 2.

                  hum... J'aurais dû tout lire avant de poster mon commentaire ci-dessous...
                  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  . Évalué à 1.

      Je ne comprends pas !
      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  . Évalué à 2.

        Il y a une grosse différence dans la gestion des guillements simples et doubles :

        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  . Évalué à 1.

          J'ai donc mis ta requete :
          $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  . Évalué à 2.

            Essayes ça :
            $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  . Évalué à 1.

              La première 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 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  . Évalué à 2.

                et ca ca donne quoi ?
                $mot=strtolower($_GET['mot']);
                $mots=split(" ",$mot);
                $nombre_mots=count($mots);
                
                $z=0;
                $texte="Pages contenant les mots ";
                $phrase="";
                
                while ($z < $nombre_mots) {
                    $phrase.="(TITLE like '".%$mots[$z]%."')";
                    $texte.=$mots[$z];
                    $z++;
                    if ($z != $nombre_mots) {
                        // $et_ou contient soit AND, soit OR selon le type de recherche demandée
                        $phrase.= " ".$et_ou." ";
                        $texte.= ", ";
                    }
                }
                
                $requete= "SELECT count(*) FROM vivacances WHERE ".$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(*)");
                
                • [^] # Re: guillement

                  Posté par  . Évalué à 1.

                  Voila ce qu'il me met :

                  Parse error: parse error, unexpected '%' in /home/publicid/sd/julien/moteur.php on line 44
                  • [^] # Re: guillement

                    Posté par  . Évalué à 2.

                    oups wé, faut remplacer
                    '".%$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  . Évalué à 1.

                      Bon bein... sa marche tjrs pô !
                      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  . Évalué à 1.

                        La line 83 correspond a :

                        $nb_total=mysql_result($requete,0,"count(*)");
                        Voila !
                        • [^] # Re: guillement

                          Posté par  . Évalué à 2.

                          la c'est le count(*) ;)

                          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  . Évalué à 2.

                          et j'allais oublié, ca sert à rien de trier un count, un select count te renvoie une valeur numérique, ca sert à rien d'ordonner tes résultats, tu les veras quand même jamais ;)

                          (ou alors j'ai oublié comment ca fonctionne ce truc :D)
  • # Un exemple de code un peu plus complet et concis :

    Posté par  . Évalué à 2.

    $mot=strtolower($_GET['mot']);
    $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  . Évalué à 2.

      ca, c'est pas du code de débutant en php :D
      • [^] # Re: Un exemple de code un peu plus complet et concis :

        Posté par  . Évalué à 2.

        Merci pour le compliment (si c'en est un !), mais c'est avant tout le code de quelqu'un qui en a vite eu marre de coder toujours les mêmes choses, qui a pris le temps de parcourir la doc et qui a aussi eu beaucoup d'aide de la sympatique communauté de la liste php-france at linuxfr point orgue !
        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  . Évalué à 1.

      OK,
      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  . Évalué à 2.

        (c'est pas mon code, le coup du IN ;))

        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  . Évalué à 2.

          Hum, en effet, j'avais pas pensé à ça....
          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  . Évalué à 2.

            la ca devient vraiment porc, et tu ferais fuir mon prof de sql avec ce genre de trucs :D
            • [^] # Re: Un exemple de code un peu plus complet et concis :

              Posté par  . Évalué à 2.

              Je n'ai jamais dit que c'était du beau code ! C'était juste pour montrer qu'on peut faire la même chose avec un "in" !
              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  . Évalué à 1.

      Bon sa marche !!!
      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  . Évalué à 2.

        on peut voir ce que tu as pondu ? ;)


        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.