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 :

Ordre d'execution PDO ? [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 28
    Points : 21
    Points
    21
    Par défaut Ordre d'execution PDO ?
    Bonjour à tous,

    Je modifie actuellement une interface pour la passer en PDO.
    Une bonne partie fonctionne déjà, mais je bute face à un problème où je ne comprend pas la logique.

    J'essaye de supprimer un enregistrement d'une table, pour celà je vérifie en premier qu'il existe , puis si c'est le cas je le supprime. Celà fonctionnait bien avant, mais depuis PDO il m'exécute les requetes dans le désordre.

    Je veux dire lors de l'execution il supprime bien l'enregistrement puisque l'entrée a disparu de la table, mais il me fait une erreur, comme quoi l'enregistrement a disparu, alors qu'il est sensé vérifier avant de le supprimer son existence.

    Je ne comprend pas vraiment tout.

    J'utilise PDO sur postgresql.
    Normalement j'utilise une classe qui étend PDO pour ma base, mais même en testant une requête sans cette classe le problème est le même.

    Pouvez vous m'expliquer ce que je ne comprend pas, ou que je fais mal ?

    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
    19
    20
    21
     
    try{
    $test = new PDO('pgsql:host=127.0.0.1;dbname='.DATABASE_NAME,login,mdp);
    $test->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    $stm = $test->prepare("SELECT id FROM clinical_study WHERE id=:id");
    $stm->bindValue('id',$_GET['id_clinical_study'],PDO::PARAM_INT);
    $stm->execute();
     
    if($stm->rowCount() != 1) echo "BAD";
    else {
            echo "OK";
     
            $test2 = new PDO('pgsql:host=127.0.0.1;dbname='.DATABASE_NAME,login,mdp);
            $stm2 = $test2->prepare("DELETE FROM clinical_study WHERE id=:id");
            $stm2->bindValue('id',$_GET['id_clinical_study'],PDO::PARAM_INT);
            if($stm2->execute()) echo "DEL";
            else echo "PB";
    }
    } catch (PDOException $e) {
            print($e->getMessage());
    }
    A l'affichage : J'obtiens juste "BAD" et mon entrée a bien été supprimée.
    Je ne vois jamais arriver "DEL" ou "PB" ou "OK".

    Merci d'avance si quelqu'un peut m'expliquer.

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2009
    Messages : 114
    Points : 185
    Points
    185
    Par défaut
    Pour la plupart des bases de données, PDOStatement::rowCount() ne retourne pas le nombre de lignes affectées par une requête SELECT.
    utilise fetchColumn :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if($stm->fetchColumn() > 0) echo "BAD";

  3. #3
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    Malheureusement je viens de tester avec fetch et celà ne change rien.

    La valeur est toujours supprimée avant d'être vérifiée.

    (A savoir que si je supprime la partie delete que ce soit avec rowCount ou bien fetch la requete select fonctionne correctement).

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2009
    Messages : 114
    Points : 185
    Points
    185
    Par défaut
    il faut mettre la chaine ':id' au lieu de 'id'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $stm->bindValue(':id',$_GET['id_clinical_study'],PDO::PARAM_INT);
     
    $stm2->bindValue(':id',$_GET['id_clinical_study'],PDO::PARAM_INT);

  5. #5
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    Testé le changement de syntaxe des bind, et celà ne change rien.

    Merci quand même d'essayer.

    Si quelqu'un a une autre idée

  6. #6
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Avec ce code, c'est impossible que "BAD" s'affiche et que la requête DELETE soit exécutée dans le même script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if($stm->rowCount() != 1) echo "BAD";
    else {
            echo "OK";
     
            $test2 = new PDO('pgsql:host=127.0.0.1;dbname='.DATABASE_NAME,login,mdp);
            $stm2 = $test2->prepare("DELETE FROM clinical_study WHERE id=:id");
            $stm2->bindValue(':id',$_GET['id_clinical_study'],PDO::PARAM_INT);
            if($stm2->execute()) echo "DEL";
            else echo "PB";
    }
    Tu es sûre que ce n'est pas quand tu vérifies manuellement dans ta BDD que tu te plantes et/ou que tu refresh dans ton navigateur ? (bref le code me semble correct, mis à part que tu peux utiliser le même objet PDO a priori)
    Vive les roues en pierre

  7. #7
    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
    Salut,

    comme ça :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <?php
     
    if ( ! empty($_GET['id_clinical_study']))
    {
        $id = intval($_GET['id_clinical_study']);
        try
        {
            $pdo  = new PDO('pgsql:host=127.0.0.1;dbname='.DATABASE_NAME, $login, $mdp);
            $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
            $sql  = 'SELECT id FROM clinical_study WHERE id=:id';
            $stmt = $pdo->prepare($sql);
            $stmt->bindValue('id', $id, PDO::PARAM_INT);
            $stmt->execute();
            $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
     
            if (empty($data))
            {
                echo 'BAD';
            }
            else
            {
                echo 'OK';
                $sql  = 'DELETE FROM clinical_study WHERE id=:id';
                $stmt = $pdo->prepare($sql);
                $stmt->bindValue('id', $id, PDO::PARAM_INT);
                echo ($stmt->execute()) ? 'DEL' : 'PB';
            }
        }
        catch (PDOException $e)
        {
                echo $e->getMessage();
        }
    }
    Le ->rowCount() sur un select n'est pas garanti alors, vaut mieux s'en passer.

  8. #8
    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
    Sur le problème je pense comme Djakisback que tu fais une erreur de lecture de tes résultats : tu ne peux pas avoir le if et le else en meme temps.

    Sur le fond, ton select au début ne sert pas, tu peux faire le DELETE même si l'enregistrement n'existe pas. rowCount peut te dire si une ligne a été supprimée ou non.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre à l'essai
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 28
    Points : 21
    Points
    21
    Par défaut
    En lisant vos remarques, j'ai sorti la requête et je l'ai mise dans une page seule hors du contexte de l'interface.
    Et effectivement dans ce cas là la requête a un comportement normal.

    Le problème est donc en amont quelque chose doit influer sur la page avant l'include, ou peut-être la page incluse deux fois de suite (ce qui m'a l'air cohérent avec le comportement.). Je vais donc regarder de ce côté là.

    (Pour le select qui ne sert pas il est là apparement pour vérifier que l'utilisateur n'a pas changé à la main le numéro dans l'url, je n'ai pas vraiment investigué sur les raisons, vu que je ne suis pas auteur du code originel)

    Merci à tous d'avoir pris le temps de jeter un oeil et de m'avoir "rassurée" sur mon bout de code qui me rendait un peu chèvre à force de tourner en rond.

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

Discussions similaires

  1. [AS3] Ordre d'execution
    Par eXiaNazaire dans le forum ActionScript 3
    Réponses: 7
    Dernier message: 17/08/2007, 14h24
  2. [M2] structure multi-modules et ordre d'execution
    Par dvicente72 dans le forum Maven
    Réponses: 11
    Dernier message: 03/06/2007, 20h41
  3. Ordre d'execution et httpRequest
    Par sourize dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 07/03/2007, 10h33
  4. Réponses: 5
    Dernier message: 29/12/2005, 13h47
  5. probleme ordre d'execution de ma page asp
    Par Shosho dans le forum ASP
    Réponses: 5
    Dernier message: 10/05/2005, 14h51

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