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 :

[Debian] Problème de locales [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mars 2007
    Messages : 186
    Points : 134
    Points
    134
    Par défaut [Debian] Problème de locales
    J'ai un problème étrange en PHP.
    Avant ma migration de serveur, j'intégrais des fichiers textes en provenance d'un AS400 pour synchroniser la BDD d'un ERP.

    $flo_prix = intval(trim(substr($str_line, 61, 17))) / 100000;

    Ensuite je construisaise une requête avec cette valeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $str_query = 'REPLACE INTO prix SET tarif = "'.$str_code_tarif.'" ';
    $str_query .= ', article = "'.$str_code_article.'"';
    $str_query .= ', articlePere = "'.$str_code_pere.'"';
    $str_query .= ', prix = '.$flo_prix.' ';
    .....

    $flo_prix s'écrivait dans ma chaine avec un point pour le séparateur de décimal. Sur le nouveau serveur (Debian 5.0 / Apache 2 / PHP5) quasi identique à l'original (version PHP et Debian différente) la chaine s'écrit avec une virgule et provoque une erreur SQL.
    Ce script est exécuté avec un cron en mode CLI.

    me renvoie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    LANG=fr_FR
    LC_CTYPE="fr_FR"
    LC_NUMERIC="fr_FR"
    LC_TIME="fr_FR"
    LC_COLLATE="fr_FR"
    LC_MONETARY="fr_FR"
    LC_MESSAGES="fr_FR"
    LC_PAPER="fr_FR"
    LC_NAME="fr_FR"
    LC_ADDRESS="fr_FR"
    LC_TELEPHONE="fr_FR"
    LC_MEASUREMENT="fr_FR"
    LC_IDENTIFICATION="fr_FR"
    LC_ALL=
    Pour tester mes locales j'ai écrit un petit script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/usr/bin/php
    <?php
    setlocale(LC_ALL, 'fr_FR@euro');
    print_r(localeconv());
    ?>
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/usr/bin/php
    <?php
    setlocale(LC_ALL, 'en_US ISO-8859-1');
    print_r(localeconv());
    ?>
    me renvoie la même chose !!!

    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
    Array
    (
        [decimal_point] => ,
        [thousands_sep] =>
        [int_curr_symbol] => EUR
        [currency_symbol] => EUR
        [mon_decimal_point] => ,
        [mon_thousands_sep] =>
        [positive_sign] =>
        [negative_sign] => -
        [int_frac_digits] => 2
        [frac_digits] => 2
        [p_cs_precedes] => 0
        [p_sep_by_space] => 1
        [n_cs_precedes] => 0
        [n_sep_by_space] => 1
        [p_sign_posn] => 1
        [n_sign_posn] => 1
        [grouping] => Array
            (
                [0] => 3
                [1] => 3
            )
     
        [mon_grouping] => Array
            (
                [0] => 3
                [1] => 3
            )
     
    )
    Avec le séparateur de décimal en "," alors que je veux le "."

    Quelqu'un a une explication !!!!??????????

    Merci, Théolude

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 466
    Points : 15 850
    Points
    15 850
    Par défaut
    déjà tu peux utiliser la fonction http://php.net/number_format pour mettre en forme ton nombre

    ensuite tu as oublié les apostrophes autour de la valeur du prix dans la construction de la requête. essaye ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $str_query  = '';
    $str_query .= "REPLACE INTO prix";
    $str_query .= " SET tarif = '$str_code_tarif'";
    $str_query .= ", article = '$str_code_article'";
    $str_query .= ", articlePere = '$str_code_pere'";
    $str_query .= ", prix = '$flo_prix'";

  3. #3
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mars 2007
    Messages : 186
    Points : 134
    Points
    134
    Par défaut
    Citation Envoyé par mathieu Voir le message
    déjà tu peux utiliser la fonction http://php.net/number_format pour mettre en forme ton nombre

    ensuite tu as oublié les apostrophes autour de la valeur du prix dans la construction de la requête. essaye ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $str_query  = '';
    $str_query .= "REPLACE INTO prix";
    $str_query .= " SET tarif = '$str_code_tarif'";
    $str_query .= ", article = '$str_code_article'";
    $str_query .= ", articlePere = '$str_code_pere'";
    $str_query .= ", prix = '$flo_prix'";
    Hello Mathieu,

    Non je ne veux pas de number_format, mon application fonctionnait très bien avant et je ne veux pas tout ré-écrire (partout où il y a des float).
    Pour les quotes, en fait ça marchait très bien avant sans puisque le séparateur de décimal était un point ...... ce que j'aimerai ré-avoir.

    Théolude

  4. #4
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mars 2007
    Messages : 186
    Points : 134
    Points
    134
    Par défaut
    Je ne comprends, rien, c'est comme si PHP refusait de prendre en compte les locales, exemple:

    Voici le code PHP testé (version 5.2.6-1+lenny3):
    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
    #!/usr/bin/php
    <?php
    setlocale(LC_ALL, 'fr_FR@ISO-8859-1');
    print_r(localeconv());
     
    setlocale(LC_ALL, 'en_US');
    print_r(localeconv());
     
    setlocale (LC_ALL, 'en');
    print((1.123 * 5)." \n");
    print(('1.123' * '5')." \n");
    print(('1,123' * '5')." \n");
    setlocale (LC_ALL, 'ru');
    print((1.123 * 5)." \n");
    print(('1.123' * '5')." \n");
    print(('1,123' * '5')." \n");
    setlocale (LC_ALL, 'fr');
    print((1.123 * 5)." \n");
    print(('1.123' * '5')." \n");
    print(('1,123' * '5')." \n");
     
    ?>
    Et voici le résultat:

    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
    Array
    (
        [decimal_point] => ,
        [thousands_sep] =>
        [int_curr_symbol] => EUR
        [currency_symbol] => EUR
        [mon_decimal_point] => ,
        [mon_thousands_sep] =>
        [positive_sign] =>
        [negative_sign] => -
        [int_frac_digits] => 2
        [frac_digits] => 2
        [p_cs_precedes] => 0
        [p_sep_by_space] => 1
        [n_cs_precedes] => 0
        [n_sep_by_space] => 1
        [p_sign_posn] => 1
        [n_sign_posn] => 1
        [grouping] => Array
            (
                [0] => 3
                [1] => 3
            )
     
        [mon_grouping] => Array
            (
                [0] => 3
                [1] => 3
            )
     
    )
    Array
    (
        [decimal_point] => ,
        [thousands_sep] =>
        [int_curr_symbol] => EUR
        [currency_symbol] => EUR
        [mon_decimal_point] => ,
        [mon_thousands_sep] =>
        [positive_sign] =>
        [negative_sign] => -
        [int_frac_digits] => 2
        [frac_digits] => 2
        [p_cs_precedes] => 0
        [p_sep_by_space] => 1
        [n_cs_precedes] => 0
        [n_sep_by_space] => 1
        [p_sign_posn] => 1
        [n_sign_posn] => 1
        [grouping] => Array
            (
                [0] => 3
                [1] => 3
            )
     
        [mon_grouping] => Array
            (
                [0] => 3
                [1] => 3
            )
     
    )
     
    5,615
    5,615
    5
    5,615
    5,615
    5
    5,615
    5,615
    5
    INCROYABLE non !!

  5. #5
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    186
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Mars 2007
    Messages : 186
    Points : 134
    Points
    134
    Par défaut
    Bonjour,

    J'ai enfin compris mon problème et trouvé la solution.

    1. Je ne testais jamais le retour de setlocale ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $bool_test = setlocale();
    if ($bool_test === false) print("Locales non installées")
    2. Les locales auxquelles j'essayais d'accéder n'étaient pas installées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dpkg-reconfigure locales
    (et apt-get install debconf si dpkg-reconfigure n'est pas installé)
    3. C'est un point qui est le séparateur et non @ ou espace.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setlocale(LC_NUMERIC, 'en_US.utf8'); // Séparateur . pour les décimales
    Tout est OK maintenant.

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

Discussions similaires

  1. Problème variable locale sur MATLAB
    Par nuans dans le forum MATLAB
    Réponses: 10
    Dernier message: 12/04/2007, 11h34
  2. Problème passage local à serveur distant linux!
    Par boniface dans le forum Web
    Réponses: 5
    Dernier message: 19/03/2007, 17h42
  3. [Sous Debian]Problème de vhosts !
    Par Scurz dans le forum Apache
    Réponses: 24
    Dernier message: 26/08/2006, 23h15
  4. Anjuta sur Debian: problème de compilation Autogen Makefile
    Par sglon dans le forum Systèmes de compilation
    Réponses: 5
    Dernier message: 13/12/2005, 23h00
  5. [3.1][Debian]problème de Could not find library 'swt-pi-gtk
    Par zlavock dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 27/09/2005, 14h07

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