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 :

[SQL] Problème mettre à jour les enregistrements de la BDD


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 175
    Points : 60
    Points
    60
    Par défaut [SQL] Problème mettre à jour les enregistrements de la BDD
    Bonjour,

    Voilà j'ai une BDD avec plus de 800 enregistrements et je dois tous les mettre à jour. Il n'est pas question que je le fasse manuellement donc j'aimerais savoir comment le faire pour tous en une seule fois.

    Dans cette base j'ai un champ avec la taille le problème c'est que j'ai enregistré les valeurs comme ça : 100 cm, 110 cm, 120 cm... or je voudrais avoir juste des valeurs numériques et donc remplacé 100 cm par 100, 120 cm par 120 etc...

    Comment dois-je m'y prendre?

    Merci d'avance pour votre aide

  2. #2
    Membre éclairé Avatar de nako
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2003
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2003
    Messages : 577
    Points : 663
    Points
    663
    Par défaut
    Salut, est-ce que tous tes enregistrements sont comme ça ?
    c'est à dire composés d'un nombre de 3 chiffres, puis un espace, puis la chaine "cm" ?
    Dans ce cas là ça devrait pas être trop dur, mais as-tu des nombres plus petits que 100 ?
    Le cas échéant, sont-ils écrits "080 cm" ou "80 cm" ?
    Nako.

  3. #3
    Expert éminent
    Avatar de titoumimi
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    3 707
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 707
    Points : 7 285
    Points
    7 285
    Par défaut
    petite idée comme ça : tu fait un select *, tu stoques le résultat dans un array.

    tu fait un explode sur le champ contenant ta longueur, avec comme séparateur espace, en ne gadans que le premier indice du tableau généré.

    il ne te reste plus qu'à tout re-injecter dans ta DB, et hop magie

  4. #4
    Membre averti Avatar de Space Cowboy
    Homme Profil pro
    chomeur
    Inscrit en
    Avril 2005
    Messages
    496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Avril 2005
    Messages : 496
    Points : 401
    Points
    401
    Par défaut
    Généralement, j'utilise php pour faire ce genre de truc. Je traite ligne par ligne en enregistrant directement à chaque ligne avec un update.

    <?php
    $chaine
    = '100 cm';
    $A=explode(' ',$chaine);
    // Tu devrait te retrouver avec
    echo $A[0]; // 100
    echo '<br/><br />';
    echo
    $A[1]; // cm

    ?>
    Si je me trompe pas. Après suffit de faire un update ...

  5. #5
    Membre éprouvé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 909
    Points : 1 014
    Points
    1 014
    Par défaut idem que Space Cowboy
    Tout est dans le titre. C'est la solution que j'utilise également et que j'allais proposer.

  6. #6
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Bonjour,

    Pour peut-être éviter un traitement BDD->Php->BDD, il serait utile de connaitre le serveur BDD que tu utilise ?

    En MySql, on peut utiliser INSTR et SUBSTRING pour faire ce genre de choses

    Bonne journée

  7. #7
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut, plutôt que de passer par un tableau un str_replace() ou REPLACE(str,from_str,to_str) serait plus simple ^^

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 175
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par nako
    Salut, est-ce que tous tes enregistrements sont comme ça ?
    c'est à dire composés d'un nombre de 3 chiffres, puis un espace, puis la chaine "cm" ?
    Dans ce cas là ça devrait pas être trop dur, mais as-tu des nombres plus petits que 100 ?
    Le cas échéant, sont-ils écrits "080 cm" ou "80 cm" ?
    Nako.
    J'ai des cas du genre 70 cm ou 80 cm

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 175
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par FCYPBA
    Bonjour,

    Pour peut-être éviter un traitement BDD->Php->BDD, il serait utile de connaitre le serveur BDD que tu utilise ?

    En MySql, on peut utiliser INSTR et SUBSTRING pour faire ce genre de choses

    Bonne journée
    J'utilise MySQP en effet

  10. #10
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Supposons alors que le champ a modifié s'appelle a, je pense que cela donnerait un truc dans ce genre

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE matable SET a=SUBSTRING(a,0,INSTR(a,' cm')) WHERE INSTR(a,'cm') > 0

    En gros bien sur. Je te conseille de faire un petit select de ceci avant pour vérifier

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SUBSTRING(a,0,INSTR(a,' cm')) FROM matable WHERE INSTR(a,'cm') > 0

    Bonne journée

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 175
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par Space Cowboy
    Généralement, j'utilise php pour faire ce genre de truc. Je traite ligne par ligne en enregistrant directement à chaque ligne avec un update.


    Si je me trompe pas. Après suffit de faire un update ...
    Ok merci. Je débute et je comprends ta solution en théorie mais je ne sais pas comment la mettre en pratique. Tu pourrais détailler un peu plus le code stp.

  12. #12
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Il faut juste que tu execute la requete update dans phpmyadmin par exemple.
    Pas besoin de php

    Par contre, je te conseille te faire un essai sur le select pour éviter de faire une fausse manip. Le select te permet de vérfier que cela fonctionne.

    Pour ce qui est du code SQL, il esta ssez simple, et similaire aux solutions que l'on t'a propposé en php

    Grace à INSTR, on trouve la position de la chaine ' cm' dans le champ.
    Ensuite avec SUSBTRING, on découpe le champ du début ( position 0 ) à la position de ' cm' renvoyé par INSTR

    Voilà

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 175
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par FCYPBA
    Il faut juste que tu execute la requete update dans phpmyadmin par exemple.
    Pas besoin de php

    Par contre, je te conseille te faire un essai sur le select pour éviter de faire une fausse manip. Le select te permet de vérfier que cela fonctionne.

    Pour ce qui est du code SQL, il esta ssez simple, et similaire aux solutions que l'on t'a propposé en php

    Grace à INSTR, on trouve la position de la chaine ' cm' dans le champ.
    Ensuite avec SUSBTRING, on découpe le champ du début ( position 0 ) à la position de ' cm' renvoyé par INSTR

    Voilà
    pardon j'avais pas vu ta solution. Merci

  14. #14
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Citation Envoyé par dolf13
    pardon j'avais pas vu ta solution. Merci
    Non, c'est moi, je pensais que tu me repondais.

    Il me faut un deuxième café ce matin

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 175
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par FCYPBA
    Non, c'est moi, je pensais que tu me repondais.

    Il me faut un deuxième café ce matin
    Bon j'ai utilisé la requête dans phpmyadmin

    voici la requete

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT SUBSTRING( `heightlist` , 0, INSTR( `heightlist` , ' cm' ) )
    FROM `matable`
    WHERE INSTR( `heightlist` , ' cm' ) >0
    LIMIT 0 , 30
    ca me donne bien le nombre d'enregistrements :
    Affichage des enregistrements 0 - 29 (472 total, traitement: 0.0113 sec.)

    Seulement au lieu de les afficher dans le tableau ca dit en 1ere ligne :

    SUBSTRING( `heightlist` , 0 , INSTR( `heightlist` , ' cm' ) )

    et ensuite toutes les lignes sont vides. C'esst normal?

  16. #16
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Je crois savoir pourquoi cela ne marche pas, les chaines doivent commencer à l'index 1 et non à l'index 0.

    Il te suffit de modifier le substring en remplaçant 0 par 1 .

    Il doit falloir également retrancher un caractère, pour ne pas capturer l'espace devant cm

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SUBSTRING( `heightlist` , 1 , INSTR( `heightlist` , ' cm' )-1 )

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 175
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par FCYPBA
    Je crois savoir pourquoi cela ne marche pas, les chaines doivent commencer à l'index 1 et non à l'index 0.

    Il te suffit de modifier le substring en remplaçant 0 par 1 .

    Il doit falloir également retrancher un caractère, pour ne pas capturer l'espace devant cm

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SUBSTRING( `heightlist` , 1 , INSTR( `heightlist` , ' cm' )-1 )
    Génial ca affiche bien les résultats voulus du style 167, 99. Je vais donc le faire pour de vrai cette fois

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 175
    Points : 60
    Points
    60
    Par défaut
    tu peux me dire si le code c bien ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE `matable` SET `heightlist`=SUBSTRING(`heightlist`,1,INSTR(`heightlist`,' cm')) WHERE INSTR(`heightlist`,'cm') > -1

  19. #19
    Membre éprouvé Avatar de FCYPBA
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    745
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 745
    Points : 952
    Points
    952
    Par défaut
    Ton update doit reprendre le code de ton select.

    Celui que tu me présentes semble correct mais je pense que tu va prendre un caractère de trop ( l'espace devant cm ).

    Ensuite, il faudrait ne mettre à jour que les enregistrements ne possédant pas cm ( mois de ligne à traiter ).
    Pour cela, il faut tester si le INSTR est supérieur à 0 car celui-ci renvoie 0 si la chaine n'est pas trouvé

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    UPDATE matable SET heightlist=SUBSTRING(heightlist,1,INSTR(heightlist,' cm')-1) WHERE INSTR(heightlist,' cm') > 0

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 175
    Points : 60
    Points
    60
    Par défaut
    ca a fonctionné parfaitement merci bien. Je dois encore le faire pour un champ. Le champ âge mais la ca se complique car le format est le suivant 1 an, 2 ans... mais j'ai aussi 'bébé' que je veux remplacer par 0. Je dois procéder en plusieurs fois non?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/12/2012, 07h07
  2. Réponses: 4
    Dernier message: 04/05/2008, 23h39
  3. [SQL Server 2000] obtenir les enregistrements de x à y
    Par Jahz dans le forum Langage SQL
    Réponses: 5
    Dernier message: 13/03/2006, 12h22
  4. [VBA-E] comment ne pas mettre à jour les liaisons!
    Par max2245 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/12/2005, 12h05
  5. Mettre à jour les if et variable toute les x seconde.
    Par Guillaume602 dans le forum C++
    Réponses: 5
    Dernier message: 06/12/2005, 19h09

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