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 :

generer matricule automatique pour etudiant [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mauritanie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Points : 113
    Points
    113
    Par défaut generer matricule automatique pour etudiant
    bonjour, je développe une application d'inscriptions des étudiants, pour cela je veux attribuer pour chaque étudiant un matricule mais je ne sais pas comment générer ce matricule, j ai pensé a utiliser la fonction random() mais
    cela m'arrange pas car j'aurai une génération aléatoire et peut être même qu'il y aura des doublons, je veux avoir ceci par exemple AB1000,AB1001,AB1002 ainsi de suite c'est à dire ça s incrémente.

    merci d'avance de votre aide .

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Si ton code commence toujours par deux lettres puis est toujours suivi d'un nombre, tu extrais les (longueur du code - 2) caractères, tu convertis la chaîne de chiffres obtenue en entier, tu cherches le max entier, tu y ajoutes 1, tu concatènes avec les lettres du début du code.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT CONCAT('AB', MAX(CAST(RIGHT(code, LENGTH(code) - 2) AS UNSIGNED)) + 1) AS nouveau_code
    FROM etudiant
    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 !

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mauritanie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Points : 113
    Points
    113
    Par défaut
    merci de ton aide , mais j ai pas compris plus de précisément sur l enregistrement du matricule dans la base de données merci d'avance

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    En fait, je pense que ma requête ne fonctionne pas comme ça directement mais c'était pour traduire un peu en SQL ce que j'avais écrit en français.

    Dans ta requête d'insertion d'un nouvel étudiant, pour lui affecter son matricule, il faut que tu utilises une requête de ce genre mais comme tu travailles directement sur la table dans laquelle tu vas insérer l'étudiant, il faut passer, avec le mauvais MySQL, par une table temporaire, ou peut-être par une vue.

    Pas le temps de développer ça maintenant.
    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 !

  5. #5
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    ben il te faut un générateur de sequence pour compter les élèves (genre une clé primaire en autoint /mysql) ou une sequence directement en oracle et les deux lettres sont pseudo constante.

    moi j'utiliserai une clé artificielle comme clée primaire en autoint qui par construction s'incrémente de 1 à chaque élève donc tant que pas d'effacement = pas de troux et qui est utilisé dans un second temps pour la construction du matricule avec le formatage qui va bien pour avoir une forme en AB000293 si désiré. ( AB+ clé primaire ).

    yep ça fait 2 clé uniques dans la table mais abondance de bien ne nuit pas (enfin ce n'est que mon avis). C'est un algo qui tourne 2 fois par an mais avec 10 secretaires en parallele max, non ? te fatigue pas trop alors.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mauritanie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par gene69 Voir le message
    ben il te faut un générateur de sequence pour compter les élèves (genre une clé primaire en autoint /mysql) ou une sequence directement en oracle et les deux lettres sont pseudo constante.

    moi j'utiliserai une clé artificielle comme clée primaire en autoint qui par construction s'incrémente de 1 à chaque élève donc tant que pas d'effacement = pas de troux et qui est utilisé dans un second temps pour la construction du matricule avec le formatage qui va bien pour avoir une forme en AB000293 si désiré. ( AB+ clé primaire ).

    yep ça fait 2 clé uniques dans la table mais abondance de bien ne nuit pas (enfin ce n'est que mon avis). C'est un algo qui tourne 2 fois par an mais avec 10 secretaires en parallele max, non ? te fatigue pas trop alors.

    merci bien, mais comment je vais combiner la clé primaire et la chaine AB pour former la matricule merci d'avance

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    C'est vrai que la solution de gene est plus simple !

    Il suffit de concaténer la clé primaire entière avec le début du matricule ('AB' dans ton exemple).
    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 !

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

    oui l'idée est simple:
    tu dois te poser une règle de génération


    genre: "aaaa-nnnnnnn-s" avec :
    • aaaa l'année
    • nnnnnnnn le numéroo d'inscription dans l'année
    • s le sexe m ou f

    admettons que ta table des étudiants soit:
    etudiants(
    id (clé primaire),
    arrivee (indexé),
    depart,
    nom,
    ...
    matricule)
    ta requête d'insertion est alors:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    insert into etudiants(arrivee,depart,nom,...,matricule)values
    (CURRENT_DATE,null,'machin',...,concat(year(CURRENT_DATE),'-',lpad(
      (select count(id)
      from etudiants
      where year(arrivee)=year(CURRENT_DATE))+1,6,'0'),
    '-m'));
    exemple utilisable dans un outils sql indépendamment de php...
    avec php on va utiliser efficacement l'index sur arrivee:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $a=date('Y');
    $s='m';
    $nom='machin';
    ...
    $req="insert into etudiants(arrivee,depart,nom,...,matricule)values
    (CURRENT_DATE,null,$nom,...,concat('$a-',lpad(
      (select count(id)
      from etudiants
      where arrivee between '$a-01-01' and '$a-12-31')+1,6,'0'),
    '-$s'))";
    à toi d'adapter à ta syntaxe de matricule que tu voudras
    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...

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mauritanie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Points : 113
    Points
    113
    Par défaut
    bonjour , merci de votre aide, pour tester votre requete j ai crée une table matricule(id,libelle) avec id autoincrement mais lorsque j' essaye d'inserer en utilisant cette requete

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    INSERT INTO matricule(libelle)VALUES
    (concat(year(CURRENT_DATE),'-',lpad(
      (SELECT count(id)
      FROM matricule
      WHERE year(CURRENT_DATE)=year(CURRENT_DATE))+1,6,'0'),
    '-m'));
    merci d'avance

    j'ai cette erreur


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    #1093 - You can't specify target table 'matricule' for update in FROM clause

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    C'est le problème que j'avais signalé avec le mauvais MySQL !

    Il faut passer par une table temporaire :
    Code SQL : 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
    CREATE TEMPORARY TABLE temp
    SELECT  MAX(id) AS id_max
    FROM matricule;
     
    INSERT INTO matricule(libelle)
    VALUES (concat(
    				year(CURRENT_DATE),
    				'-' ,
    				lpad(
    					(
    						SELECT id_max
    						FROM temp
    					) + 1,
    					6,
    					'0'
    				),
    				'-m'
    			)
    		);
    Mon code ne prend pas en compte le test sur l'année pour recommencer la numérotation à zéro chaque année. À toi de voir quel est ton besoin réel de codification du matricule.

    Le mieux serait quand même de passer par une procédure SQL plutôt que par une table temporaire.
    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 !

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mauritanie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Points : 113
    Points
    113
    Par défaut
    merci de votre , je vois bien le problème dans ma requête insert je ne peux pas sélectionner la table matricule du au mauvais mysql .

    maintenant j ai deux questions:

    la première:

    si j'utilise la table temporaire comment celle-ci va s'alimente car si elle ne s'alimente pas a chaque insertion j aurai la même matricule


    la deuxième:

    si j’utilise les procédures comment je vais l’appelé dans mon code php


    merci d'avance

  12. #12
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    si j'utilise la table temporaire comment celle-ci va s'alimente car si elle ne s'alimente pas a chaque insertion j aurai la même matricule
    Par définition, une table temporaire est... temporaire !
    Elle s'auto-détruit à la fin de la transaction. Donc elle peut être recréée à chaque insertion.

    si j’utilise les procédures comment je vais l’appelé dans mon code php
    Ben je ne l'ai encore jamais fait personnellement mais je pense que ça se lance comme une requête SQL.

    Si tu as une procédure SQL appelée "P_Inscrire_Etudiant (nom, prenom...)", tu dois pouvoir faire ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $sql = "P_Inscrire_Etudiant('$nom', '$prenom' /* + autres paramètres à fournir à la procédure */)";
    $result = mysql_query($sql);
    Cherche dans la doc MySQL et/ou PHP.
    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 !

  13. #13
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    Je vais complèter la réponse de CinePhil :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = "CALL P_Inscrire_Etudiant('$nom', '$prenom' /* + autres paramètres à fournir à la procédure */)";

  14. #14
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mauritanie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Points : 113
    Points
    113
    Par défaut
    merci de votre aide,
    j avais commencer a créer une table temporaire mais après exécution la requête réussie mais elle m apparaisse pas sur la liste de mes tables donc je ne peux pas l'utiliser.

    et j ai passer a la création des procédures, j ai créer ma procédure creer_matricule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE PROCEDURE  creer_matricule() 
        SELECT count(id) as id_max    FROM  matricule;
    et je sais comment l'appelé avec call mais je ne sais pas comment l’intégrer dans ma requête suivante en enlevant la partie qui est en gris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    
     INSERT INTO matricule(libelle)VALUES
    (concat(year(CURRENT_DATE),'-',lpad(
      (SELECT count(id)
      FROM matricule
      WHERE year(CURRENT_DATE)=year(CURRENT_DATE))+1,6,'0'),
    '-m'));
    merci d'avance

  15. #15
    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 quoi cette table matricule? j'espère que tu mets ça juste à titre de test???

    pas de besoin d'une table table temporaire... les variables ça existe... même hors des procédures...

    en fait ça dépend du niveau d'isolation des transactions si tu es en innodb... en myisam ça passera jamais en une seule requête car il y a verrouillage de toute la table et pas juste de la ligne...

    donc l'idéal est bien évidemment une procédure stockée... mais tu peux le faire sans si tu veux aussi...
    Code sql : 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
    delimiter $$
    drop procedure if exists inscription$$
    create procedure inscription(in nom varchar(255),in sexe char(1)/*...les autres trucs à mettre*/)
    begin
      declare y smallint default year(current_date);
      declare i mediumint;
      set autocommit=0;
      start transaction;
        SELECT count(id)+1
        into i
        FROM etudiants
        WHERE year(arrivee)=y;
        INSERT INTO etudiants(arrivee,depart,nom,...,matricule)VALUES
        (CURRENT_DATE,NULL,nom,/*...*/concat(y,'-',lpad(i,6,'0'),'-',sexe));
      end;
    end$$
    delimiter ;
    tes tables doivent être en innodb pour ça!!
    à tester le niveau d'isolation le plus adapté à ton besoin...
    pour l'appel:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    call inscription('machin truc','m',/*...*/);

    quelques bon principes pour éviter les risque de blocage à cause de transaction trop longues:
    • tout ce qui est des test ne touchant pas une valeur à récupérer dans une table... hors de la transaction juste avant elle...
    • tout ce qui test une valeur récupérée dans une table dans la transaction pour garantir sa viabilité...

    normalement t'as de quoi faire fonctionner ton truc et l'adapter comme tu veux
    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...

  16. #16
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mauritanie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Points : 113
    Points
    113
    Par défaut
    merci bien , bon j ai mis a coté mon application et j ai créer une table matricule pour faire des tests.
    je testerai ton code je vous tiendrais du résultat

    merci

  17. #17
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Je vois une petite faille dans la procédure puisque le matricule doit être unique...

    Disons qu'il y a déjà 30 étudiants inscrits cette année.
    J'en inscris un nouveau, il prend le matricule 2012-000031-M.
    Je m'aperçois qu'un des premiers étudiants a été inscrit par erreur en double et je le supprime.
    => Il y a de nouveau 30 étudiants inscrits et le prochain inscrit aura le même matricule que je viens d'attribuer !

    L'idéal reste quand même, selon moi, de trouver le numéro max + 1 par le genre de formule que j'avais donnée dans un précédent message.
    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 !

  18. #18
    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
    exact

    j'avoue que c'est un exemple pondu en 5 minute pour donner une idée pas le truc robuste

    la solution est de maintenir un compteur dans une table servant à faire des configurations pour l'application ou mettre à disposition des valeurs de type compteur

    la remise à zéro du compteur peut être fait par un event qui se déclenche 1 fois par an si on a accès aux events (ou un cron sinon) et qu'on veut automatiser ou manuellement au pire...

    ce compteur ne peut ainsi subir que 3 actions
    • lecture
    • update: +1
    • raz

    là tu as la solution robuste
    faut utiliser un truc genre:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select inscrits
    into i
    from semaphores
    for udate
    qui bloque en lecture tant qu'un update n'est pas fait par le thread qui a posé le premier verrou de lecture... c'est un moyen simple de mettre en place une sémaphore...
    ça garantit que personne ne lit tant que l'update n'est pas fait ou que la transaction n'est pas finie ou abandonnée bien-sur...
    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...

  19. #19
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mauritanie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 391
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par ericd69 Voir le message
    exact

    j'avoue que c'est un exemple pondu en 5 minute pour donner une idée pas le truc robuste

    la solution est de maintenir un compteur dans une table servant à faire des configurations pour l'application ou mettre à disposition des valeurs de type compteur

    la remise à zéro du compteur peut être fait par un event qui se déclenche 1 fois par an si on a accès aux events (ou un cron sinon) et qu'on veut automatiser ou manuellement au pire...

    ce compteur ne peut ainsi subir que 3 actions
    • lecture
    • update: +1
    • raz

    là tu as la solution robuste
    faut utiliser un truc genre:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select inscrits
    into i
    from semaphores
    for udate
    qui bloque en lecture tant qu'un update n'est pas fait par le thread qui a posé le premier verrou de lecture... c'est un moyen simple de mettre en place une sémaphore...
    ça garantit que personne ne lit tant que l'update n'est pas fait ou que la transaction n'est pas finie ou abandonnée bien-sur...


    merci de votre reponse:

    premièrement : j ai un problème avec la création des procedure dans phpmyadmin

    deuxièmement: j'ai pas compris votre dernière réponse surtout avec la requête qui sélectionne les inscris

    merci d'avance

  20. #20
    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
    les procédures dans phpmyadmin tu peux les créer sans problème mais pas les exécuter
    c'est pas fait pour le développement, faut utiliser soit des outils plus poussés pour ça en local ou sur hébergement dédié... soit si tu es sur un hébergement mutualisé, phpmyadmin pour la création des procédures puis des scripts php pour tester

    si tu as des erreurs c'est que tu te plantes... faut donner le codes que tu mets et les erreurs... on est pas des devins...

    tu as donc une table qui va contenir des compteur ou sémaphore selon le besoin:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    drop table if exists semaphores;
    create table semaphores(
      id tinyint unsigned auto_increment not null,
      nom varchar(64) not null,
      valeur int not null,
      constraint pk_semaphores primary key(id)
    )engine=innodb auto_increment=1;
    ce qui permet 255 sémaphores ou compteurs possibles
    pour notre cas on a besoin d'une ligne dedans:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into semaphores(nom,valeur)values('inscrits',0);
    qui initialise le nombre d'inscrits à 0 pour l'année en cours
    la procédure d'inscription devient:
    Code sql : 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
    delimiter $$
    DROP procedure IF EXISTS inscription$$
    CREATE procedure inscription(IN nom varchar(255),IN sexe char(1)/*...les autres trucs à mettre*/)
    begin
      declare y smallint DEFAULT year(current_date);
      declare i mediumint;
      SET autocommit=0;
      start transaction;
        SELECT valeur+1
        INTO i
        FROM semaphores
        WHERE nom=inscrits
        for update; #on met un verrou de lecture jusqu'a un update
        INSERT INTO etudiants(arrivee,depart,nom,...,matricule)VALUES
        (CURRENT_DATE,NULL,nom,/*...*/concat(y,'-',lpad(i,6,'0'),'-',sexe));
        update semaphores
        set valeur=valeur+1
        where nom='inscrits'; #on libère le verrou sur 'inscrits'
      commit;
    end$$
    delimiter ;
    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...

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/04/2012, 14h04
  2. Réponses: 3
    Dernier message: 25/01/2006, 17h54
  3. [VB.NET] ScrollBar automatique pour Listbox
    Par Aspic dans le forum VB.NET
    Réponses: 6
    Dernier message: 19/12/2005, 13h58
  4. Defilement automatique pour un diaporama
    Par Paniez dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 11/12/2005, 10h26
  5. Generer un script pour une BDD "*.sql"+"*.bat
    Par subzero82 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 23/08/2005, 16h47

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