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 :

Requête préparée et DELETE


Sujet :

PHP & Base de données

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Etudiant à EPITECH
    Inscrit en
    Septembre 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Etudiant à EPITECH

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Requête préparée et DELETE
    Bonjour,

    Je suis en train de développer une appli en php (CLI) et je suis face à un problème que nous n'arrivons pas à résoudre.

    J'exécute une requête préparée en boucle avec des paramètres variables, or cette requête ne semble pas affecter la BDD, pourtant en rentrant directement la même requête sur ma base, elle fonctionne ...

    Voici le code :

    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
     
    <?php
        $core = Core::getInstance();
        $sql = "DELETE FROM kpistar.fact_platform WHERE id_dim_platform = :platform AND id_dim_time = :time AND id_di\
    m_business_unit = :bu AND id_dim_location = :country AND id_dim_placement = :ads_type";
        $stmt = $core->dbh->prepare($sql);
        foreach ($t as $metric)
          {
            $stmt->bindParam(':platform', $metric->platform, PDO::PARAM_INT);
            $stmt->bindParam(':time', $metric->ts, PDO::PARAM_INT);
            $stmt->bindParam(':bu', $metric->bu, PDO::PARAM_INT);
            $stmt->bindParam(':ads_type', $metric->ads_type, PDO::PARAM_INT);
            $stmt->bindParam(':country', $metric_country, PDO::PARAM_INT);
            echo ("DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = " . $metric->platform . " AND id_dim_\
    time = " . $metric->ts . " AND id_dim_business_unit = " . $metric->bu . " AND id_dim_location = " . $metric->coun\
    try . " AND id_dim_placement = " . $metric->ads_type . ")" . PHP_EOL);                                            
            $stmt->execute();
            echo ("Lignes affectee : " . $stmt->rowCount() . PHP_EOL);                                              
          }
    ?>
    Voici ce qui s'affiche :

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = 1 AND id_dim_time = 20110906 AND id_dim_business_unit = 2 AND id_dim_location = 1 AND id_dim_placement = 9)
    Lignes affectee : 0
    DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = 1 AND id_dim_time = 20110906 AND id_dim_business_unit = 2 AND id_dim_location = 5 AND id_dim_placement = 9)
    Lignes affectee : 0
    DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = 1 AND id_dim_time = 20110906 AND id_dim_business_unit = 2 AND id_dim_location = 4 AND id_dim_placement = 9)
    Lignes affectee : 0
    DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = 1 AND id_dim_time = 20110906 AND id_dim_business_unit = 2 AND id_dim_location = 6 AND id_dim_placement = 9)
    Lignes affectee : 0
    DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = 1 AND id_dim_time = 20110906 AND id_dim_business_unit = 2 AND id_dim_location = 3 AND id_dim_placement = 9)
    Lignes affectee : 0
    DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = 1 AND id_dim_time = 20110906 AND id_dim_business_unit = 2 AND id_dim_location = 2 AND id_dim_placement = 9)
    Lignes affectee : 0
    DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = 1 AND id_dim_time = 20110906 AND id_dim_business_unit = 1 AND id_dim_location = 1 AND id_dim_placement = 9)
    Lignes affectee : 0
    DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = 1 AND id_dim_time = 20110906 AND id_dim_business_unit = 1 AND id_dim_location = 1 AND id_dim_placement = 9)
    Lignes affectee : 0
    DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = 1 AND id_dim_time = 20110906 AND id_dim_business_unit = 1 AND id_dim_location = 1 AND id_dim_placement = 2)
    Lignes affectee : 0
    DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = 1 AND id_dim_time = 20110906 AND id_dim_business_unit = 1 AND id_dim_location = 1 AND id_dim_placement = 3)
    Lignes affectee : 0
    DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = 1 AND id_dim_time = 20110906 AND id_dim_business_unit = 1 AND id_dim_location = 1 AND id_dim_placement = 4)
    Lignes affectee : 0
    DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = 1 AND id_dim_time = 20110906 AND id_dim_business_unit = 1 AND id_dim_location = 1 AND id_dim_placement = 5)
    Lignes affectee : 0
    DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = 1 AND id_dim_time = 20110906 AND id_dim_business_unit = 1 AND id_dim_location = 1 AND id_dim_placement = 6)
    Lignes affectee : 0
    DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = 1 AND id_dim_time = 20110906 AND id_dim_business_unit = 1 AND id_dim_location = 2 AND id_dim_placement = 9)
    Lignes affectee : 0
    DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = 1 AND id_dim_time = 20110906 AND id_dim_business_unit = 1 AND id_dim_location = 3 AND id_dim_placement = 9)
    Lignes affectee : 0
    DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = 1 AND id_dim_time = 20110906 AND id_dim_business_unit = 1 AND id_dim_location = 4 AND id_dim_placement = 9)
    Lignes affectee : 0
    DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = 1 AND id_dim_time = 20110906 AND id_dim_business_unit = 1 AND id_dim_location = 5 AND id_dim_placement = 9)
    Lignes affectee : 0
    DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = 1 AND id_dim_time = 20110906 AND id_dim_business_unit = 1 AND id_dim_location = 6 AND id_dim_placement = 9)
    Lignes affectee : 0
    DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = 1 AND id_dim_time = 20110906 AND id_dim_business_unit = 1 AND id_dim_location = 1 AND id_dim_placement = 10)
    Lignes affectee : 0
    DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = 1 AND id_dim_time = 20110906 AND id_dim_business_unit = 1 AND id_dim_location = 1 AND id_dim_placement = 10)
    Lignes affectee : 0
    DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = 1 AND id_dim_time = 20110906 AND id_dim_business_unit = 1 AND id_dim_location = 1 AND id_dim_placement = 10)
    Lignes affectee : 0
    Je précise que la BDD est de type PostGreSQL.
    Donc pour reprendre mon problème (et au risque de me répéter) :

    Le nombre de lignes affectées est toujours égal à 0 alors qu'il ne devrait pas.

    Si j'exécute manuellement la requête que j'affiche avec le "echo" sur la base (avec pgAdmin par exemple), elle fonctionne.

    Un peu d'aide ?

    Merci d'avance !

  2. #2
    Membre actif
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Points : 281
    Points
    281
    Par défaut
    hum, je ne vois pas bien pourquoi cela fait ça ... néanmoins, je précise que bindParam lie à la référence d'une variable, tandis que bindValue "clone" le contenu de la variable. autrement dit, si tu utilise bindParam, pas besoin de les refaire à chaque fois ... et la valeur enregistrée sera la valeur actuelle de la variable.
    mais dans ton cas, comme la variable $metric initialisée avant, tu devrais plutôt utiliser bindValue :

    Donc on pourrait faire :

    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
    <?php
        $core = Core::getInstance();
        $sql = "DELETE FROM kpistar.fact_platform WHERE id_dim_platform = :platform AND id_dim_time = :time AND id_di\
    m_business_unit = :bu AND id_dim_location = :country AND id_dim_placement = :ads_type";
        $stmt = $core->dbh->prepare($sql);
        foreach ($t as $metric)
          {
            $stmt->bindValue(':platform', $metric->platform, PDO::PARAM_INT);
            $stmt->bindValue(':time', $metric->ts, PDO::PARAM_INT);
            $stmt->bindValue(':bu', $metric->bu, PDO::PARAM_INT);
            $stmt->bindValue(':ads_type', $metric->ads_type, PDO::PARAM_INT);
            $stmt->bindValue(':country', $metric_country, PDO::PARAM_INT);
            echo ("DELETE FROM kpistar.fact_platform WHERE (id_dim_platform = " . $metric->platform . " AND id_dim_\
    time = " . $metric->ts . " AND id_dim_business_unit = " . $metric->bu . " AND id_dim_location = " . $metric->coun\
    try . " AND id_dim_placement = " . $metric->ads_type . ")" . PHP_EOL);                                            
            $stmt->execute();
            echo ("Lignes affectee : " . $stmt->rowCount() . PHP_EOL);                                              
          }
    ?>
    tu pourrais aussi je crois initialisé $metric avant (puis lié avec bindParam), mais je ne peu pas aller plus loin ne connaissant pas la structure de l'objet metric.
    après, je ne crois pas que ça va résoudre ton pb ...

  3. #3
    Membre actif
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Points : 281
    Points
    281
    Par défaut
    hep, j'ai trouvé !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      $stmt->bindParam(':country', $metric_country, PDO::PARAM_INT);
    $metric_country

    tu as mis _ au lieu de ->

    on est tous pareil, on cherche une erreur vicieuse là où il n'y a rien !
    C'est l'avantage des EDI qui eux ne se laisse pas attraper pas ce genre d'erreurs sournoises
    Je dis ça mais je n'ai jamais utilisé d'EDI en PHP.
    amicalement.

Discussions similaires

  1. [PDO] Requête préparée
    Par Yoshio dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 16/10/2007, 12h07
  2. [PDO] Problème de requête préparée (à n'y rien comprendre?)
    Par waldo2188 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 20/03/2007, 21h53
  3. Obtenir code retour requête UPDATE et DELETE
    Par SurfingJeff dans le forum SQL
    Réponses: 3
    Dernier message: 02/08/2006, 12h27
  4. [PDO] Ma requêtes préparées me retourne false
    Par jeff_! dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 03/05/2006, 22h07
  5. Réponses: 4
    Dernier message: 05/04/2005, 18h28

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