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 :

Grouper un bloc de fonctions mysql


Sujet :

SQL Procédural MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 247
    Points : 99
    Points
    99
    Par défaut Grouper un bloc de fonctions mysql
    Bonjour,

    Je souhaite executer plusieurs requetes SQL (update) mais je veux executer celles-ci seulement si aucune ne retournent d'erreurs. Si un update n'a pas été bien executé, je ne souhaite pas que les autres soit executés, et je veux afficher un message d'erreur.
    Je ne sais pas si cette question est à sa bonne place (peut etre que c'est gerable uniquement en mysql en créant des procédures ou je ne sais quoi...)

    Merci pour vos réponses !

  2. #2
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Peut-être que c'est gérable par MySQL, avec des trucs comme les requêtes transactionnelles (commit) ou les requêtes stockées, je ne sais pas.

    Si tu veux le gérer par PHP, tu peux faire quelque chose de simple, comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    requête 1
    si requête 1 ok alors {
      requête 2
      si requête 2 OK alors {
        requête 3
        ...
      }
      sinon {...}
    }
    sinon {...}

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 247
    Points : 99
    Points
    99
    Par défaut
    Oui je suis d'accord, mais si la requete 3 s'est mal passée, je voudrais pas que la requete 1 s'execute. Je pourrais traiter le cas dans le else et revenir à l'état d'origine, mais c'est un peu galere et puis pas très optimisé... je serai obligé de refaire un update.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 012
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 012
    Points : 1 093
    Points
    1 093
    Par défaut
    tu n'es pas compliqué

    donc si 1 se passe bien, tu fais 2, si 2 se passe bien, tu fais 3, et si 3 se passe mal, tu ne veux pas faire 1, ni 2, déjà exécutés.

    je te dirais, commence par 3, mais je suppose que cela ne convient pas du tout dans ta logique.

    et sincèrement, je ne sais pas comment tu peux régler cela logiquement : si j'ai compris ta question, il suffit que l'une de tes requetes s'exécute mal pour qu'aucune ne doit être exécutée. Pourtant, il faudra bien que tu commences par l'une de ces requêtes. Et dès qu'elle sera exécutée, ce sera fait.

    A mon avis ton problème est insoluble

    Enfin, en php.

    Avec des requêtes transactionnelles ou requêtes stockées, peut-être, je n'y connais rien. Pose ta question dans le forum mysql

    Sinon, tu peux les exécuter dans une table tampon et s'il n'y a aucune erreur les exécuter dans ta table de base. Ainsi, si erreur, cela évitera des update des infos antérieures à ta requête, que tu n'as peut-être pas en mémoire. Mais en vitesse d'exécution, je ne suis pas persuadé que ce soit une bonne chose.

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Points : 1 639
    Points
    1 639
    Par défaut
    C'est parfaitement possible avec les transactions dans MySql.
    Attention, il faut que tu choisisses une table de format InnoDB, car les tables MyIsam (format par défaut) ne supportent pas les transactions.
    Les transactions sont prévues exactement pour ton problème : c'est du tout ou rien => soit tout a fonctionné et les changements sont validés, soit il y a une erreur, et tout est annulé.
    Plus de renseignements dans le forum mysql.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 247
    Points : 99
    Points
    99
    Par défaut
    Arf..! Je crois pas avoir le choix du type de base. Elles ont déjà été créés et je suis pas le seul sur le projet. J'ai peur que le fait de modifie rle type de la base modifie d'autres choses.
    En Perl, il me semble que cela est possible (je suis meme sur puisque je l'ai utilisé). En fait la fct magique que j'attendais était une sorte de mysql_query ou on pourrait mettre plusieurs requetes en paramètres, et executer les requetes seulement si toutes sont executables. Si une requete aurait rencontré un pb, aucune n'aurait été executée et le mega mysql_query aurait renvoyé faux.
    Bon bah je crois que je vais essayer de trouver une autre solution pour mon problème...

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Points : 1 639
    Points
    1 639
    Par défaut
    Je ne te parle pas du type de base mais tu type de table. Le choix de InnoDB aura juste un petit impact sur certaines performances, mais toutes les fonctionnalités des tables MyIsam s'y retrouvent, plus les transactions et les procédures stockées. Tu n'as donc normalement aucun risque de choisir une table InnoDB. C'est la seule solution valable pour réaliser des transactions.
    Au passage, avec php5, je te conseille d'utiliser les PDO, qui gère les transactions même si la version de mysql ne les autorise pas.

  8. #8
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par vg33
    Je ne te parle pas du type de base mais tu type de table. Le choix de InnoDB aura juste un petit impact sur certaines performances, mais toutes les fonctionnalités des tables MyIsam s'y retrouvent, plus les transactions et les procédures stockées. Tu n'as donc normalement aucun risque de choisir une table InnoDB. C'est la seule solution valable pour réaliser des transactions.
    Au passage, avec php5, je te conseille d'utiliser les PDO, qui gère les transactions même si la version de mysql ne les autorise pas.
    S'il a un index "full text" dans sa table, il ne pourra pas passer en InnoDB (si ma mémoire est bonne).

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Points : 1 639
    Points
    1 639
    Par défaut
    Citation Envoyé par Eusebius
    S'il a un index "full text" dans sa table, il ne pourra pas passer en InnoDB (si ma mémoire est bonne).
    => il vaudrait mieux passer ce thread dans le forum mysql.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    247
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 247
    Points : 99
    Points
    99
    Par défaut
    Citation Envoyé par vg33
    Je ne te parle pas du type de base mais tu type de table. Le choix de InnoDB aura juste un petit impact sur certaines performances, mais toutes les fonctionnalités des tables MyIsam s'y retrouvent, plus les transactions et les procédures stockées. Tu n'as donc normalement aucun risque de choisir une table InnoDB. C'est la seule solution valable pour réaliser des transactions.
    Au passage, avec php5, je te conseille d'utiliser les PDO, qui gère les transactions même si la version de mysql ne les autorise pas.
    Peux tu me donner un peu plus de renseignements sur les procédures stockées et PDO ?

Discussions similaires

  1. équivalent fonction mysql C en php
    Par splouf dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 22/01/2006, 20h41
  2. équivalent fonction mysql C en php
    Par splouf dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 13/01/2006, 15h23
  3. [fonction MySQL] test d'une expression
    Par spilliaert dans le forum Débuter
    Réponses: 5
    Dernier message: 05/01/2006, 13h36
  4. Pb avec fonctions MYSQL
    Par tonton54 dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 07/10/2005, 23h54
  5. Fond d'un bloc en fonction du lien
    Par JeromeR dans le forum Mise en page CSS
    Réponses: 7
    Dernier message: 20/10/2004, 14h40

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