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 :

auto incrémentation de variable [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 58
    Points : 24
    Points
    24
    Par défaut auto incrémentation de variable
    bonjour je suis face a un problème que je n'arrive pas a résoudre. Je vais essayer d’être le plus clair possible dans mon explication

    (ma base est faite sur phpMyAdmin)

    je dispose d'une table CODIFICATION (NATURE, CODE , LIBELLE) et je fais saisir a un utilisateur via un formulaire une NATURE et un LIBELLE. Suite a cela je dois ajouter via une requête UPDATE ses 2 information a ma table et le CODE dois s'incrémenter en fonction de NATURE .

    exemple de ce que ça doit faire:

    NATURE | CODE | LIBELLE
    ------------------------------
    médecin | 1 | chirurgien
    médecin | 2 | cardiologue
    employer prod | 1 | chef de projet
    commercial | 1 | representant (nom de l'entreprise)
    commercial | 2 | representant (nom d'une autre entreprise)

    et si je ne me trompe pas en mettant auto incrémente pour l'attribut CODE même si la nature est différente il incrémente systématiquement CODE non?

    je vous remercie d'avance pour les éventuelles solution

  2. #2
    Membre averti

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 205
    Points : 409
    Points
    409
    Billets dans le blog
    1
    Par défaut
    (ma base est faite sur phpMyAdmin)
    phpMyAdmin n'est qu'un outil, ta base de données est sous le SGBD MySQL en réalité.

    L'autoincrémente incrémentera systématiquement ton code oui, indépendamment des autres champs !
    Pour faire ce que tu veux, il te faut d'abord récupérer le nombre maximum d'élément que tu as en base (avec une requête de type SELECT MAX(CODE) FROM ... WHERE NATURE = MA_Nature) et l'incrémenter avant l'insertion en base.
    Tu peux très bien le faire en PHP au moment de l'insertion (ou via une sous requête, mais c'est déjà plus compliqué et pas forcément plus optimisé)
    si ce post vous a été utile, si votre problème est résolu.
    Pensez-y !
    __________________________________
    Doc officielle PHP | FAQ PHP | Cours PHP

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 58
    Points : 24
    Points
    24
    Par défaut
    oui désoler j'aurai du dire que c'était sous MySQL mais je voulais préciser l'outil pour au cas ou il y est un paramètre qui me permette de gérer ça sans bidouiller en php .

    Donc si j'ai bien compris je laisse mon champ CODE en int et dans le code php je récupère ça valeur max en fonction de NATURE pour l'incrémenter manuellement et faire mon INSERT après (je viens de me rendre compte que j'ai mis UPDATE dans mon premier post désoler).

    il n'y a pas d'autre moyen plus optimiser pour faire cela? (du genre mysql_fetch_object ou autre chose?)

  4. #4
    Membre averti

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 205
    Points : 409
    Points
    409
    Billets dans le blog
    1
    Par défaut
    Tu peux attendre d'avoir d'autres réponses, sait-on jamais, il y a peut être une méthode plus simple à laquelle je n'ai pas pensé, mais je n'en vois que deux pour le moment :
    - celle que tu décris, en PHP
    - le passage par une sous-requête, qui ne fonctionne de mémoire que sur les versions les plus récentes de MySQL (à confirmer).
    Ça consisterai à modifier ta requête SQL d'insertion pour avoir quelque chose qui ressemblerai à :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    INSERT INTO `codification`(NATURE, COUNT)
    VALUES (:NATURE, (SELECT MAX(COUNT)+1 FROM `codification` WHERE NATURE = :NATURE))
    si ce post vous a été utile, si votre problème est résolu.
    Pensez-y !
    __________________________________
    Doc officielle PHP | FAQ PHP | Cours PHP

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 58
    Points : 24
    Points
    24
    Par défaut
    ok merci je vais faire comme ça on verra bien ^^

  6. #6
    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
    La vraie question est je pense : pourquoi veux-tu faire ça ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 58
    Points : 24
    Points
    24
    Par défaut
    et la réponse est parce que mon maître de stage veux a tout prix que je fasse ça -_-" (j'ai essayer de négocier en lui proposant d'autre méthode mais il est plutôt têtu on va dire)

    d’après lui c'est mieux dans le cas ou il faut rajouter de nouvelle codification et si l'entreprise s'agrandi et qu'il faut crée de nouveau type de salarier (via le libellé )

  8. #8
    Membre actif Avatar de FadeToBlack
    Homme Profil pro
    ...
    Inscrit en
    Août 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : ...
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2010
    Messages : 311
    Points : 202
    Points
    202
    Par défaut
    Salut,

    Ne serait-il pas plus commode de faire une autre table a côté, héritant de la première, avec les spécialisation de chaque profession ? Du coup tu pourrais organiser tes auto-incrémentations plus facilement et surtout sans t'en soucier.

    Cela laissera aussi la place à la création de nouvelles professions et/ou spécialisations voir même leur destruction
    Douter de tout, toujours, et surtout de soi-même...

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 58
    Points : 24
    Points
    24
    Par défaut
    surement mais je suis contrains de faire ce que j'ai cité plus haut et j'avoue que ça m’embête bien (pour rester poli) et je vais d'erreur en erreur sans réussir a résoudre les problèmes >.<

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 58
    Points : 24
    Points
    24
    Par défaut
    c'est bon j'ai fini par faire au plus simple avec un mysql_num_rows et j'ai incrémenter le résultat pour l'ajouter par la suite. C'est dommage d'être obliger de faire a la lettre ce qu'il veux car j'aurai bien aimer faire quelque chose d'un peux plus propre et moins bidouille

    merci pour votre aide ^^

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 58
    Points : 24
    Points
    24
    Par défaut
    désoler pour le triple post mais bon a mon grand regret ma méthode ne conviens pas au attente de mon maître de stage. j'ai essayer avec mais ça me retourne un id#4 au lieu de 1 ou 2 suivant le les valeur déjà enregistrer dans la base. Donc je ne vois pas d'autre solution si quelqu'un en a une je suis preneur (au cas échéant je ne lui laisserai plus le choix et il sera bien forcer de faire avec ce que j'ai mis en oeuvre) merci d'avance

  12. #12
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Bonjour,

    quand tu fait un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(CODE)+1 FROM `codification` WHERE NATURE = :NATURE
    où :NATURE correspond à médecin ou autre sa ne te renvoi pas le code le plus haut+1 pour la nature choisit ?
    une réponse vous a permis d'avancer ?

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 58
    Points : 24
    Points
    24
    Par défaut
    non et c'est bien ça que je ne comprend pourquoi . Ça me renvoi id#4 et quand je met le +1 ça me met 5 a chaque fois

  14. #14
    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
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    sincèrement je m'inquiète pour ton maitre de stage... et donc pour toi...

    déjà ta structure de table ne va pas ne cerait-ce que parce que nature devrait être une clé étrangère qui pointe sur une table qui liste les différentes natures possible

    ensuite quel est le besoin de cette colonne code? faire une usinage à gaz pénible à maintenir?

    c'est pas pour rien qu'on est plusieurs à poser la question...

    là faut je pense que tu nous dises comment c'est utilisé dans tes autres tables
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  15. #15
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 58
    Points : 24
    Points
    24
    Par défaut
    je m’inquiète pour moi aussi XD quand je vois la tête de la bdd que je dois manipuler....

    le CODE permet de donner une valeur numérique au libeller vue qu'une codification est défini par une nature et un code (donc un libeller).

    nature + code sont utiliser dans une table ETABLISSEMENT, PERSONNE, LOT, MATERIEL_RADIO, REFERENCE_COMPOSANT (dans cette table nature et code sont utiliser pour plusieurs variable). Je vous l'accorde c'est une usine a gaz relativement complexe et difficile (ou contrainiante ) a manipuler.

    en exemple dans PERSONNE la codification (NATURE,CODE) servent a attribuer une nature civil, un code civil ou encore une nature fonction et un code fonction. ca fait beaucoup de contrainte a mon goût et corriger moi si je me trompe mais il aurait été plus simple de traiter certaine des ses info directement dans certaine table (comme la civilité ).

    désoler de vous embêter avec ça mais ça me pose pas mal de problème

  16. #16
    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
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    c'est ce que je disais pour nature déjà ... et du coup une pauvre clé primaire avec du texte dedans...

    je suis à peu près sur que ça peut être entièrement remanié et simplifié...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  17. #17
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 58
    Points : 24
    Points
    24
    Par défaut
    je dirais même que toute la base peux être remanier et simplifier mais malheureusement je n'ai pas trop mon mot a dire :s . Pour l'histoire de l'auto incrémentation je pense que je vais laisser avec la solution que j'avais trouver
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $req1 ="SELECT CODE FROM CODIFICATION WHERE NATURE='".$nature."'" ;
    	$resultat1=mysql_query($req1);
    	$nrows=mysql_num_rows($resultat1);
    car si j'essai de faire comme il souhaite on peux dire que ça n'aboutira jamais et je prend du retard sur ce que je suis censé faire en plus

    Au vue de ca je pense que je vais être amener a reposter pour d'autre problème je pense ^^

  18. #18
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $request = "INSERT INTO CODIFICATION  (NATURE, CODE, LIBELLE)
    SELECT '". $nature ."'  CODE + 1 as nouveau_code, '" . $libelle . "'  FROM CODIFICATION WHERE NATURE='". $nature ."' ORDER BY code DESC LIMIT 0,1;
    un truc du style devrait marcher, par contre au niveau des accès concurrentiels c'est pas tip top, je pense qu'il va avoir beaucoup de pb dans un futur proche, sauf si ton appli n'est utilisé que par 2 personnes qui ne l'utilise pas en même temps.

  19. #19
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 127
    Points : 208
    Points
    208
    Par défaut
    Bonjour,

    Si je puis apporter ma contribution, voici une autre piste que je propose qui serait ma solution si j'avais à choisir (avec la contrainte pas d'autre table créée bien sûr) : le trigger.

    Cette solution a été TESTEE, donc marche :

    Ma table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE `codification` (
      `NATURE` varchar(20) NOT NULL,
      `CODE` int(11) NOT NULL DEFAULT '0',
      `LIBELLE` varchar(35) DEFAULT NULL,
      PRIMARY KEY (`NATURE`,`CODE`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    Mon trigger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DELIMITER //
      CREATE TRIGGER `basetestb`.`T_calc_code` BEFORE INSERT
        ON basetestb.codification FOR EACH ROW
    BEGIN
        SET New.CODE = (SELECT COALESCE(MAX(c.CODE),1)
        FROM codification c
        WHERE c.NATURE = New.NATURE);
    END//
    DELIMITER ;
    Résultat de l'insert suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO codification (NATURE, LIBELLE)
    VALUES
    ('medecin','chirurgien'),
    ('medecin','cardiologue'),
    ('employer prod','chef de projet'),
    ('commercial','representant (nom de l''entreprise)'),
    ('commercial','representant (nom d''une autre entreprise)')
    ;
    ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    NATURE	CODE	LIBELLE
    commercial	1	representant (nom de l'entreprise)
    commercial	2	representant (nom d'une autre entreprise)
    employer prod	1	chef de projet
    medecin	1	chirurgien
    medecin	2	cardiologue
    Pour moi, cette solution, présente plusieurs avantages :
    1 elle est transparente au niveau du php
    2 elle est "safe" puisque transactionnelle
    3 elle ne dépend pas du client et préserve donc l'intégrité de la base
    4 elle est élégante (ça c'est subjectif, d'accordmais c'est mon avis)

    N.B ne pas oublier de modifier le DELIMITER pour insérer le trigger comme ci-dessus, sinon ça ne passe pas
    Cordialement

  20. #20
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2013
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2013
    Messages : 58
    Points : 24
    Points
    24
    Par défaut
    merci pour le code ça m'aide beaucoup
    mais ça m'affiche une erreur de duplicité de la clé primaire et ne fais pas le +1 voici l'erreur afficher:

    ErreurDuplicate entry 'medecin-1' for key 'PRIMARY' : Duplicate entry 'medecin-1' for key 'PRIMARY'

    et voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            $nature=$_POST['nature_codification'];
    	$libelle=$_POST['libelle_codification'];
    	$req1 = "INSERT INTO CODIFICATION (nature,libelle) VALUES('$nature','$libelle')";
    	$resultat1= mysql_query($req1) or die ('Erreur'.mysql_error().' : '.mysql_error());
     
    	echo"<form method='post' action='creer_Codification.php'>";
    		echo"<center>la codification a bien été crée <br/>";
    		echo"<input type='submit' value='OK' />";
    		echo"</center></form>";

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

Discussions similaires

  1. Variable auto incrément
    Par kroma23 dans le forum InterBase
    Réponses: 1
    Dernier message: 01/11/2013, 14h35
  2. variable auto-incrémentées mois +1
    Par PAYASS59 dans le forum PL/SQL
    Réponses: 3
    Dernier message: 01/03/2011, 14h44
  3. [CODE] auto incrémentation ?
    Par Roi dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 25/09/2003, 15h09
  4. [débutant][xsl]incrémenter une variable
    Par guitalca dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 01/04/2003, 15h19
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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