Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/05/2006, 14h39   #1
Membre expérimenté
 
Inscription : octobre 2004
Messages : 872
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 872
Points : 582
Points : 582
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 :
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
Citation:
object(PDO)#22 (0) { }
bool(false)

et ce bout de code me reourne une page blanche
Code :
1
2
3
if( !( $sth instanceof PDOStatement)){
                echo PDOStatement::errorInfo();
            }


merci
jeff_! est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2006, 19h50   #2
Membre expérimenté
 
Inscription : octobre 2004
Messages : 872
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 872
Points : 582
Points : 582
pas d'idée
c'est bien dommage
jeff_! est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2006, 20h59   #3
Membre Expert
 
Inscription : juillet 2004
Messages : 1 033
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 1 033
Points : 1 050
Points : 1 050
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.
ePoX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2006, 21h12   #4
Membre expérimenté
 
Inscription : octobre 2004
Messages : 872
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 872
Points : 582
Points : 582
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 :
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
jeff_! est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2006, 21h34   #5
Membre Expert
 
Inscription : juillet 2004
Messages : 1 033
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 1 033
Points : 1 050
Points : 1 050
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
ePoX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2006, 21h35   #6
Membre Expert
 
Inscription : juillet 2004
Messages : 1 033
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 1 033
Points : 1 050
Points : 1 050
Citation:
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.
ePoX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2006, 21h45   #7
Membre expérimenté
 
Inscription : octobre 2004
Messages : 872
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 872
Points : 582
Points : 582
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 :
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
Citation:
'SELECT * FROM E_ACTIONFILTER WHERE ID_ACTIONFILTRE = :id'
la meme requte à été tester en utilisant le pdo directement et elle fonctionne bien
jeff_! est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2006, 21h51   #8
Membre Expert
 
Inscription : juillet 2004
Messages : 1 033
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 1 033
Points : 1 050
Points : 1 050
Citation:
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.
ePoX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2006, 21h58   #9
Membre expérimenté
 
Inscription : octobre 2004
Messages : 872
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 872
Points : 582
Points : 582
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
jeff_! est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2006, 21h59   #10
Membre Expert
 
Inscription : juillet 2004
Messages : 1 033
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 1 033
Points : 1 050
Points : 1 050
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 :
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 :
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
ePoX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2006, 22h02   #11
Membre Expert
 
Inscription : juillet 2004
Messages : 1 033
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 1 033
Points : 1 050
Points : 1 050
Citation:
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.
ePoX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2006, 22h07   #12
Membre expérimenté
 
Inscription : octobre 2004
Messages : 872
Détails du profil
Informations forums :
Inscription : octobre 2004
Messages : 872
Points : 582
Points : 582
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
jeff_! est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h14.


 
 
 
 
Partenaires

Hébergement Web