You have an error in your SQL syntax ..........

Bonjour,

Dans mon script j'ai l'erreur
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 'mai 1787, -4) ASC)' at line 1

$tonarray[0]=array("mariage" => $marg_1 ,"date_mariage" => $row['date_mariage_1'] , "conjoint" => $row['num_cj_1'] );
$tonarray[1]=array("mariage" => $marg_2 ,"date_mariage" => $row['date_mariage_2'] , "conjoint" => $row['num_cj_2'] );
$tonarray[2]=array("mariage" => $marg_3 ,"date_mariage" => $row['date_mariage_3'] , "conjoint" => $row['num_cj_3']);
$tonarray[3]=array("mariage" => $marg_4 ,"date_mariage" => $row['date_mariage_4'] , "conjoint" => $row['num_cj_4']);

$query4 = 'SELECT id,num_indiv,famille,nom,prenom,date_naissance,date_dc FROM individus WHERE num_indiv LIKE '.$tonarray[$i]['conjoint'].' ORDER BY (SUBSTRING('.$tonarray[$i]['date_mariage'].', -4) ASC)';
$result4 = mysql_query($query4) or die(mysql_error());
$row4 = mysql_fetch_array($result4);


Je veux sortir la liste des mariages d'un individu trié par les 4 derniers caractères de la date de mariage.

Merci !

4 réponses

  1. Salut,

    Le message d erreur est assez explicite, un echo de ta requête t aurai mis sur la voie si tu ne le vois pas directement.

    Donc dans ta requete:

    $query4 = 'SELECT id,num_indiv,famille,nom,prenom,date_naissance,date_dc FROM individus WHERE num_indiv LIKE '.$tonarray[$i]['conjoint'].' ORDER BY (SUBSTRING('.$tonarray[$i]['date_mariage'].', -4) ASC)';
    


    Il y a deux erreurs:
    - Le
    LIKE '.$tonarray[$i]['conjoint'].' 
    : d'une part il manque les quotes (c'est un string), et d'autre part l utilisation du like inclu un joker .. ce n est pas une obligation mais faire un like sur une chaine fixe est une hérésie ! mécréant! ^^. Plus sérieusement, en mettant
    soit
    WHERE num_indiv LIKE "'.$tonarray[$i]['conjoint'].'%" ORDER BY 
    

    soit
    WHERE num_indiv = "'.$tonarray[$i]['conjoint'].'" ORDER BY 
    

    Le premier problème sera corrigé.

    - le
    ORDER BY (SUBSTRING('.$tonarray[$i]['date_mariage'].', -4) ASC)'
    : même remarque pour le string: manque les quotes. Donc:
    ORDER BY (SUBSTRING("'.$tonarray[$i]['date_mariage'].'", -4) 
    ASC)'


    Test et confirme si c est ok.

    naga
    0
    1. Merci naga, mais le tri sur date_mariage (du plus loin au plus prêt) ne se fait toujours pas :o(
      0
      1. Modérateur
        Bonjour,

        Je pense, en regardant ton message d'erreur... que tu as stocké tes dates dans un champ varchar ....
        Sauf que pour stocker des dates en BDD ... il existe des champs de type DATE .... et c'est sur ce type de champ que tu peux trier des dates ......
        0
      2. @jordane45Effectivement, j'ai stocké mes dates en VARCHAR, car elles peuvent avoir la forme :
        JJ janvier AAAA
        février AAAA
        AAAA
        vers AAAA ..............
        Et donc, pour les trier, je prends les 4 derniers caractères, soit AAAA.
        0
      3. Modérateur
        @t671Les dates se stockent au format DATE dans un CHAMP DATE.
        Après... tu peux jouer avec l'AFFICHAGE ... mais la donnée elle est toujours stockée dans le bon format ......
        Passer par un varchar est une grosse erreur.....
        0
      4. @jordane45Oui, mais peu importe ! Je fais de toute façon mon test sur un champ. Et je compare ces champs !
        0
      5. Modérateur
        @t671......
        En attendant... si tu veux voir ce qui ne va pas dans ta requête... fais donc un ECHO de celle ci .. puis testes la DIRECTEMENT dans ta BDD (via phpmyadmin par exemple)
        0
    2. Si je fais un "echo $query4", il m'affiche
      SELECT id,num_indiv,famille,nom,prenom,date_naissance,date_dc FROM individus WHERE num_indiv = "4792" ORDER BY (SUBSTRING("28 mai 1787", -4)) ASCSELECT id,num_indiv,famille,nom,prenom,date_naissance,date_dc FROM individus WHERE num_indiv = "4795" ORDER BY (SUBSTRING("1782", -4)) ASC
      Le premier mariage enregistré dans la base est bien le num_indiv 4792 en 1787.
      Le second mariage ajouté dans la base est bien le num_indiv 4795 en 1782.
      En résultat je veux afficher celui en 1782 puis en 1787, ce qui n'est pas le cas actuellement !
      Si je le test directement via ma BDD il ne reconnait pas $tonarray = array();
      0
      1. Modérateur
        Si je le test directement via ma BDD il ne reconnait pas $tonarray = array();

        .... ce que tu dois tester directement dans phpmyadmin... c'est pas le code PHP ... mais la requête que tu as obtenu en faisant le ECHO ;......
        0
    3. je reviens du coup, mais tu veux faire le tri depuis un varchar donc?
      Je remets pas en question de ton choix même si je ne suis pas d'accord avec toi mais bref.

      en fait j avais pas regardé ton order, tu tries avec une valeur fixe puisque issue de php, et non d une colonne de ta base de donnée.
      du coup essaie plutot :

      ORDER BY (SUBSTRING(date_dc, -4) ASC)
      


      en supposant que date_dc correspond a la date de mariage.

      naga
      0