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 :

trim ne fonctionne pas ni en mysql ni en php [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Par défaut trim ne fonctionne pas ni en mysql ni en php
    Bonjour,

    J'ai dans une base mysql des données qui contiennent des espaces en début de chaîne. J'ai donc tenté un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE `ma_table`
    SET `champ_a_corr`= TRIM(`champ_a_corr`)
    Mais ça n'a pas marché

    J'ai essayé avec une fonction PHP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    $TxtReq = "SELECT `id`, `champ_a_corr`
      FROM `ma_table`
    ";
    $res_req = mysql_query($TxtReq);
    while(list($id, $nom) = mysql_fetch_row($res_req)) {
      $TxtReq2 = "UPDATE `ma_table`
        SET `champ_a_corr` = '" . trim($nom) . "'
        WHERE `id` = $id
      ";
      $res_req2 = mysql_query($TxtReq2);
    }
    ?>
    Je précise que j'ai vérifié que les espaces n'étaient pas des caractères d'affichage d'espace (comme &nbsp; par ex.), que la collation est en latin1_swedish_ci, et que j'ai essayé de la passer aussi en UTF8, mais que ça ne change rien, et enfin qu'un traitement manuel champ par champ avec phpmyadmin marche.

    Je bloque vraiment, je ne comprends pas ce qui ne va pas (et pourtant je me débrouille bien d'habitude à la fois en PHP et en MySql)

    Merci à vous pour vos idées

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 327
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 327
    Billets dans le blog
    17
    Par défaut
    Poste ici un extrait d'export de la BdD.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Par défaut
    Voilà :
    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
    -- phpMyAdmin SQL Dump
    -- version 3.4.9
    -- http://www.phpmyadmin.net
    --
    -- Host: localhost
    -- Generation Time: Apr 01, 2012 at 05:09 PM
    -- Server version: 5.5.20
    -- PHP Version: 5.3.9
     
    SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
    SET time_zone = "+00:00";
     
     
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;
     
    --
    -- Database: `lc`
    --
     
    -- --------------------------------------------------------
     
    --
    -- Table structure for table `pb_trim`
    --
     
    CREATE TABLE IF NOT EXISTS `pb_trim` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `champ_a_corr` varchar(127) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
     
    --
    -- Dumping data for table `pb_trim`
    --
     
    INSERT INTO `pb_trim` (`id`, `champ_a_corr`) VALUES
    (1, '**Mme**Jeanne-Claude**CANISSE'),
    (2, '**M.**Michel**SILVANY'),
    (3, '**Mme**Albertine**FERNANDEZ'),
    (4, '**M.**Bernard**JEANSAUME'),
    (5, '**M.**Joël**TROJAR');
    Ce qui est bizarre, c'est que lorsque je fais un aperçu là maintenant avant de poster le message, ce qui apparait est en rouge avec des ** à la place des espaces...
    Idem sans la balise code : (1, '**Mme**Jeanne-Claude**CANISSE')

    Sous Geany (mon éditeur), j'ai des espaces à l'écran.
    Sous Bluefish (autre éditeur), j'ai des caractères spéciaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (1, 'Â*Â*MmeÂ*Â*Jeanne-ClaudeÂ*Â*CANISSE'),
    Sous vi j'ai également des espaces.

    (Ça fait des années que je suis sous linux, et des années que je programme, et ça ne m'a jamais fait ça)

    Je pense qu'il doit exister des caractères alternatifs aux espaces (quel codage ?) et que ce sont eux qu'il faut remplacer.

    C'est vraiment bizarre, merci pour vos idées

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Par défaut
    J'ai essayé de remplacer ces "faux" espaces par des vrais (boucle if qui suit le while):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while(list($id_cand, $nom) = mysql_fetch_row($res_req)) {
      if($nom[0] != 'M') {
        $esp_spec = $nom[0];
        $nom = str_replace($esp_spec, ' ', $nom);
        echo "<p>Espace special : $esp_spec (nom = $nom)</p>";
      }
      $TxtReq2 = "UPDATE `pb_trim`
        SET `champ_a_corr` = '" . trim($nom) . "'
        WHERE `id` = $id_cand
      ";
      $res_req2 = exe_req($TxtReq2);
    }
    Et là, ces espaces spéciaux sont reconnus, mais incomplètement remplacés. Affichage Html (balise echo) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Espace special : � (nom = �Mme � �Jeanne-Claude � �CANISSE)
    Et un aperçu dans la base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ?Mme ? ?Jeanne-Claude ? ?CANISSE
    (Le trim marche puisqu'il efface l'espace précédent le point d'interrogation)

    Mais là encore je ne comprends pas bien pourquoi le str_replace ne fonctionne qu'incomplètement, en rajoutant le caractère spécial � (correspond à l'écran au losange noir avec un point d'interrogation à l'intérieur)

  5. #5
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 327
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 327
    Billets dans le blog
    17
    Par défaut
    Tu as sûrement enregistré du UTF-8 alors que ta BdD est en ISO-8859-1.
    Cf. les fonctions de conversions UTF-8 => ISO-8859-1 de PHP/MySQL.

  6. #6
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    l'espace est dans les 2 codages avec la même valeur... la valeur 32 ou 20 en hexa

    la question est donc avec quoi tu as saisi le contenu? un formulaire? csv?

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Par défaut
    Citation Envoyé par ericd69 Voir le message
    la question est donc avec quoi tu as saisi le contenu? un formulaire? csv?
    Merci pour vos pistes :
    j'avais utilisé une extraction avec imacros et je remplissais un formulaire php qui enregistrait (déjà avec un trim qui ne marchait pas) dans ma base de données (tout est de ma fabrication).

    J'ai l'impression qu'il existe des caractères similaires aux espaces, mais qui n'en sont pas. Par ex. pour éviter des extractions ?

    J'ai testé également ces caractères avec les expressions régulières [[:blank:]] mais sans succès (vraiment bizarre)

    Pour l'instant, je me sers d'expressions régulières pour déterminer les mots entre ces fameux espaces. Je contourne le problème, mais je crois qu'on peut laisser le sujet ouvert, pour trouver une solution contre ces fameux "espaces"

  8. #8
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    essaye de déterminer le charset du truc d'origine... ensuite ça te donnera une piste pour trouver si c'est le code d'un espace insécable ou d'une tabulation ou autre...

    pour info sous windows le charset est cp1552 ou un truc du genre...

    et de l'ut8 avec bom te glisse 2 caractères hors valeur de codage utilisables pour dire le sens de codage en début de texte...

    sinon avec la séquence de caractère tu peux les virer avec un simple str_replace...

    regarde du coté des fonctions qui commencent par mb_ (multibytes) pour essayé de reconnaitre le charset ou manipuler ces chaines...

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 144
    Par défaut
    Merci Éric,
    Je vais rechercher cette histoire de charset.

    Par contre, j'avais déjà tenté de récupérer ce caractère inconnu et de le supprimer par str_replace, mais en vain, ça ne marchait pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ma_chaine = str_replace($ma_chaine[0], '', $ma_chaine);

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

Discussions similaires

  1. [WD19] hchangeconnexion ne fonctionner pas avec base mysql
    Par ecoinfo dans le forum WinDev
    Réponses: 6
    Dernier message: 14/12/2014, 23h49
  2. La fonction "source" de MySQL ne fonctionne pas
    Par muad'dib dans le forum JDBC
    Réponses: 14
    Dernier message: 15/01/2007, 17h25
  3. Réponses: 3
    Dernier message: 02/12/2006, 16h10
  4. mysql rand() ne fonctionne pas
    Par renaud26 dans le forum Requêtes
    Réponses: 4
    Dernier message: 28/09/2006, 16h54
  5. Requete qui ne fonctionne pas sur toutes les versions de MySQL
    Par goldorax113 dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/06/2006, 11h04

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