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écupérer dernier id et mettre à jour


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 23
    Points : 18
    Points
    18
    Par défaut Récupérer dernier id et mettre à jour
    Bonjour, je cherche un script ou un exemple pour récupérer le dernier id d'une table et ensuite faire une boucle pour mettre à jour un autre champs de cette même table en incrémentant(de 1) à partir de ce dernier ID.

    Cela serait du genre:

    id champ1 champ2 champ3 champ4 champ5 champid
    1
    2
    3...

    et donc crée un moyen pour récupérer le 3 et mettre dans champid pour l'id 1 , 3 puis mettre 4 pour l'id 2 etc..

    Je ne sais pas si on voit ce que je veux, mais je galère.. merci d'avance

  2. #2
    Membre confirmé
    Avatar de mathieugut
    Profil pro
    Webmaster
    Inscrit en
    Mars 2008
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2008
    Messages : 225
    Points : 476
    Points
    476
    Par défaut
    Salut,

    Bien si tes id se suivent, il y a peut être une manière plus facile de remplir le champid lorsque tu mets à jour...

    Exemple tu as :

    id | champid
    1 ---- 5
    2 ---- 6
    3 ---- 7
    4 ---- 8
    5 ---- 9

    Comme tu peux le voir dans ce cas, il suffit de rajouter 4 pour obtenir le champid et pour obtenir le 4 il suffit de compter le nombre d'enregistrements et de lui enlever 1...

    Exemple, tu as 122 enregistrements, donc l'id n°122 qui doit se retrouver dans le champid de l'id n°1, bien tu fais 1+(122-1) = 122, 2+(122-1)=123...

    Avec une assez simple requête tu peux obtenir le nombre d'enregistrements.

    Bien entendu dans mon exemple il faut que les id se suivent et sans coupures...
    Bienvenue dans la matrice, attention à bien lire les règles...

    .::Mon espace perso developpez.com ::.

  3. #3
    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
    Un peu usine à gaz : on parcourt tous les enregistrements en les mettant à jour.
    Je ne sais pas bien ce que tu veux faire sur le fond, il faudrait peut etre revoir la conception de ta base.

    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
     
    // on cherche le dernier id en supposant que c'est le plus grand
    $sql = 'SELECT max(id) FROM table LIMIT 1';
    $sth = $dbc->query($sql);
    $maxid = $sth->fetchColumn();
     
    // on prepare la requete de mise à jour
    $sql = 'UPDATE table SET champid=:champid WHERE id=:id';
    $sth_updateid = $dbc->prepare($sql);
     
    // on démarre au plus grand id
    $champid = $maxid;
     
    // on lit toutes les lignes
    $sql = 'SELECT id from table';
    $sth = $dbc->query($sql);
     
    while ($data = $sth->fetch(PDO::FETCH_ASSOC)) {
     
    // on met à jour chaque ligne
    $sth_updateid->execute(array(':champid'=>$id,':id'=>$data['id']))
    $champid++
     
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  4. #4
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 33
    Points : 24
    Points
    24
    Par défaut
    sur quelle BD tu travailles, et quel est le type de ton champs??

    si il est AUTO_INCREMENT tu peux utiliser les fonctions suivantes:

    POSTGRESQL
    http://fr.php.net/manual/fr/function.pg-last-oid.php

    MYSQL
    http://fr.php.net/manual/fr/function...-insert-id.php

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    En faites je suis un peu perdu..pour tout expliquer, je dois importer des fichiers excels vers une base mysql. Alors j'ai arrivé à créer une application qui me permet de transformer les fichiers en .csv et ensuite les importer dans ma base de donnée. Mais mon souci vient du système des clés étrangères.
    Alors je "bricole" comme je peux pour essayer lors de l'insertion d'avoir quelquechose dans mes clé étrangères. Je peux donner une exemple:
    J'ai un fichier Excel contenant des personnes appartenant à un organisme avec le nom de ces personnes(appartenant à d'autres organismes), leurs adresses (entre autres).
    Dans ma base de donnée, j'aurais une table Adresse avec (IdAdresse, Adresse, CP, Ville, IdPersonne) et une table Personne(IdPersonne, Nom, Prenom).
    Pour cela, j'ai crée en php une application qui va me lire les premiers champs du fichier excel ( ce qui correspond au champ des tables ou qui peuvent correspondre) et je vais effectuer une comparaison de ces champs de cette première ligne avec ceux des champs de la table correspondante, puis j'insère mais pour la clé étrangère, j'ai un souci ( par exemple pour Adresse, idPersonne aura un champ nul puisque rien ne peut correspondre..)

    Je n'ai pas trouvé grand chose sur le net, pourtant je pense que cela a du déjà arrivé, Si quelqu'un aurait une idée, sur la façon de procéder.. fin merci d'avance et en faites oublier mon idée de récupérer l'id c'était une trés mauvaise idée

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Commençons par la conception...
    J'ai un fichier Excel contenant des personnes appartenant à un organisme avec le nom de ces personnes(appartenant à d'autres organismes), leurs adresses (entre autres).
    Selon moi, tu as une entité Personnes et une entité Organismes.
    Si je comprends bien le sens de ta première parenthèse, une personne peut appartenir à plusieurs organismes. On a donc la relation :
    Personnes -0,n----Appartenir----0,n- Organismes

    On peut aussi faire une entité contenant les adresses comme tu le prévois, puisque un organisme ou une personne peut avoir plusieurs adresses(d'établissement pour l'organisme, de résidence principale ou secondaire pour la personne).
    Ce qui donne les relations :
    Personnes -0,n----Résider----0,n- Adresses
    Organismes -0,n----Être établi----0,n- Adresses
    Personnes -0,n----Appartenir----0,n- Organismes

    A noter qu'on peut aussi séparer les villes et les pays et les relier aux adresses, selon ce schéma :
    Adresses -1,1----Domicilier----0,1- Villes -1,1----Situer---0,n- Pays

    Ce qui nous donnerait les tables :
    Personnes(PersId, PersNom, ...)
    Organismes(OrgId, OrgNom, ...)
    Pays(PaysId, PaysNom, ...)
    Ville(VilleId, FK_VPays, VilleNom, ...)
    Adresses(AdrId, FK_AVille, ...)
    PersAdr(FK_PAPersonne, FK_PAAdresse, PAType, ...)
    OrgAdr(FK_OAOrganisme, FK_OAAdresse, OAType, ...)
    PersOrg(FK_POPersonne, FK_POOrganisme, ...)

    Parlons ensuite de la méthode...
    je dois importer des fichiers excels vers une base mysql. Alors j'ai arrivé à créer une application qui me permet de transformer les fichiers en .csv et ensuite les importer dans ma base de donnée.
    J'ai un fichier Excel contenant des personnes appartenant à un organisme avec le nom de ces personnes(appartenant à d'autres organismes), leurs adresses (entre autres).
    Importe ta ou tes tableaux Excel en brut dans des tables MySQL ayant les mêmes colonnes. Tu détruiras ces tables plus tard.
    Crée la structure de tes tables définitives avec phpMyAdmin ou tout autre outil qui te convient, y compris les index et contraintes de clés étrangères. Bien sûr pour que ça marche, il faut faire ça dans un certain ordre, par exemple l'ordre que j'ai proposé ci-dessus.

    Ensuite tu peux tranquillement créer des requêtes MySQL qui vont insérer les données de tes tables brutes importées d'Excel vers tes tables définitives.
    Un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO Personnes(PersNom, PersPrenom, {autres colonnes récupérables}...)
    SELECT DISTINCT(Nom, Prenom), {autres colonnes que tu peux récupérer en même temps}
    FROM taTableImportéeDExcel
    ORDER BY Nom, Prenom
    Bien sûr une analyse des données s'impose au préalable :
    - N'y a t-il pas plusieurs personnes différentes avec le même nom et le même prénom ?
    - Le prénom est-il renseigné pour toutes les personnes afin d'en faire un critère discriminant ?
    - N'y a t-il pas une autre colonne qui permet d'identifier de manière unique une personne ? Un n° d'adhérent par exemple.

    Bon courage !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Merci à vous pour vos réponses. J'ai appliqué l'idée de Cinephil, mais j'ai un autre problème (oui je sais j'ai du mal..) . C'est au niveau des mises à jours, car je peux avoir des mêmes fichiers excel avec d'autres données, mais comment faire pour mettre à jour les données ou les insérer? Il faudrait parcourir le fichier csv en même temps que la base de données? Quelqu'un aurait un exemple de ce genre de pratique, merci d'avance

    bonne journée

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Je ne suis pas sûr de comprendre mais je suppose que tu veux dire que tu as d'autres fichiers Excel qui concernent les mêmes personnes avec des données modifiées ?
    Même système : tu importes le fichier dans une table MySQL que tu effaceras plus tard puis tu UPDATE tes tables réelles avec les nouvelles données en faisant des jointures avec les éléments qui te permettent de d'identifier les individus dans la table importée.

    Si le couple (nom, prenom) est l'identifiant unique de la table importée, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE Personnes
    SET ColonneAModifier = 
      (SELECT ColonneAvecLaBonneValeur
       FROM TableImportee
       WHERE nom = PersNom AND prenom = PersPrenom)
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    En faites, le but est de passer entièrement sous mysql, mais des fichiers excels contenant des données à peu prés équivalente peuvent arriver, et il faut que ces personnes puissent utiliser mon outil facilement et qu'il n'est pas de souci.
    Mais il faut que cet outil réalise l'insert ou l'udpate en même temps, car dans ces fichiers ils se peut qu'il y ait des données à insérer et d'autres à mettre à jour..
    Je pensais faire une boucle regardant les premiers champs et si c'était les mêmes, je mets à jour les autres champs sinon je continue et si je n'ai pas trouvé les données correspondantes, j'insert à la fin, je ne sais pas si je suis bien parti et j'ai quelques soucis à mettre cela en place...

    merci d'avance,
    bonne journée

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 793
    Points : 34 024
    Points
    34 024
    Billets dans le blog
    14
    Par défaut
    Dangereux comme méthode !
    Imagine qu'une ligne déjà enregistrée soit plus complète que celle qui arrive dans un nouveau fichier ?

    Le plus important est de bien définir dans les fichiers Excel ce qui permet d'identifier de manière unique chaque enregistrement. S'il y a un numéro d'identifiant, c'est super. S'il n'y en a pas, le nom et le prénom peuvent être insuffisant. Ouvre un annuaire pour t'en convaincre.

    Ensuite, les nouveaux fichiers Excel qui arrivent auront-ils tous la même structure ?
    - Oui ==> Ouf ! On va peut-être pouvoir faire quelque chose.
    - Non ==> Laisse tomber l'idée d'un truc automatisé, il y aura toujours un cas foireux. Par contre il y a un marché à prendre pour faire l'insertion des fichiers dans la base au coup par coup ! Ou alors impose le fait que les nouvelles données devront être enregistrées avec l'appli MySQL que tu développes et/ou la structure des fichiers Excel futurs en disant bien que dans le cas contraire ça ne marchera jamais.
    Un simple exemple :
    - Dans les fichiers que tu dois importer aujourd'hui, tu as une colonne Nom et une colonne Prénom. Tu développes un truc automatique pour importer les données dans ta BDD en te basant sur cette structure. Dans quelques temps, un fichier Excel arrive avec seulement une colonne Nom qui est en fait la concaténation du Nom et du Prénom. Ta moulinette est en rade !

    Il faut aussi faire gaffe à ce que l'on met à jour, au delà du simple respect de l'intégrité de la base de données (clé étrangères par exemple). Tu pourrais te retrouver avec des données incohérentes même en respectant le schéma de la base de données si toutes les contraintes ne sont pas codées dans la base de données.

    Cherche dans les messages que j'ai postés sur le forum, tu trouveras quelques exemples de requêtes qui ont trait au même genre de problème que le tien, même si chez moi tout était en MySQL.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Récupérer des données et mettre à jour automatiquement un tableau
    Par sooapy dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 12/01/2014, 23h00
  2. Réponses: 1
    Dernier message: 16/12/2011, 06h51
  3. [Red Hat 9] Mettre à jour Kerberos par la compilation des dernieres sources dispo
    Par arnaudperfect dans le forum RedHat / CentOS / Fedora
    Réponses: 0
    Dernier message: 04/06/2010, 12h00
  4. Réponses: 1
    Dernier message: 10/02/2009, 09h36
  5. Réponses: 6
    Dernier message: 14/02/2003, 17h52

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