Requetre sql avec explode?

Bonjour,

si j'ai un champs et que dedans il y a plusieurs auteurs(tous séparés par un espace), je voudrais avec ma requête faire que en tapant un ou plusieurs auteurs cela me renvoie le résultat.

actuellement avec le code ci-dessous ca marche que si je tape un auteur(voir code ci-dessous), en revanche si dans un même champs il y a plusieurs auteurs cela ne marcher pas ( Requête invalide : 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 'AND auteur LIKE '%lala%'' at line 1 Requête complète : SELECT * FROM base_physique WHERE sujet LIKE '%' AND auteur LIKE '%lolo%' OR AND auteur LIKE '%lala%')

Comment faire svp?
merci d'avance

$sql=mysql_query("SELECT DISTINCT sujet FROM base_physique ORDER BY sujet") or die(mysql_error());

while ($ajout = mysql_fetch_array($sql))
{

$laRequete = "SELECT * FROM base_physique WHERE sujet LIKE '%'";

$mots3 = explode(" ", $_POST['auteur']);

if( isset( $_POST['auteur'] ) && $_POST['auteur'] != "" )
for($rangAuteur = 0 ; $rangAuteur< sizeof($mots3) ; $rangAuteur++)
{
if($rangAuteur > 0)
$laRequete .= " OR ";
$laRequete .= " AND auteur LIKE '%" . $mots3[ $rangAuteur ] . "%'";
}

$reponse = mysql_query( $laRequete );
if( !$reponse )
{
$message = 'Requête invalide : ' . mysql_error() . "\n";
$message .= 'Requête complète : ' . $laRequete;
die($message);
}
Configuration: Windows XP
Internet Explorer 7.0

20 réponses

Résumé de la discussion

Une requête MySQL destinée à retrouver des enregistrements où le champ auteur contient un ou plusieurs auteurs saisis échoue lorsque plusieurs auteurs figurent dans un seul champ. Les échanges montrent que la construction dynamique utilisant LIKE avec AND et OR sans parenthèses génère une syntaxe invalide du type '... AND auteur LIKE '%lolo%' OR AND auteur LIKE '%lala%''. Plusieurs réponses recommandent d'utiliser uniquement des conditions LIKE reliées par OR et regroupées entre parenthèses, ou d'ajuster la logique pour éviter l'enchaînement 'OR AND' conduisant à des erreurs. En complément, la discussion évoque des solutions comme l'emploi d'une approche par mots-clés dans le champ auteur, l'utilisation de parenthèses correctes et, éventuellement, des alternatives comme les recherches en texte intégral.

Bobot (l’IA à votre service)
  1. Bonjour,

    Je pense que le code devrait être le suivant
    $laRequete = "SELECT * FROM base_physique WHERE sujet LIKE '%'";
    
    $mots3 = explode(" ", $_POST['auteur']);
    
    if( isset( $_POST['auteur'] ) && $_POST['auteur'] != "" )
    for($rangAuteur = 0 ; $rangAuteur< sizeof($mots3) ; $rangAuteur++)
    {
    if($rangAuteur = 0)
    $laRequete .= " AND (auteur LIKE '%" . $mots3[ $rangAuteur ] . "%'";
    if($rangAuteur > 0)
    $laRequete .= "  OR auteur LIKE '%" . $mots3[ $rangAuteur ] . "%'";
    }
    $laRequete.= ")";
    

    A plus
    1. Il me met l'erreur suivante :

      Requête invalide : 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 'AND auteur LIKE '%paris%'' at line 1 Requête complète : SELECT * FROM base_physique WHERE auteur LIKE '%' AND auteur LIKE '%lille%' OR AND auteur LIKE '%paris%'

      tu vois autre chose?

      merci
  2. Bonjour,

    Oui, deux choses:
    1°) Remplace
    $laRequete = "SELECT * FROM base_physique WHERE sujet LIKE '%'";
    par
    $laRequete = "SELECT * FROM base_physique WHERE sujet ='" .$ajout ."'";

    2°) Remplace
    if($rangAuteur = 0)
    par
    if($rangAuteur == 0)

    A plus
    1. il me met encore ca :

      Requête invalide : 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 'AND auteur LIKE '%paris%'' at line 1 Requête complète : SELECT * FROM base_physique WHERE auteur LIKE '%' AND auteur LIKE '%lille%' OR AND auteur LIKE '%paris%'

      snif
      quand je tape ma recherche je met juste un espace entre les 2 auteurs que je recherche c'est bien cela?

      Tu as une autre idée?
      c'est super important pour moi et je galére la dessus depuis pas mal de temps..

      merci d'avance
  3. Regarde avec attention cette partie de ta requête mysql :
    WHERE auteur LIKE '%' AND auteur LIKE '%lille%' OR AND auteur LIKE '%paris%' 
    


    Qu'est-ce-qui cloche à ton avis ?
    1. ben le OR AND cote cote ca ne va pas mais j'ai essayé plei de trucs et je n'aboutis jamais a rien..
      je commence a desespéré

      aurais tu une idée?
      1. WHERE auteur LIKE '%' AND auteur LIKE '%lille%' OR AND auteur LIKE '%paris%' 
        


        1. que veut dire auteur LIKE '%' ?
        2. en supposant que la réponse à la question précédente soit "ça ne sert à rien", ton instruction deviendrait :
        WHERE auteur LIKE '%lille%' OR AND auteur LIKE '%paris%' 
        

        3. en supposant que nous remplacions OR AND par OR tout seul, que veut dire :
        WHERE auteur LIKE '%lille%' OR auteur LIKE '%paris%' 
        


        Ne te précipite pas sur ton poste de travail mais commence par répondre à ces qqes questions.
        1. ben la ce serait si le sujet est lille ou si c'est paris..
          mais le probléme c'est que quand je tape lille paris dans ma recherche ca ne marche pas.. avec le code de départ, cela marchait si je tapais lille ou si je tapais paris
          j'avais essayé avec des OR mais le probléme c'est que cela ne marche pas quand il y a plus d'un mot dans ma recherche j'ai l'impression...
          Donc je ne vois pas quoi mettre
      2. Deux remarques sur ton interprétation :

        1. ce n'est pas le sujet mais l'auteur (si l'on se réfère aux noms des colonnes mysql)
        2. ce n'est pas est lille mais contient lille

        Est-ce-que ces précisions te sont utiles ? Est-ce-que la requête s'exécute maintenant ?
        1. porur sujet je voulais dire auteur
          par contre pour dire est auteur j'utilise = ou LIKE
          mais pour dire contient c'est quelle syntaxe?
        2. @ladj59je ne comprends pas trop comment je dois faire la requete pour que cela fonctionne correctement...
          peux tu me mettre sur la piste stp car je tourne en rond ..
          merci d'avance
      3. auteur like '%lille%' 
        


        veut dire que la variable auteur est égale à 0 ou n caractères quelconques quivis de lille suivi de 0 ou n caractères quelconques.

        Ainsi, un enregistrement de la table dont la variable auteur est égale à 'lille', 'azertylille', 'lilleuiop' ou 'azrtyillleuiop' sera sélectionné

        Je ne sais pas que te dire de plus !
        1. oui je suis d'acord avec toi mais est-ce que les caractéres espaces sont également pris en compte??
          en effet si je tape lille lens cela ne marche pas est-ce normal?
          1. Les blancs sont-ils pris en compte ? Oui : WHERE auteur LIKE '%avec deux blancs%' sélectionnera azertyavec deux blancs et ne sélectionnera pas azertyavecdeuxblancs.

            Mais je pense que ton pb n'est pas là : dans un message précédent il t'était proposé d'utiliser explode pour séparer les mots avant de générer la requête.

            Voici un code qui devrait marcher :
            if( isset( $_POST['auteur'] ) && $_POST['auteur'] != "" )
            	{
            	$laRequete = "SELECT * FROM base_physique";
            
            	$mots3 = explode(" ", $_POST['auteur']);
            
            	for( $rangAuteur = 0 ; $rangAuteur< sizeof($mots3) ; $rangAuteur++ )
            	{
            	if( $rangAuteur > 0 )
            		$laRequete .= " OR";
            	$laRequete .= "  auteur LIKE '%" . $mots3[ $rangAuteur ] . "%'";
            	}
            


            J'ai supprimé auteur like '%' qui ne sert à rien.

            REFLECHIS !!!!!!!!!!
            1. merci croy ca marche très bien!
          2. je viens de voir un petit probléme
            en effet quand je fais une recherche par critéres multiples j'ai une erreur dans le code suivant :

            <?php

            $laRequete = "SELECT * FROM base_physique WHERE ";

            $mots2 = explode(" ", $_POST['motstitre']);

            $mots3 = explode(" ", $_POST['auteur']);

            if( isset( $_POST['auteur'] ) && $_POST['auteur'] != "" )
            {

            for( $rangAuteur = 0 ; $rangAuteur< sizeof($mots3) ; $rangAuteur++ )
            {
            if( $rangAuteur > 0 )
            $laRequete .= " OR";
            $laRequete .= " auteur LIKE '%" . $mots3[ $rangAuteur ] . "%'";
            }
            }

            if( isset( $_POST['motstitre'] ) && $_POST['motstitre'] != "" && $_POST['auteur'] == "")
            {

            for( $rangMotstitre = 0 ; $rangMotstitre< sizeof($mots2) ; $rangMotstitre++ )
            {
            if( $rangMotstitre > 0 )
            $laRequete .= " OR";
            $laRequete .= " motstitre LIKE '%" . $mots2[ $rangMotstitre ] . "%'";
            }
            }

            else
            {
            if( isset( $_POST['motstitre'] ) && $_POST['motstitre'] != "" && $_POST['auteur'] != "")
            {

            for( $rangMotstitre = 0 ; $rangMotstitre< sizeof($mots2) ; $rangMotstitre++ )
            {
            if( $rangMotstitre > 0 )
            $laRequete .= " OR";
            $laRequete .= " AND motstitre LIKE '%" . $mots2[ $rangMotstitre ] . "%'";
            }
            }
            }

            le seul cas qui ne marche pas et quand je tape plusieurs motstitre
            cela me met :

            Requête invalide : 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 'AND motstitre LIKE '%atomic%'' at line 1 Requête complète : SELECT * FROM base_physique WHERE auteur LIKE '%blasco%' AND motstitre LIKE '%performance%' OR AND motstitre LIKE '%atomic%'

            merci d'avance
            1. quelqu'un a une idée??

              merci
          3. Bonjour,

            Dans ton code
            if( isset( $_POST['motstitre'] ) && $_POST['motstitre'] != "" && $_POST['auteur'] != "")
            {
            
            for( $rangMotstitre = 0 ; $rangMotstitre< sizeof($mots2) ; $rangMotstitre++ )
            {
            if( $rangMotstitre > 0 )
            $laRequete .= " OR";
            $laRequete .= " AND motstitre LIKE '%" . $mots2[ $rangMotstitre ] . "%'";
            }
            }
            
            remplace " AND motstitre LIKE '%" par " motstitre LIKE '%"

            A plus
            1. non car si je fais une recherche par auteur et par motstitre cela ne marchera pas
          4. Bonjour,

            Remplace ton code par le suivant alors
            else
            {
            if( isset( $_POST['motstitre'] ) && $_POST['motstitre'] != "" && $_POST['auteur'] != "")
            {
            
            for( $rangMotstitre = 0 ; $rangMotstitre< sizeof($mots2) ; $rangMotstitre++ )
            {
            if ( $rangMotstitre > 0)
            {
            $laRequete .= " OR";
            }
            else
            {
            $laRequete .= " AND (";
            }
            $laRequete .= " motstitre LIKE '%" . $mots2[ $rangMotstitre ] . "%'";
            }
            $laRequest .= ")";
            }
            }
            


            A plus
            1. ca marche pour tous les cas sauf quand je coche juste motstitre
              il me met :

              Requête invalide : 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 '' at line 1 Requête complète : SELECT * FROM base_physique WHERE

              code correspondant (avabt le else) :

              if( isset( $_POST['motstitre'] ) && $_POST['motstitre'] != "" && $_POST['auteur'] == "")
              {

              for( $rangMotstitre = 0 ; $rangMotstitre< sizeof($mots2) ; $rangMotstitre++ )
              {
              if( $rangMotstitre > 0 )
              $laRequete .= " OR";
              $laRequete .= " motstitre LIKE '%" . $mots2[ $rangMotstitre ] . "%'";
              }
              }
          5. Bonjour,

            Rajoute la ligne suivante au début de ton code
            $aut = False;
            ensuite rajoute la ligne suivante
            $aut = True;
            juste après if( isset( $_POST['auteur'] ) && $_POST['auteur'] != "" )

            ensuite change le code suivant
            if( isset( $_POST['motstitre'] ) && $_POST['motstitre'] != "" && $_POST['auteur'] == "") 
            par
            if( isset( $_POST['motstitre'] ) && $_POST['motstitre'] != "" && !$aut) 
            et le code suivant
            if( isset( $_POST['motstitre'] ) && $_POST['motstitre'] != "" && $_POST['auteur'] != "") 
            par
            if( isset( $_POST['motstitre'] ) && $_POST['motstitre'] != "" && $aut) 


            Cela devrait résoudre ton problème.

            A plus
            1. toujours le même probléme cela marche bien pour tout sauf pour quand je recherche juste par motstitre

              Requête invalide : 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 '' at line 1 Requête complète : SELECT * FROM base_physique WHERE

              une autre idée?

              merci
          6. quelqu'un peut m'aider svp?
            merci
            1. Bonjour,

              Peux-tu copier/coller tout ton code stp ?

              Merci
          7. ok le probléme ancien est résolu
            en revanche j'essaye d'incorporer annee et cela marche pour tous les cas sauf quand je fais une recherche juste par année et il me met :

            Requête invalide : 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 '' at line 1 Requête complète : SELECT * FROM base_physique WHERE

            $laRequete = "SELECT * FROM base_physique WHERE ";

            $mots2 = explode(" ", $_POST['motstitre']);

            $mots3 = explode(" ", $_POST['auteur']);

            if( isset( $_POST['auteur'] ) && $_POST['auteur'] != "" )
            {

            for( $rangAuteur = 0 ; $rangAuteur< sizeof($mots3) ; $rangAuteur++ )
            {
            if( $rangAuteur > 0 )
            $laRequete .= " OR";
            $laRequete .= " auteur LIKE '%" . $mots3[ $rangAuteur ] . "%'";
            }

            $reponse = mysql_query( $laRequete );

            if( !$reponse )

            {

            $message = 'Requête invalide : ' . mysql_error() . "\n";

            $message .= 'Requête complète : ' . $laRequete;

            die($message);

            }
            }

            if( isset( $_POST['motstitre'] ) && $_POST['motstitre'] != "" && $_POST['auteur'] == "")
            {

            for( $rangMotstitre = 0 ; $rangMotstitre< sizeof($mots2) ; $rangMotstitre++ )
            {
            if( $rangMotstitre > 0 )
            $laRequete .= " OR";
            $laRequete .= " motstitre LIKE '%" . $mots2[ $rangMotstitre ] . "%'";
            }
            }
            else
            {
            if( isset( $_POST['motstitre'] ) && $_POST['motstitre'] != "" && $_POST['auteur'] != "")
            {

            for( $rangMotstitre = 0 ; $rangMotstitre< sizeof($mots2) ; $rangMotstitre++ )
            {
            if ( $rangMotstitre > 0)
            {
            $laRequete .= " OR";
            }
            else
            {
            $laRequete .= " AND";
            }
            $laRequete .= " motstitre LIKE '%" . $mots2[ $rangMotstitre ] . "%'";
            }
            }

            $reponse = mysql_query( $laRequete );

            if( !$reponse )

            {

            $message = 'Requête invalide : ' . mysql_error() . "\n";

            $message .= 'Requête complète : ' . $laRequete;

            die($message);

            }
            }

            if( isset($_POST['annee']) && $_POST['annee'] != "" && $_POST['auteur'] == "" && $_POST['motstitre'] == "" )
            {

            $laRequete .= " annee='" . $_POST['annee'] . "'";

            }
            else
            {
            if(isset($_POST['annee']) && $_POST['annee'] != "" && ($_POST['auteur'] != "" || $_POST['motstitre'] != "" ))
            {
            $laRequete .= " AND annee='" . $_POST['annee'] . "'";
            }

            $reponse = mysql_query( $laRequete );

            if( !$reponse )

            {

            $message = 'Requête invalide : ' . mysql_error() . "\n";

            $message .= 'Requête complète : ' . $laRequete;

            die($message);

            }
            }
            1. Bonjour,
              J'ai utilisé une indentation pour ton code et il me semble qu'il manque un }après$laRequete .= " AND annee='" . $_POST['annee'] . "'";
              }
              ce qui fait que l'instruction suivante n'est faite que dans le cas else
              $laRequete = "SELECT * FROM base_physique WHERE ";
              $mots2 = explode(" ", $_POST['motstitre']);
              $mots3 = explode(" ", $_POST['auteur']);
              
              if( isset( $_POST['auteur'] ) && $_POST['auteur'] != "" )
              {
                 for( $rangAuteur = 0 ; $rangAuteur< sizeof($mots3) ; $rangAuteur++ )
                 {
                 if( $rangAuteur > 0 )
                    $laRequete .= " OR";
                 $laRequete .= " auteur LIKE '%" . $mots3[ $rangAuteur ] . "%'";
                 }
                 $reponse = mysql_query( $laRequete );
                 if( !$reponse )
                 {
                     $message = 'Requête invalide : ' . mysql_error() . "\n";
                    $message .= 'Requête complète : ' . $laRequete;
                    die($message);
                 }
              }
              
              if( isset( $_POST['motstitre'] ) && $_POST['motstitre'] != "" && $_POST['auteur'] == "")
              {
                 for( $rangMotstitre = 0 ; $rangMotstitre< sizeof($mots2) ; $rangMotstitre++ )
                 {
                    if( $rangMotstitre > 0 )
                       $laRequete .= " OR";
                    $laRequete .= " motstitre LIKE '%" . $mots2[ $rangMotstitre ] . "%'";
                 }
              }
              else
              {
                 if( isset( $_POST['motstitre'] ) && $_POST['motstitre'] != "" && $_POST['auteur'] != "")
                 {
                    for( $rangMotstitre = 0 ; $rangMotstitre< sizeof($mots2) ; $rangMotstitre++ )
                    {
                       if ( $rangMotstitre > 0)
                      {
                         $laRequete .= " OR";
                      }
                      else
                      {
                         $laRequete .= " AND";
                      }
                      $laRequete .= " motstitre LIKE '%" . $mots2[ $rangMotstitre ] . "%'";
                    }
                 }
                 $reponse = mysql_query( $laRequete );
                 if( !$reponse )
                 {
                    $message = 'Requête invalide : ' . mysql_error() . "\n"; 
                    $message .= 'Requête complète : ' . $laRequete;
                    die($message);
                 }
              }
              
              if( isset($_POST['annee']) && $_POST['annee'] != "" && $_POST['auteur'] == "" && $_POST['motstitre'] == "" )
              {
                 $laRequete .= " annee='" . $_POST['annee'] . "'";
              }
              else
              {
                 if(isset($_POST['annee']) && $_POST['annee'] != "" && ($_POST['auteur'] != "" || $_POST['motstitre'] != "" ))
                 {
                    $laRequete .= " AND annee='" . $_POST['annee'] . "'";
                 }
                 $reponse = mysql_query( $laRequete );
                 if( !$reponse )
                 {
                    $message = 'Requête invalide : ' . mysql_error() . "\n";
                    $message .= 'Requête complète : ' . $laRequete;
                    die($message);
                 }
              }

              Peux-tu vérifier cela, si ce n'est pas le cas fait le moi savoir
              A plus
              1. il met encore
                Requête invalide : 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 '' at line 1 Requête complète : SELECT * FROM base_physique WHERE

                snif
            2. Bonjour,

              Peux-tu essayé le code suivant
              if( isset($_POST['annee']) && $_POST['annee'] != "")
              {
                 if (($_POST['auteur'] != "") || ($_POST['motstitre'] != ""))
                 {
                    $laRequete .= " AND annee='" . $_POST['annee'] . "'";
                 }
                 else
                 {
                    $laRequete .= " annee='" . $_POST['annee'] . "'";
                 }
                 $reponse = mysql_query( $laRequete );
                 if( !$reponse )
                 {
                    $message = 'Requête invalide : ' . mysql_error() . "\n";
                    $message .= 'Requête complète : ' . $laRequete;
                    die($message);
                 }
              }

              A plus
              1. ca y est cela marche
                merci
            3. j'ai un nouveau probléme avec le code ci-dessous
              maintenant je peux préselectionner un sujet avant de faire la recherche et aprés faire la recherche par critére mais je ne peux pas taper plus d'un auteur comem tout à l'heure et je tourne en rond

              quelqu'un a une idée?
              merci

              $sql=mysql_query("SELECT DISTINCT sujet FROM base_physique ORDER BY sujet") or die(mysql_error());

              while ($ajout = mysql_fetch_array($sql))
              {

              $laRequete = "SELECT * FROM base_physique WHERE sujet LIKE '".$_SESSION['subject']."'";

              $mots = explode(",", $_POST['motscle']);
              $mots2 = explode(" ", $_POST['motstitre']);
              $mots3 = explode(" ", $_POST['auteur']);
              $mots4 = explode(",", $_SESSION['subject']);

              if( isset( $_POST['auteur'] ) && $_POST['auteur'] != "" )
              {

              for( $rangAuteur = 0 ; $rangAuteur< sizeof($mots3) ; $rangAuteur++ )
              {
              if( $rangAuteur > 0 )
              $laRequete .= " OR";
              $laRequete .= " AND auteur LIKE '%" . $mots3[ $rangAuteur ] . "%'";
              }

              $reponse = mysql_query( $laRequete );

              if( !$reponse )

              {

              $message = 'Requête invalide : ' . mysql_error() . "\n";

              $message .= 'Requête complète : ' . $laRequete;

              die($message);

              }
              }

              $message = 'Requête invalide : ' . mysql_error() . "\n";
              $message .= 'Requête complète : ' . $laRequete;
              die($message);
              }

              if( isset($_POST['annee']) && $_POST['annee'] != "" )
              $laRequete .= " AND annee='" . $_POST['annee'] . "'";

              if( isset( $_SESSION['subject'] ) && $_SESSION['subject'] != "" )
              for($rangSujet = 0 ; $rangSujet < sizeof($mots4) ; $rangSujet++)
              {
              if($rangSujet > 0)
              $laRequete .= " OR ";
              $laRequete .= " AND sujet LIKE '%" . $mots4[ $rangSujet ] . "%'";
              }

              $reponse = mysql_query( $laRequete );
              if( !$reponse )
              {
              $message = 'Requête invalide : ' . mysql_error() . "\n";
              $message .= 'Requête complète : ' . $laRequete;
              die($message);
              }

              }
              1. Bonjour,

                Peux-tu copier/coller le message d'erreur stp ?

                Merci
            4. De toutes manières tu vas dans une mauvaise direction : il est très mauvais de faire deux niveaux de requêtes imbriquées sur la même table. A la place faire une unique requête.

              Ce qui serait bien ce serait que tu nous décrives ce que tu veux faire.

              Ensuite, nous construirons la requête mysql nécessaire et unique que tu mettras au point directement avec ton client mysql (duquel dispose-tu ?)

              Et enfin tu pourras construire ton script qui génère la requête mysql et exploite les résultats.

              Pour ma part, j'attends la description de ce que tu veux faire.
              1. Bonsoir Croy,

                Je penses que tu as raison, ce serait plus simple de comprendre ce que Lady59 veut obtenir afin de lui proposer une solution finie plutôt que d'avancer pas à pas.

                A plus