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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : France, Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 28
    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 confirmé
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2009
    Messages : 114
    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 averti
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : France, Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 28
    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 confirmé
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2009
    Messages : 114
    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 averti
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 45
    Localisation : France, Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 28
    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 Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    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)

  7. #7
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    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
    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

+ 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