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 :

Ma requêtes préparées me retourne false [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut Ma requêtes préparées me retourne false
    salut
    j'ai un petit probleme avec les requete prepare et l'ancapsulation de pdo

    pdo::prepare me retourne false, j'ai du uoblié quelque chose mais je vois, je m'en remet donc a vous
    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
    44
    45
    46
    47
    48
    49
    50
    51
     
    /***constructeur ****/
     if (isset ($config['DRIVEROPTION'])) {
                        $this->driverOption = $config['driverOption'];
                        $this->DAOobject = new PDO($this->getDns(), $this->login, $this->password, $this->driverOption);
                    } else {
                        $this->DAOobject = new PDO($this->getDns(), $this->login, $this->password);
     
                    }
     
                    if(! ($this->DAOobject instanceof PDO ) ){
                        print_r( PDO::errorInfo() );
                    }
     
     
    /***methode doQuery ***/
    public final function doQuery( $AliasQuery, array $tabParam = null) {
            $query = $this->getQuery( $AliasQuery );
            if ( is_null(($query)) ) {
                //throw new DAOException('Requete indefinie pour l\'alias '.$AliasQuery);
                trigger_error('Requete indefinie pour l\'alias '.$AliasQuery, E_USER_ERROR);
                return false;
            } else {
     
                $sth = $this->DAOobject->prepare( $query );
     
                echo var_dump( $this->DAOobject  );
                echo var_dump( $sth );
     
                /*if( !( $sth instanceof PDOStatement)){
                    echo PDOStatement::errorInfo();
                }*/
     
     
    /***utilsation ***/
     $config= array( 
                     'SERVEUR'       => 'linux027',
                    'USER'          => 'framework',
                    'PASS'          => 'fsreacmueewdoirtko',
                    'BASE'          => 'framework',
                    //'BASE'          => 'framework_test',
                    'TYPE'          => 'mysql',
                    'REQUETE'       => 'basemetiers',
                    'DEBUG'         => 0,
                    'TYPERESULT'    => 'ASSOC'
                    );
     
    $pdo = new DAO( $config );
    $pdo->setAttribute( 'ERRMODE_WARNING' );
    $pdo->doQuery('hello');
    /** la requete SELECT * FROM E_ACTIONFILTER ***/
    voici ce me donne les echo
    object(PDO)#22 (0) { }
    bool(false)

    et ce bout de code me reourne une page blanche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if( !( $sth instanceof PDOStatement)){
                    echo PDOStatement::errorInfo();
                }


    merci

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    pas d'idée
    c'est bien dommage

  3. #3
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Tu as essayer avec is_subclass_of, ça colle un peu moins à ce que tu voulais faire avec instanceof.
    Mais la denière fois que j'ai eu à utilise instanceof sa ne fonctionner pas correctement et cette fonction m'a sauvé la mise.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    j'ai pas essayé is_subclass_off car ma class ne derive pas de PDO, j'avais essayé pendant un temps de la faire derivé en appellant le constructeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class connect extends PDO
    {
    private $PDOobject;
     
    public function __construct( $config )
    {
    $this->PDOobject = parent::__contruct(...);
    }
    }
    mais $this->PDOobject était null

    j'ai donc enlevé l'héritage et utilisé l'operateur new

    instanceof semble fonctionné

    ce qui m'embete c'est que je n'arrive pas à recupere l'objet PDOStatement
    et les methodes
    PDO::errorInfo() merde

    et j'en ai besoin car le framework utilise les triggers

  5. #5
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Ok ok j'avais lu de travers....

    Mais je viens de voir un truc en me replongeant dans la doc de PDO, c'est que errorInfo n'est pas une méthode static.

    Au lieu de faire un isnot instanceof PDOStatement, je testerais sur la valeur false.

    Concernant le code d'erreur c'est selon la condition enoncé précedemment. En effet si prepare renvoie false, il faut que tu interroges l'objet PDO, sinon il faut interroger l'objet PDOStatement.

    cf :
    Pour l'objet PDOStatement :
    http://php.benscom.com/manual/fr/fun...-errorinfo.php
    Pour l'objet PDO :
    http://php.benscom.com/manual/fr/fun...do-prepare.php
    http://php.benscom.com/manual/fr/fun...-errorcode.php

    bbye

  6. #6
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    ce qui m'embete c'est que je n'arrive pas à recupere l'objet PDOStatement
    et les methodes
    Cela est surement du à un problème de requete. voir la méthode getquery.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    il y a un truc que je trouve tres moche sur la doc de php.net
    c'est qu'on ne sat jamais si une method et static ou non

    voici la methode doQuery et getQuery
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    public final function doQuery( $AliasQuery, array $tabParam = null) {
            $query = $this->getQuery( $AliasQuery );
            if ( is_null(($query)) ) {
                //throw new DAOException('Requete indefinie pour l\'alias '.$AliasQuery);
                trigger_error('Requete indefinie pour l\'alias '.$AliasQuery, E_USER_ERROR);
                return false;
            } else {
     
                $sth = $this->DAOobject->prepare( $query['value'] );
     
                echo var_dump( $this->DAOobject  );
                echo var_dump( $sth );
     
                /*if( !( $sth instanceof PDOStatement)){
                    echo PDOStatement::errorInfo();
                }*/
     
            }
            if ( !is_null( $tabParam ) ) {
                if ( $query['type'] === 'assoc' ) {
                    foreach ( $this->formatTabParam($tabParam) as $key => $value) {
                        $sth->bindParam( ":$key", $value, $value['type'] );
                    }
                }
     
                elseif ( $query['type'] === 'numeric' ) {
                    foreach ( $this->formatTabParam($tabParam) as $key => $value) {
                        $sth->bindParam( $key, $value['value'], $value['type'] );
                    }
                } else {
                    //throw new DAOException('Requete indefinie pour l\'alias '.$AliasQuery);
                    trigger_error('le tableau $tabParam doit être un tableau numerique ou associatif '.$AliasQuery, E_USER_ERROR);
                }
            }
     
     
            $sth->execute();
            $mode =  eval("PDO::$this->typeResult;");
            $sth->setFetchMode( $mode );
            return (array) $sth->fetchAll();
        }
     
        /**
         * retourne la requete defini par $AliasQuery
         *
         * @param string $AliasQuery
         * @return array $tab tableau associatif clé( value , type )
         */
        public function getQuery( $AliasQuery ) {
            $tab['value'] = (string)$this->query->get( 'SQL_'.$AliasQuery );
            if( strstr( $tab['value'] , '?' )){
                $tab['type'] = 'numeric';
            }elseif( strstr( $tab['value'] , ':'  )){
                $tab['type'] = 'assoc';
            }else{
                $tab['type'] = 'noparam';
            }
            return (array)$tab;
        }
    la requete est
    'SELECT * FROM E_ACTIONFILTER WHERE ID_ACTIONFILTRE = :id'
    la meme requte à été tester en utilisant le pdo directement et elle fonctionne bien

  8. #8
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    c'est qu'on ne sat jamais si une method et static ou non
    Et oui, l'interface est faites pour du procédural. Esperons une mis à jour pour php 6

    Ceci dit, avant de regarder ton code plus en profondeur, je me permets, par curiosité, de te demander l'interets de cette abstraction supplémentaire. En effet il semble que tu fais le travail en double sansy ajouter de valeur ajoutée, ou alors je ne l'ai pas vu.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    alor en faite je travail sur la migration d'un framewok php4 => php5
    il une class Connectbdd pourri au possible et donc je fait en sorte de m'intefacé avec cette class, en reprenent leur methode de configuration et la reutilisation de leur requete

    la class que je montre pourra soit s'interfarce avec l'ancien plugin soit etre utilisé avce les methode du pdo ( avec une getPDO() )
    la gestion de cache sera integré ( de la meme facon que l'ancien plugin )

    mon but a terme est de mettre un mapping objet / relationnel

  10. #10
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Deja il y à un truc qui me chagrine dans ta méthode getquery.

    Tu ne déclares pas $tab. On ne sait pas d'ou il vient.

    De plus, plus tard tu testes si cette fonction renvoie NULL, hors dans ton code, le seul cas prévu est de renvoyer un tableau avec deux clés.

    Donc je la changerai ainsi pour commencer.
    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
     
        /**
         * retourne la requete defini par $AliasQuery
         *
         * @param string $AliasQuery
         * @return array $tab tableau associatif clé( value , type )
         */
        public function getQuery( $AliasQuery ) {
     
            $tab = array();
            $tab['value'] = NULL;   
            $tab['type'] = 'noparam';
     
             $tab['value'] = $this->query->get( 'SQL_'.$AliasQuery );
            if( strstr( $tab['value'] , '?' ))
            {
                $tab['type'] = 'numeric';
            }
            elseif( strstr( $tab['value'] , ':'  ))
            {
                $tab['type'] = 'assoc';
            }
     
            return $tab;
        }
    En suite serait bien si $this->query->get( 'SQL_'.$AliasQuery ); renvoies uelque chose de significatif si il ne trouve rien. Genre NULL, ou false.
    Si tu décides que se sera NULL, sa collera avec $tab['value'], sinon il faudra rajouter un petit test pour repositionner $tab['value'] à NULL, si $this->query->get renvoie false.

    Et du coup faudrait modifier legerement ce bout de code, au niveau de la condition is_null() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public final function doQuery( $AliasQuery, array $tabParam = null) {
            $query = $this->getQuery( $AliasQuery );
            if ( $query['value'] == NULL ) {
                //throw new DAOException('Requete indefinie pour l\'alias '.$AliasQuery);
                trigger_error('Requete indefinie pour l\'alias '.$AliasQuery, E_USER_ERROR);
                return false;
            } else {
    ....
    Se devrait deja ressortir une erreur normalement. Enfin je pense.

    bbye

  11. #11
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    alor en faite je travail sur la migration d'un framewok php4 => php5
    il une class Connectbdd pourri au possible et donc je fait en sorte de m'intefacé avec cette class, en reprenent leur methode de configuration et la reutilisation de leur requete

    la class que je montre pourra soit s'interfarce avec l'ancien plugin soit etre utilisé avce les methode du pdo ( avec une getPDO() )
    la gestion de cache sera integré ( de la meme facon que l'ancien plugin )

    mon but a terme est de mettre un mapping objet / relationnel
    Pas facile comme problème.

    Pour ce qui est de L'O/R je t'admires d'avoir tant de confiance mais c'est un domaine qui reste très compliqué.
    Et les solutions en PHP existe deja. Elles ne paraissent pas torp trop mal, mais pour le moment je n'ai pas eu le temps de les tester, et puis j'avoue que j'y préférerais une sgbdo, définitiviment.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Points : 691
    Points
    691
    Par défaut
    ouai je testerai demain

    pour l'O/R j'aimerai bien le faire, c'est vrai que c'est compliqué( et de plus même si j'arrive a en faire un potable (utilisable et leger )je sur pas sur qu'il utilisé, les habitudes...) sinon j'espere une nouvelle version du SDO

    bye

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/09/2010, 12h34
  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. [MySQL] Requête qui ne retourne rien
    Par baleiney dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 28/06/2006, 18h29
  4. [php 5.1.2][bug?]get_cfg_var retourne false
    Par jeff_! dans le forum Langage
    Réponses: 2
    Dernier message: 22/05/2006, 13h33
  5. [MySQL] Requête qui ne retourne qu'un enregistrement
    Par krfa1 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 04/04/2006, 06h55

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