Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/10/2006, 02h01   #1
Nouveau Membre du Club
 
Inscription : mai 2006
Messages : 175
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 175
Points : 30
Points : 30
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
dolf13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2006, 09h16   #2
Membre chevronné
 
Avatar de nako
 
Ingénieur développement logiciels
Inscription : août 2003
Messages : 581
Détails du profil
Informations personnelles :
Localisation : France

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

Informations forums :
Inscription : août 2003
Messages : 581
Points : 635
Points : 635
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.
nako est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2006, 09h22   #3
Expert Confirmé
 
Avatar de titoumimi
 
Inscription : décembre 2003
Messages : 3 717
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : décembre 2003
Messages : 3 717
Points : 3 082
Points : 3 082
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
__________________
Globalement inoffensif
Merci de respecter les règles du forum.
Aucune question technique par MP !
_______________________________________________________________________
La rubrique Ruby / Rails recrute. Contactez moi !
_______________________________________________________________________
Cours Ruby et Ruby on Rails (RoR) - FAQ Ruby / Rails - Livres Ruby / Rails
Ajax facile avec Ruby on Rails, Prototype, script.aculo.us et les RJS
Tutoriaux HTML/CSS et PHP
titoumimi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2006, 09h56   #4
Membre éclairé
 
Avatar de Space Cowboy
 
Inscription : avril 2005
Messages : 495
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 495
Points : 306
Points : 306
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.

Citation:
<?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 ...
Space Cowboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2006, 09h59   #5
Membre chevronné
 
David DRAPEAU
Consultant OpenERP
Inscription : juin 2003
Messages : 807
Détails du profil
Informations personnelles :
Nom : David DRAPEAU

Informations professionnelles :
Activité : Consultant OpenERP

Informations forums :
Inscription : juin 2003
Messages : 807
Points : 728
Points : 728
Envoyer un message via MSN à zyongh Envoyer un message via Skype™ à zyongh
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.
zyongh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2006, 10h01   #6
Membre émérite

 
Avatar de FCYPBA
 
Inscription : novembre 2004
Messages : 735
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2004
Messages : 735
Points : 924
Points : 924
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
__________________
Pierre
1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
3. Un code rapide c'est bien, un code maintenable c'est mieux
...

Why was the font tag an orphan ? Because it didn't have a font-family.
FCYPBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2006, 10h06   #7
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 791
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 791
Points : 1 681
Points : 1 681
Salut, plutôt que de passer par un tableau un str_replace() ou REPLACE(str,from_str,to_str) serait plus simple ^^
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2006, 10h12   #8
Nouveau Membre du Club
 
Inscription : mai 2006
Messages : 175
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 175
Points : 30
Points : 30
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
dolf13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2006, 10h12   #9
Nouveau Membre du Club
 
Inscription : mai 2006
Messages : 175
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 175
Points : 30
Points : 30
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
dolf13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2006, 10h19   #10
Membre émérite

 
Avatar de FCYPBA
 
Inscription : novembre 2004
Messages : 735
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2004
Messages : 735
Points : 924
Points : 924
Supposons alors que le champ a modifié s'appelle a, je pense que cela donnerait un truc dans ce genre

Code SQL :
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 :
SELECT SUBSTRING(a,0,INSTR(a,' cm')) FROM matable WHERE INSTR(a,'cm') > 0

Bonne journée
__________________
Pierre
1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
3. Un code rapide c'est bien, un code maintenable c'est mieux
...

Why was the font tag an orphan ? Because it didn't have a font-family.
FCYPBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2006, 10h20   #11
Nouveau Membre du Club
 
Inscription : mai 2006
Messages : 175
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 175
Points : 30
Points : 30
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.
dolf13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2006, 10h26   #12
Membre émérite

 
Avatar de FCYPBA
 
Inscription : novembre 2004
Messages : 735
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2004
Messages : 735
Points : 924
Points : 924
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à
__________________
Pierre
1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
3. Un code rapide c'est bien, un code maintenable c'est mieux
...

Why was the font tag an orphan ? Because it didn't have a font-family.
FCYPBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2006, 10h32   #13
Nouveau Membre du Club
 
Inscription : mai 2006
Messages : 175
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 175
Points : 30
Points : 30
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
dolf13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2006, 10h41   #14
Membre émérite

 
Avatar de FCYPBA
 
Inscription : novembre 2004
Messages : 735
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2004
Messages : 735
Points : 924
Points : 924
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
__________________
Pierre
1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
3. Un code rapide c'est bien, un code maintenable c'est mieux
...

Why was the font tag an orphan ? Because it didn't have a font-family.
FCYPBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2006, 10h47   #15
Nouveau Membre du Club
 
Inscription : mai 2006
Messages : 175
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 175
Points : 30
Points : 30
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 :
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?
dolf13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2006, 10h56   #16
Membre émérite

 
Avatar de FCYPBA
 
Inscription : novembre 2004
Messages : 735
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2004
Messages : 735
Points : 924
Points : 924
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 :
1
2
 
SUBSTRING( `heightlist` , 1 , INSTR( `heightlist` , ' cm' )-1 )
__________________
Pierre
1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
3. Un code rapide c'est bien, un code maintenable c'est mieux
...

Why was the font tag an orphan ? Because it didn't have a font-family.
FCYPBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2006, 11h05   #17
Nouveau Membre du Club
 
Inscription : mai 2006
Messages : 175
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 175
Points : 30
Points : 30
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 :
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
dolf13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2006, 11h07   #18
Nouveau Membre du Club
 
Inscription : mai 2006
Messages : 175
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 175
Points : 30
Points : 30
tu peux me dire si le code c bien ca

Code :
1
2
 
UPDATE `matable` SET `heightlist`=SUBSTRING(`heightlist`,1,INSTR(`heightlist`,' cm')) WHERE INSTR(`heightlist`,'cm') > -1
dolf13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2006, 11h12   #19
Membre émérite

 
Avatar de FCYPBA
 
Inscription : novembre 2004
Messages : 735
Détails du profil
Informations personnelles :
Âge : 33
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : novembre 2004
Messages : 735
Points : 924
Points : 924
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 :
1
2
 
UPDATE matable SET heightlist=SUBSTRING(heightlist,1,INSTR(heightlist,' cm')-1) WHERE INSTR(heightlist,' cm') > 0
__________________
Pierre
1. Dans le manuel ( PHP, MySQL,..., rayez la mention inutile), tu te plongeras à deux fois plutôt qu'aucune.
2. Dans la doc php, tu liras attentivement les sections Chaines de caractères, Tableaux et Système de fichiers
3. Un code rapide c'est bien, un code maintenable c'est mieux
...

Why was the font tag an orphan ? Because it didn't have a font-family.
FCYPBA est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2006, 11h31   #20
Nouveau Membre du Club
 
Inscription : mai 2006
Messages : 175
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 175
Points : 30
Points : 30
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?
dolf13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h47.


 
 
 
 
Partenaires

Hébergement Web