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 :

Procédure IF Then PhpMyAdmin


Sujet :

SQL Procédural MySQL

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    315
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 315
    Points : 243
    Points
    243
    Par défaut Procédure IF Then PhpMyAdmin
    Bonjour,
    Je teste des bouts de code MySql avec PhpMyAdmin

    Un résultat m'interpelle, quand j'exécute la procédure suivante, le nom des 2 lignes est modifié alors que je sélectionne la ligne 1 (WHERE id=1)
    Pouvez-vous m'indiquer mon erreur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    BEGIN
    DECLARE dernier, parent_id, id INT;
    DECLARE nom CHAR(50);
     
    SET id = 1;
    SET dernier = 127;
    SET parent_id = 126;
     
        IF (dernier = 127 AND parent_id = 126)
        	THEN UPDATE a_test SET nom='lapin' WHERE id=1;
        END IF;
    END
    Structure de la table `a_test`
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TABLE `a_test` (
      `id` int(11) NOT NULL,
      `nom` varchar(50) NOT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
     
    INSERT INTO `a_test` (`id`, `nom`) VALUES
    (1, ''),
    (2, '');

  2. #2
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 490
    Points : 19 534
    Points
    19 534
    Par défaut
    Salut alainb.

    L'erreur est subtile !

    Dans la procédure stockée, vous avez déclaré la variable "id".
    Or quand vous faites référence, dans votre requête, à "id", mysql considère qu'il s'agit de la variable et non la colonne de votre table.
    Comme cette variable possède toujours la même valeur "1", la clause where est toujours vrai quelque soit la ligne, d'où l'affectation qui s’effectue partout.

    Le mieux est d'ajouter un souligné devant le nom de vos variables afin de faire la distinction entre la variable et le nom de la colonne.

    @+

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    315
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 315
    Points : 243
    Points
    243
    Par défaut
    Bonjour Artemus24,
    Merci pour la correction, je veillerai au nommage de mes variables pour ne plus me retrouver dans cette situation.

    Mon code corrigé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    BEGIN
    DECLARE dernier, parent_id INT;
    DECLARE nom CHAR(50);
    SET @id = 1;
    SET dernier = 127;
    SET parent_id = 126;
     
        IF (dernier = 127 AND parent_id = 126)
        	THEN UPDATE a_test SET nom='lapin' WHERE id=@id;
        END IF;
    END

  4. #4
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 490
    Points : 19 534
    Points
    19 534
    Par défaut
    Salut alainb.

    Je ne conseille pas d'utiliser, dans une procédure stockée, le préfixe @ devant une variable.
    Normalement, le passage des paramètres se fait dans l'entête de la procédure.
    Là, vous dites que la variable @id est accessible depuis l'extérieure de votre procédure stockée.
    C'est comme si cette variable est déclarée "GLOBAL " et non "LOCAL".

    Il y a une exception à l'usage de ce @.
    Quand vous utilisez des requêtes préparées :
    --> https://dev.mysql.com/doc/refman/8.0...tatements.html
    la variable qui va contenir votre requête doit obligatoirement commencé par un @.

    Je vous conseille soit de nommer vos variables d'une autre manière que le nom de vos colonnes, ou bien comme moi, de les préfixer par un souligner _.

    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. BackColor suivant procédure IF,THEN,ELSE
    Par Alexbreizhst dans le forum VBA Access
    Réponses: 25
    Dernier message: 31/03/2013, 19h04
  2. Créer une procédure stockée sous MySQL avec phpmyadmin
    Par Jordan59 dans le forum SQL Procédural
    Réponses: 11
    Dernier message: 17/08/2011, 14h08
  3. PB Procédure stockée avec phpMyAdmin
    Par ythierrin dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 06/04/2008, 16h52
  4. Problème de création de procédure sous PHPMyAdmin
    Par Braer dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 09/11/2007, 16h05
  5. Procédures stockées avec PHpmyAdmin
    Par tchoukapi dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 16/11/2005, 16h19

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