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

PHP & Base de données Discussion :

Résultat SQL Tronqué dans un case. [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Février 2005
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 317
    Points : 183
    Points
    183
    Par défaut Résultat SQL Tronqué dans un case.
    Bonjour à tous. Je fait une appli web qui permets de regrouper des données.
    Par exemple, imaginons le tableau suivant (table basepays)

    PAYS | TYPE | DATA
    FR | A | xxx
    FR | B | xxx
    FR | C | xxx
    FR | D | xxx
    BE | A | xxx
    BE | B | xxx
    BE | C | xxx
    BE | D | xxx

    Je fait une requête qui ferait le total de A & B de la sorte:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT `Pays` AS "Pays", CASE `TYPE ` 
    WHEN 'A ' THEN 'A & B' 
    WHEN 'B ' THEN 'A & B' 
     ELSE `TYPE` 
     END AS 'Type Group' 
    , SUM(`DATA`) AS "DATA" FROM basepays GROUP BY `Pays`, `Type Group`
    Le soucis est que sur mon serveur Wamp avec MySQL 5.0.8, j'obtiens bien A & B dans le résultat SQL, par contre, sur mon serveur linux en 5.1, la valeur est tronquée à la taille de la colonne Type (en l'occurance Varchar(1)).

    Une fois mis en varchar(10), je n'ai plus de soucis d'affichage.

    Ce qui est encore plus étonnant, c'est qu'en faisant la même requête dans phpMyAdmin, le résultat n'est pas tronqué...

    J'utilises mysql_fetch_assoc. Des idées ?

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ca vaudrait le coup d'essayer mysqli ou PDO pour voir si le comportement est le même.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre habitué

    Profil pro
    Inscrit en
    Février 2005
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 317
    Points : 183
    Points
    183
    Par défaut
    Bonne idée, je vais essayer ça dès que j'aurais le temps

  4. #4
    Membre habitué

    Profil pro
    Inscrit en
    Février 2005
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 317
    Points : 183
    Points
    183
    Par défaut
    J'ai testé les 3, et j'obtiens le même resultat sur mon serveur, ça me rend fou

    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
     
    $query="SELECT `Age` AS 'Age', CASE `Tranche surface` 
    WHEN '1000-1999 ' THEN 'Surface 1000-4999' 
    WHEN '2000-4999 ' THEN 'Surface 1000-4999' 
     ELSE `Tranche surface` 
     END AS 'Tranche surface Group' 
    , SUM(`Nbr 2011`) AS 'Nbr 2011' FROM basepays GROUP BY `Age`, `Tranche surface Group` LIMIT 10";
     
    $DB_NAME = 'xxx';
    $DB_HOST = 'localhost';
    $DB_USER = 'xxx';
    $DB_PASS = 'xxx';
     
    $db = mysql_connect($DB_HOST, $DB_USER,$DB_PASS);
    mysql_select_db("$DB_NAME",$db);
    $result = mysql_query($query,$db);
    while ($myrow = mysql_fetch_row($result)) {
    var_dump($myrow);
    }
     
     
    $mysqli = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
     
    if (mysqli_connect_errno()) {
    	printf("Connect failed: %s\n", mysqli_connect_error());
    	exit();
    }
     
    // A QUICK QUERY ON A FAKE USER TABLE
    $result = $mysqli->query($query) or die($mysqli->error.__LINE__);
     
    // GOING THROUGH THE DATA
    if($result->num_rows > 0) {
    	while($row = $result->fetch_assoc()) {
    		var_dump($row);
    	}
    }
    else {
    	echo 'NO RESULTS';
    }
     
    // CLOSE CONNECTION
    mysqli_close($mysqli);
     
     
    $db = new PDO("mysql:host=$DB_HOST;dbname=$DB_NAME;charset=utf8", $DB_USER, $DB_PASS);
    try {
    	//connect as appropriate as above
    	$stmt=$db->query($query); //invalid query!
    	var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
    } catch(PDOException $ex) {
    	echo "An Error occured!"; //user friendly message
    	some_logging_function($ex->getMessage());
    }
    Le pire c'est que dans PHPMyAdmin j'ai bien la valeur entière quand je lance la requête, il faut que je regarde dans les sources mais c'est pas évident...

    Dans l'exemple ci dessus j'obtiens "Surface 1000" car la colonne surface est varchar(12)

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je n'ai pas trouvé de trace d'un bug de ce genre ...
    Peux-tu tester directement dans mysql en ligne de commande pour voir ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    Membre habitué

    Profil pro
    Inscrit en
    Février 2005
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 317
    Points : 183
    Points
    183
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Je n'ai pas trouvé de trace d'un bug de ce genre ...
    Peux-tu tester directement dans mysql en ligne de commande pour voir ?
    J'ai testé et j'ai la même chose :/

    Wamp:
    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
     
    mysql> SELECT `Age` AS 'Age', CASE `Tranche surface`
        -> WHEN '1000-1999 ' THEN 'Surface 1000-4999'
        -> WHEN '2000-4999 ' THEN 'Surface 1000-4999'
        ->  ELSE `Tranche surface`
        ->  END AS 'Tranche surface Group'
        -> , SUM(`Nbr 2011`) AS 'Nbr 2011' FROM basepays GROUP BY `Age`, `Tranche su
    rface Group` LIMIT 10;
    +-----------+-----------------------+-----------------------+
    | Age       | Tranche surface Group | Nbr 2011              |
    +-----------+-----------------------+-----------------------+
    | 1960-1973 | 10000-19999           |    39.463083089000000 |
    | 1960-1973 | 5000-9999             |   107.649921226000000 |
    | 1960-1973 | <1000                 |  8201.961285133000000 |
    | 1960-1973 | > 20000               |    36.412166597000000 |
    | 1960-1973 | Surface 1000-4999     |  1305.662688639000000 |
    | 1974-1989 | 10000-19999           |    76.006791011000000 |
    | 1974-1989 | 5000-9999             |   207.336184214000000 |
    | 1974-1989 | <1000                 | 15797.163031684000000 |
    | 1974-1989 | > 20000               |    70.130656813000000 |
    | 1974-1989 | Surface 1000-4999     |  2514.735883353000000 |
    +-----------+-----------------------+-----------------------+
    10 rows in set (0.01 sec)
    Linux:
    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
     
    mysql> SELECT `Age` AS 'Age', CASE `Tranche surface` 
        -> WHEN '1000-1999 ' THEN 'Surface 1000-4999' 
        -> WHEN '2000-4999 ' THEN 'Surface 1000-4999' 
        ->  ELSE `Tranche surface` 
        ->  END AS 'Tranche surface Group' 
        -> , SUM(`Nbr 2011`) AS 'Nbr 2011' FROM basepays GROUP BY `Age`, `Tranche surface Group` LIMIT 10;
    +-----------+-----------------------+-----------------------+
    | Age       | Tranche surface Group | Nbr 2011              |
    +-----------+-----------------------+-----------------------+
    | 1960-1973 | 10000-19999           |    39.463083089000000 |
    | 1960-1973 | 5000-9999             |   107.649921226000000 |
    | 1960-1973 | <1000                 |  8201.961285133000000 |
    | 1960-1973 | > 20000               |    36.412166597000000 |
    | 1960-1973 | Surface 1000          |  1305.662688639000000 |
    | 1974-1989 | 10000-19999           |    76.006791011000000 |
    | 1974-1989 | 5000-9999             |   207.336184214000000 |
    | 1974-1989 | <1000                 | 15797.163031684000000 |
    | 1974-1989 | > 20000               |    70.130656813000000 |
    | 1974-1989 | Surface 1000          |  2514.735883353000000 |
    +-----------+-----------------------+-----------------------+
    10 rows in set (0.03 sec)
    Ce que je comprends pas c'est que avec phpmyadmin ça marche... J'ai regardé un peu les sources ça utilises bien les commandes mysqli_xxx

  7. #7
    Membre habitué

    Profil pro
    Inscrit en
    Février 2005
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 317
    Points : 183
    Points
    183
    Par défaut
    Bon, c'est sans doute un bug, car après mise à jour du serveur vers la version 5.5 depuis le repository dotdeb, tout rentre dans l'ordre

    Merci pour l'aide en tous cas.

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    On ne saurait jamais pourquoi dans phpmyadmin ca fonctionnait.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre habitué

    Profil pro
    Inscrit en
    Février 2005
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 317
    Points : 183
    Points
    183
    Par défaut
    Petite mise à jour. Je penses savoir pourquoi ça marchait dans PHPMyAdmin. J'ai eu un soucis similaire pour des valeurs qui n'étaient pas groupées, et cela venait du fait que j'encodais mes données en UTF-8 à cause d'accents depuis ma page PHP. Lorsque que je faisait un copier/collé dans php my admin, je perdais du coup l'encodage. Peut être donc que le soucis venait de l'encodage et que cela a été résolu après passage à MySQL 5.5

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

Discussions similaires

  1. Supprimer le double backslash dans les résultats SQL
    Par stephane.julien dans le forum C#
    Réponses: 12
    Dernier message: 24/09/2007, 10h53
  2. Réponses: 9
    Dernier message: 14/09/2007, 11h31
  3. Résultat de prostoc dans Sql
    Par maxikat dans le forum SQL
    Réponses: 8
    Dernier message: 11/06/2007, 12h19
  4. [SQL] Recherche dans le résultat d'une requête
    Par Ekik dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 15/03/2007, 10h32
  5. [MySQL] Affichage de résultats SQL dans un tableau
    Par illight dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 14/02/2007, 09h24

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