IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Erreur de syntaxe fréquente mais pas systématique


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut Erreur de syntaxe fréquente mais pas systématique
    Bonjour,

    Je débute en php et j'ai écris un code qui permet de récupérer des champs dans une table de base SQL afin de les stocker dans un fichier CSV côté serveur. (en PHP 8.2)
    l'offset permet de spécifier la ligne de la table dans laquelle récupérer les informations souhaitées.

    offset=0 étant la toute dernière ligne de la table, offset=1 l'avant dernière, etc ...

    https://serveur.com/requete_devis_client.php?offset=0
    ...
    https://serveur.com/requete_devis_client.php?offset=12


    Le code,certainement mal écris, transforme les caractères accentués afin de les restituer dans le fichier CSV. (dernier_client.csv)
    à la fin du dernier champ collecté apparait en plus les caractères suivants : 
    je ne sais pas pourquoi.


    Le réel soucis est le suivant :
    Lorsque j'appelle le code, 6 fois sur 10, il s''exécute normalement et le fichier CSV est bien créé.
    Cependant, il arrive que le serveur renvoi une erreur et le fichier CSV n'est pas généré.

    ]Fatal error: Uncaught mysqli_sql_exception: 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 25 in
    /home/iffwswr/www/requete_devis_client.php:53
    Stack trace: #0 /home/iffwswr/www/requete_devis_client.php(53): mysqli_query(Object(mysqli), 'SELECT \n\t\t\tid,\t...')
    #1 {main} thrown in /home/iffwswr/www/requete_devis_client.php on line 53
    Pouvez vous m'aider à corriger ce code, je n'y parviens pas seul malgré les lignes pointées dans le message d'erreur.
    En vous remerciant,


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    <?php 
    require_once("db.php");
     
    // Recupération de la variable 'offset'
    $offset_demande_devis=$_POST["offset"];	
     
    error_reporting(E_ALL);
    ini_set("display_errors", 1);
    ?>
     
     
    <html>
     
    <head>
    	<link href="style.css" rel="stylesheet" type="text/css" />
    	<title>Demande de devis : offset n° <?php echo $offset_demande_devis; ?></title>
    </head>
     
    <body>
     
     
    <?php
     
     
    $query = "SELECT 
    			id,										-- récupère la valeur de la colonne l'id
    			date_time,								-- récupère la valeur de la colonne date_time
                message->>'$[0].message' as nom,					-- récupère la valeur du champ 0 de la colonne message
                message->>'$[1].message' as prenom,
                message->>'$[2].message' as email,
                message->>'$[3].message' as telephone,
                message->>'$[4].message' as souhaitrappel,
                message->>'$[5].message' as typebien,
                message->>'$[6].message' as surface,
                message->>'$[7].message' as anneeconstruction,
                message->>'$[8].message' as adresse1,
                message->>'$[9].message' as adresse2,
                message->>'$[10].message' as codepostal,
                message->>'$[11].message' as ville,
                message->>'$[12].message' as besoin,
                message->>'$[13].message' as choixprestation,
                message->>'$[14].message' as descriptionclient,
                message->>'$[15].message' as pj,
                message->>'$[16].message' as google,
                message->>'$[17].message' as datedemande
            FROM btj4_baforms_submissions						-- extrait depuis la table 'btj4_baforms_submissions'
    		ORDER BY id DESC								-- tri par id par ordre decroissant
    		LIMIT 1										-- garde que 1 resultat
    		OFFSET $offset_demande_devis						-- affiche le resultat n° i
    ";		
     
    // envoi de la requête SQL
    $result = mysqli_query($conn, $query);
     
     
    // récupération du résultat	
    while($row = mysqli_fetch_array($result))
    {
     
    // ****************************************	
    // *** Formatage des données collectées ***
    // ****************************************		
     
    // Le champ $data['fields'] n'affiche pas les accents.
    // on le transforme, le resultat formaté est stocké dans la variable $formated_field	
    $formated_descriptionclient = preg_replace_callback('~\\\\u([[:xdigit:]]{4})~', function($m) { return html_entity_decode('&#x' . $m[1] . ';', ENT_HTML5, 'UTF-8');}, $row['descriptionclient']);
     
    // remplace /r/n par ' ' (espace)
    $formated_descriptionclient = str_ireplace(array("\r","\n",'\r','\n'),' ', $formated_descriptionclient);
     
    // remplace le signe € --> \u20ac  par ' ' (EUR)  ( Ne fonctionne pas )
    //$formated_descriptionclient = str_replace(array"\u20ac"),"EUR", formated_descriptionclient);
     
     
    $nom = strtoupper($row['nom']);
    $prenom = ucwords($row['prenom']); 
    $email = strtolower($row['email']);
    $telephone = trim($row['telephone']);
    $souhaitrappel = strtoupper($row['email']);
    $adresse1 = ucwords($row['adresse1']);
    $adresse2 = ucwords($row['adresse2']);
    $codepostal = trim($row['codepostal']);
    $ville = strtoupper($row['ville']);
    $typebien = ucwords($row['typebien']);
    $surface = trim($row['surface']);
    $besoin = $row['besoin'];
    $choixprestation = $row['choixprestation'];
    $recherchegoogle = trim($row['google']);
     
     
    // Generation du fichier CSV : "dernier_client.csv"
    header('Content-Encoding: UTF-8');
    header('Content-type: text/csv; charset=UTF-8');
    header('Content-Disposition: attachment; filename=dernier_client.csv');
    echo "\xEF\xBB\xBF"; // UTF-8 BOM
     
     
    $csv_fields = array(
    	//array($row['nom'],$row['prenom'],$row['email'],$row['telephone'],$row['souhaitrappel'],$row['adresse1'],$row['adresse2'],$row['codepostal'],$row['ville'],$row['typebien'],$row['surface'],$row['anneeconstruction'],$row['besoin'],$row['choixprestation'],$row['google'],$row['descriptionclient'])
    	   array($nom,$prenom,$email,$telephone,$souhaitrappel,$adresse1,$adresse2,$codepostal,$ville,$typebien,$surface,$besoin,$choixprestation,$recherchegoogle,$formated_descriptionclient)	
    );
     
     
    $fp = fopen('dernier_client.csv', 'w');
     
     
    foreach ($csv_fields as $fields)
    {
    	fputcsv($fp, $fields);
    	fprintf($fp, chr(0xEF).chr(0xBB).chr(0xBF));		// permet à excel de bien reconnaitre les accents dans le fichier csv
    }
     
    fclose($fp);
     
    }	// fin while
     
     
    mysqli_free_result($result);
    $conn->close();
     
    /*
    // Message optionnel indiquant que le fichier CSV à bien été généré
    		
            echo '<script language="javascript">';
            echo 'alert(' . $filename . ' "fichier créé")';
            echo '</script>';
    */		
     
    ?>

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 664
    Points
    66 664
    Billets dans le blog
    1
    Par défaut
    Quel est le charset du fichier csv ? A-t-il du BOM ?
    Quel est le charset de ta connexion à la Base de données.

    Je te conseille de passer à un système en UTF8 (sans BOM) https://j-willette.developpez.com/tu...-site-en-utf8/

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Pas sûr de bien comprendre votre question,
    Il n'y a rien de spécifié dans le fichier CSV, ce fichier est créé par le script php

    En ce qui concerne l'accès la database, voici mon fichier db.php
    Faut il rajouter des informations sur le codage dans db.php ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php
     
      $localhost = 'abcd.mysql.db';
      $database = 'abcd';
      $username = 'user';
      $password = 'password';
     
     
    $conn = mysqli_connect($localhost,$username,$password,$database);
     
     
    //test if connection failed
    if(mysqli_connect_errno()){
        die("connection failed: "
            . mysqli_connect_error()
            . " (" . mysqli_connect_errno()
            . ")");
    }
     
    ?>

  4. #4
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 664
    Points
    66 664
    Billets dans le blog
    1
    Par défaut
    A la lecture de ta réponse, je pense que tu n'as pas été voir le lien donné ...

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Lorsque j'ajoute cette ligne au début de mon fichier PHP et que je lance le script il ne se passe plus rien du tout à l’exécution (écran blanc sur le browser)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_set_charset( 'utf8' );
    si je retire cette ligne alors chaque caractère accentué apparait comme ceci : �

    L'ajout de cette ligne dans mon fichier PHP n'apporte pas de changement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header( 'content-type: text/html; charset=utf-8' );

    L'ensemble des colonnes de la base SQL ont l'Interclassement : UTF8_general_ci

    Du coup, je ne sais pas ou intervenir.

  6. #6
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 640
    Points : 66 664
    Points
    66 664
    Billets dans le blog
    1
    Par défaut
    Tes fichiers php sont ils en utf8 ?

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Oui, j'ai vérifié l'encoding dans Notepad++

    Les fichiers sont en bien UTF 8 ( pas de BOM )

  8. #8
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Existe t-il un moyen de simplifier mon code, je trouve que de devoir transformer les caractères non lisibles par des caractères sans accents reste du bricolage, j'aurai bien aimé trouvé une solution plus propre.

    Merci à vous,

  9. #9
    Membre éclairé
    Homme Profil pro
    Autre
    Inscrit en
    Juillet 2021
    Messages
    358
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Juillet 2021
    Messages : 358
    Points : 734
    Points
    734
    Par défaut
    Si tu développes tout en utf-8, tu ne devrais pas avoir besoin de transformer les caractères avec accents.

    La fonction mysql_set_charset n'existe plus depuis PHP 7, il ne faut plus utiliser cette fontion.

    Tu utilises l'API Mysqli pour te connecter à la bdd (mysqli_connect), il faut donc utiliser les fonctions mysqli_*
    Essaye d'appliquer mysqli_set_charset($conn, 'utf8'); après la connexion pour définir correctement le charset de ta connexion.

  10. #10
    Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Points : 52
    Points
    52
    Par défaut
    Merci pour cette commande, ça fonctionne en effet.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Erreur 1004 Non aléatoire mais pas systématique
    Par BLP-Dax dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 22/11/2019, 16h10
  2. Python: erreur de syntaxe (je comprend pas !)
    Par darioo2 dans le forum Général Python
    Réponses: 3
    Dernier message: 03/08/2010, 12h05
  3. [JpGraph] erreur 404 en ligne mais pas en local
    Par Lert Sarin dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 24/07/2009, 10h45
  4. Réponses: 2
    Dernier message: 27/08/2008, 11h46
  5. Erreur sur un poste mais pas sur un autre
    Par hawk² dans le forum Framework .NET
    Réponses: 10
    Dernier message: 27/08/2007, 09h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo