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

SQL Procédural MySQL Discussion :

Trigger Php Admin


Sujet :

SQL Procédural MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Par défaut Trigger Php Admin
    Bonjour a tous, voila je débute en trigger et j'ai toujours des problèmes de syntaxe lors de la création de mon trigger que voici:

    Je veux qu'avant l'ajout dans la table inscrit, on parcourt la table inscrit et que si la valeur a insérer se trouve dans le champs mot de passe, alors on quitte le trigger, sinon on effectue l'ajout =)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE TRIGGER AJOUT  BEFORE INSERT ON inscrit
     
    BEGIN
     
    DECLARE temp varchar(20);
    DECLARE curs CURSOR FOR select motdepasse from inscrit;
    FETCH curs INTO temp 
    if (temp <> New.motdepasse) THEN
    LEAVE ;
    END IF ;
    END $$
    Voila, mon délimiteur est $$

    Mon message d'erreur est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #1064 - Erreur de syntaxe près de 'BEGIN DECLARE temp varchar(20); DECLARE curs CURSOR FOR select motdepasse fr' à la ligne 3
    Si quelqu'un peut m'éclairer la dessu ca serait cool =)

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 814
    Billets dans le blog
    14
    Par défaut
    Il manque FOR EACH ROW avant le BEGIN je pense.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 habitué
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Par défaut
    Merci Cinéphil =) maintenant ca bloque à la ligne 9 oO :

    requête SQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #1064 - Erreur de syntaxe près de '; end if ; END §§' à la ligne 9

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Par défaut
    J'ai beau remuer dans tous les sens ce trigger je n'y arrive pas....

  5. #5
    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
    Billets dans le blog
    1
    Par défaut
    salut,

    il manque un ; à la fin de ton fetch...

    tu ne fais pas de boucle avec ton curseur... ça revient à faire:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT motdepasse into temp FROM inscrit limit 1;

    en plus, comment garantir que lis la bonne ligne avec ton select? il n'y a qu'un seul inscrit?

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Par défaut
    Merci de ton intérêt pour mon post,je pensais que le fetch permettait de parcourir mon curseur... j'ai rajouté un ; aprés le fetch, maintenant ca bloque à la ligne 9

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #1064 - Erreur de syntaxe près de '; end if; END' à la ligne 9
    je vais chercher comment parcourir un curseur oO

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Par défaut
    Aprés des petites recherches;, j'arrive à ce code suivant, et encore une fois ca bloque dans le bloc if end if .....

    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
     
    CREATE TRIGGER AJOUT  BEFORE INSERT ON inscrit
    FOR EACH ROW
    BEGIN
     
    DECLARE temp varchar(20);
    DECLARE curs CURSOR FOR select motdepasse from inscrit;
    open curs;
    loop
    FETCH curs INTO temp; 
    if (temp = New.motdepasse) THEN // g modifé <> en = 
    LEAVE ;
    end if;
    end loop;
    Close curs;
    END $$
    Message d'érreur .... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1064 - Erreur de syntaxe près de '; end if; end loop; Close curs; END' à la ligne 11
    Ne faut il pas plutot boucler avec genre un while curseur n'est pas vide?

    Désolé c'est mon premier trigger oO Dépucelage :p

  8. #8
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 814
    Billets dans le blog
    14
    Par défaut
    J'ai l'impression que c'est le mot clé LEAVE qui n'est pas compris par MySQL. Tu es sûr qu'il existe ?

    Par ailleurs, j'ai l'impression que tu veux empêcher par ce trigger que le même mot de passe existe deux fois. Si c'est ça, un simple index UNIQUE sur la colonne du mot de passe est suffisant ; pas besoin d'un trigger. Il suffit au programme de récupérer l'erreur en cas de tentative d'insertion d'un doublon et de la traiter.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 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
    Billets dans le blog
    1
    Par défaut
    si si il existe...

    2 problèmes:
    • faut faire ton fetch dans ta boucle... sinon tu lis pas ton curseur
    • et les commentaire ça s'écrit avec "/* */" ou "-- "

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Par défaut
    Oui cinéphile je sais que si je le met en identifiant c'est réglé, seulement je dois utiliser un trigger dans un projet donc je m'exerce =)

    Les commentaires je les ai juste mi dans le post, pas dans le trigger, je vais tester de mettre le fetch dans la boucle =)

    Merci à vous en tout cas ^^

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Par défaut
    Bon j'en avais marre donc j'ai penché vers une solution simpliste bien que pas trés estéthique oO

    En gros si la ligne traité contient le mot de passe saisi par l'utilisateur, on appelle une fonction inexistante arrétant le trigger.
    L’exception est géré par un try catch sous php, voila le code du trigger :p
    Merci a cinéphil et ericd69 pour leurs aides, si vous trouvez une autre option je suis tout de même preneur =) JE met résolu ou pas? xD

    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
    CREATE TRIGGER AJOUT  BEFORE INSERT ON inscrit
    FOR EACH ROW
    BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE temp varchar(20);
    DECLARE curs CURSOR FOR select motdepasse from inscrit;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN curs;
    country_loop: LOOP 
    FETCH curs INTO temp ;
    if (temp = New.motdepasse) THEN
    call error() ;
      IF done THEN
          LEAVE country_loop;
       END IF;
    end if;
    end loop;
    END

  12. #12
    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
    Billets dans le blog
    1
    Par défaut
    un exemple puisque tu peux toujours pas utiliser signal pour générer une erreur dans un déclencheur... (triggers-that-cause-inserts-to-fail-possible)...

    ta démarche est la bonne mais ton code a encore un problème:
    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 TRIGGER AJOUT  BEFORE INSERT ON inscrit
    FOR EACH ROW
    BEGIN
    DECLARE done INT DEFAULT 1;
    DECLARE temp varchar(20);
    DECLARE curs CURSOR FOR SELECT motdepasse FROM inscrit;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 0;
    OPEN curs;
    country_loop: LOOP 
    FETCH curs INTO temp ;
    IF done THEN
      IF (temp = New.motdepasse) THEN
        call "ton message d'erreur"; -- tu plantes et génères une erreur
      END IF;
    else
      leave country_loop;
    end IF;
    end loop;
    END
    le test sur done doit te permettre de contrôler si tu applique un traitement si et seulement si le fetch a rapatrié quelque chose...

    une version plus propre:
    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 TRIGGER AJOUT  BEFORE INSERT ON inscrit
    FOR EACH ROW
    BEGIN
    DECLARE done INT DEFAULT 1;
    DECLARE temp varchar(20);
    DECLARE curs CURSOR FOR SELECT motdepasse FROM inscrit;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 0;
    OPEN curs;
    country_loop: LOOP 
    FETCH curs INTO temp ;
    IF done THEN
      IF (temp = New.motdepasse) THEN
        call error("ton message d'erreur");
      END IF;
    else
      leave country_loop;
    end IF;
    end loop;
    END
    avec ta procédure error:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    create procedure error(in mes varchar(255))
    begin
      signal sqlstate '45000' set message_text=mes;
    end

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 10
    Par défaut
    MErci bien eric, j'avais testé le signal mais ma version de mysql doit pas connaître signal )= je vais tester d'en prendre une plus récente

  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
    Billets dans le blog
    1
    Par défaut
    oui c'est possible car c'est un rajout assez récent pour coller au standard...

    à savoir que tu peux tester signal en dehors d'une procédure comme simple instruction mais pas directement dans le déclencheur... me demande pas pourquoi...



    au pire tu utilises la version sans signal...

Discussions similaires

  1. [PHP5.2][MySQL5.0.27] Creation de triggers depuis PHP
    Par frochard dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 05/12/2006, 10h16
  2. [PHP-JS] admin console login et mot de passe
    Par kitty2006 dans le forum Langage
    Réponses: 18
    Dernier message: 03/10/2006, 23h20
  3. Réponses: 4
    Dernier message: 11/08/2006, 13h43
  4. agenda dans flash administrable par admin php
    Par cosmicgab dans le forum Dynamique
    Réponses: 4
    Dernier message: 04/05/2006, 22h01
  5. [Sécurité] sécurité admin avec PHP
    Par carter15_2001 dans le forum Langage
    Réponses: 3
    Dernier message: 04/01/2006, 02h04

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