Class PDO, compter les requêtes...

Eléphant du PHP | 209 Messages

11 mai 2008, 15:32

Salut,

Vous l'avez peut être compris avec le topic précédant (class PDO²) je suis en galère avec PDO.
Ce que je veux faire c'est compter le nombre de requêtes exécutées et pour cela, j'ai fait ça :

Pour ma class :
Class SQl extends PDO
{
    public $lien;
    public function __construct($url, $login, $password, $nom){
        try
        {
            $lien = parent::__construct('mysql:host='.$url.';dbname='.$nom, $login, $mdp);
        }

        catch(Exception $e)
        {
			echo 'Erreur : '.$e->getMessage().'<br />';
        }

    } 
 
	public function query($query) 
	{	
	    global $NBReq;
		try
		{
        $mysql = parent::query($query);
		$NBReq++;
		return($mysql);
		}
		catch(Exception $err)
		{
			echo 'Erreur : '.$e->getMessage().'<br />';
		}
	}
	

}
et ensuite, pour le contenu de ma page :
$sql   = new SQL($mysql->host, $mysql->user, $mysql->pass, $mysql->bdd);
$liste_frm = $sql->query("SELECT * FROM ".$pre."_forums     ORDER BY cat, nb ASC");

	while ($frm[] = $liste_frm->fetch(PDO::FETCH_ASSOC)) $n++; // cette ligne n'est qu'un test (ligne 39)
je suis pourtant exactement la syntaxe donnée ici :
http://www.journaldunet.com/developpeur ... do/3.shtml
et pourtant j'ai ce message : <br />
<b>Fatal error</b>: Call to a member function fetch() on a non-object in <b>C:\wamp\www\...\index.php</b> on line <b>39</b><br />

je comprends pas pourquoi ?

Mammouth du PHP | 1668 Messages

11 mai 2008, 15:36

Déclare
public $nbrequetes;
Et a chaque fonction met
$this->nbrequetes++;
Voilà :roll:
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Eléphant du PHP | 209 Messages

11 mai 2008, 15:39

C'est vrai que c'est mieux qu'une variable global...
Mais j'ai toujours l'erreur qui s'affiche...

Mammouth du PHP | 1668 Messages

11 mai 2008, 15:55

Essaye ça pour voir :
sql= new SQL($mysql->host, $mysql->user, $mysql->pass, $mysql->bdd); 
$liste_frm = $sql->query("SELECT * FROM ".$pre."_forums     ORDER BY cat, nb ASC"); 
$liste_frm->setFetchMode(PDO::FETCH_ASSOC);
    while ($frm[] = $liste_frm->fetch()) $n++; 
"À ceux qui poursuivent leurs rêves et se spécialisent dans l'impossible" Joseph Kong

10 ans de PHP, déjà.

"moi jtrouve que katagoto il déchire!" Nagol

Eléphant du PHP | 209 Messages

11 mai 2008, 15:58

Ca donne une autre erreur :
<b>Fatal error</b>: Call to a member function setFetchMode() on a non-object in <b>C:\wamp\www\...\index.php</b> on line <b>39</b><br />

Mammouth du PHP | 983 Messages

11 mai 2008, 16:22

Salut,

Vous l'avez peut être compris avec le topic précédant (class PDO²) je suis en galère avec PDO.
Ce que je veux faire c'est compter le nombre de requêtes exécutées et pour cela, j'ai fait ça :

Pour ma class :
Class SQl extends PDO
{
    public $lien;
    public function __construct($url, $login, $password, $nom){
        try
        {
            $lien = parent::__construct('mysql:host='.$url.';dbname='.$nom, $login, $mdp);
        }

        catch(Exception $e)
        {
			echo 'Erreur : '.$e->getMessage().'<br />';
        }

    } 
 
	public function query($query) 
	{	
	    global $NBReq;
		try
		{
        $mysql = parent::query($query);
		$NBReq++;
		return($mysql);
		}
		catch(Exception $err)
		{
			echo 'Erreur : '.$e->getMessage().'<br />';
		}
	}
	

}
et ensuite, pour le contenu de ma page :
$sql   = new SQL($mysql->host, $mysql->user, $mysql->pass, $mysql->bdd);
$liste_frm = $sql->query("SELECT * FROM ".$pre."_forums     ORDER BY cat, nb ASC");

	while ($frm[] = $liste_frm->fetch(PDO::FETCH_ASSOC)) $n++; // cette ligne n'est qu'un test (ligne 39)
je suis pourtant exactement la syntaxe donnée ici :
http://www.journaldunet.com/developpeur ... do/3.shtml
et pourtant j'ai ce message : <br />
<b>Fatal error</b>: Call to a member function fetch() on a non-object in <b>C:\wamp\www\...\index.php</b> on line <b>39</b><br />

je comprends pas pourquoi ?
Salut SpintroniK, certains choses ne sont pas logiques. Tu hérites de PDO, donc pas besoin de garder une référence (avec le champ $lien), puisque c'est justement les instances que tu dois manipuler. J'ai modifié ta classe, dis moi ce que tu en penses :
class SQl extends PDO
{
    /**
     * Le nombre de requêtes exécutées
     *
     * @var int
     */
    private $NBReq;
    
    public function __construct($url, $login, $password, $nom){
        try
        {
            parent::__construct('mysql:host='.$url.';dbname='.$nom, $login, $mdp);
        }

        catch(Exception $e)
        {
			echo 'Erreur : '.$e->getMessage().'<br />';
        }

    } 
 
	public function query($query) 
	{	
		try
		{
                    $mysql = parent::query($query);
    		    $this->NBReq++;
    		     return($mysql);
		}
		catch(Exception $err)
		{
			echo 'Erreur : '.$err->getMessage().'<br />';
		}
	}
	
	public function getNBReq()
	{
	    return $this->NBReq;
	}
}
Il y avai une erreur dans le bloc catch de la méthode query ($e rempalcée par $err).

Eléphant du PHP | 209 Messages

11 mai 2008, 16:29

J'ai mis ce code, je comprends bien les modifications que tu as faites.
Par contre, je comprends toujours pas cette erreur de m***e :

J'ai corrigé cette partie :
    public function __construct($url, $login, $password, $nom){
        try
        {
            $lien = parent::__construct('mysql:host='.$url.';dbname='.$nom, $login, $mdp);
        } 
en
    public function __construct($url, $login, $password, $nom){
        try
        {
            parent::__construct('mysql:host='.$url.';dbname='.$nom, $login, $password);
        } 
class SQl extends PDO
{
    private $NBReq;
    
    public function __construct($url, $login, $password, $nom){
        try
        {
            parent::__construct('mysql:host='.$url.';dbname='.$nom, $login, $password);
        }

        catch(Exception $e)
        {
            echo 'Erreur : '.$e->getMessage().'<br />';
        }

    } 
 
    public function query($query) 
    {    
        try
        {
            $mysql = parent::query($query);
            $this->NBReq++;
            return($mysql);
        }
        catch(Exception $err)
        {
            echo 'Erreur : '.$err->getMessage().'<br />';
        }
    }
    
    public function getNBReq()
    {
        return $this->NBReq;
    }
} 
et
$sql   = new SQL($mysql->host, $mysql->user, $mysql->pass, $mysql->bdd);
$liste_frm = $sql->query("SELECT * FROM ".$pre."_forums     ORDER BY cat, nb ASC");
$liste_cat = $sql->query("SELECT * FROM ".$pre."_categories ORDER BY nb      ASC");

//Lecture des catégories et forums.
$liste_frm->setFetchMode(PDO::FETCH_ASSOC);
    while ($frm[] = $liste_frm->fetch()) $n++; 
Voila l'erreur :

<b>Fatal error</b>: Call to a member function setFetchMode() on a non-object in <b>C:\wamp\www\...\index.php</b> on line <b>39</b><br />

Mammouth du PHP | 983 Messages

11 mai 2008, 16:43

Essaies en n'exécutant qu'une seule requête. Issu de la doc:
If you do not fetch all of the data in a result set before issuing your next call to PDO::query(), your call may fail. Call PDOStatement::closeCursor() to release the database resources associated with the PDOStatement object before issuing your next call to PDO::query().

Eléphant du PHP | 209 Messages

11 mai 2008, 16:47

On dirait que le problème ne vient pas de moi, j'ai remplacé :
$sql   = new SQL($mysql->host, $mysql->user, $mysql->pass, $mysql->bdd);
$liste_frm = $sql->query("SELECT * FROM ".$pre."_forums     ORDER BY cat, nb ASC");
$liste_cat = $sql->query("SELECT * FROM ".$pre."_categories ORDER BY nb      ASC");

//Lecture des catégories et forums.
$liste_frm->setFetchMode(PDO::FETCH_ASSOC);
    while ($frm[] = $liste_frm->fetch()) $n++; 
par
$sql   = new PDO('mysql:host='.$mysql->host.';dbname='.$mysql->bdd, $mysql->user, $mysql->pass);
$liste_frm = $sql->query("SELECT * FROM ".$pre."_forums     ORDER BY cat, nb ASC");
$liste_cat = $sql->query("SELECT * FROM ".$pre."_categories ORDER BY nb      ASC");

//Lecture des catégories et forums.
$liste_frm->setFetchMode(PDO::FETCH_ASSOC);
    while ($frm[] = $liste_frm->fetch()) $n++; 
L'erreur est toujours la même, je ne sais plus quoi faire !
En gros, il dit que $liste_frm n'est pas un objet, c'est bien ça ?

Mammouth du PHP | 983 Messages

11 mai 2008, 16:56

Tu n'as pas lu ma réponse ;)

Essaies d'exécuter une seule requête et remplace $frm[] par $frm dans le while) :
$sql   = new SQL($mysql->host, $mysql->user, $mysql->pass, $mysql->bdd);
$liste_frm = $sql->query("SELECT * FROM ".$pre."_forums     ORDER BY cat, nb ASC");
//$liste_cat = $sql->query("SELECT * FROM ".$pre."_categories ORDER BY nb      ASC");

//Lecture des catégories et forums.
$liste_frm->setFetchMode(PDO::FETCH_ASSOC);
while ($frm = $liste_frm->fetch()) $n++;

Eléphant du PHP | 209 Messages

11 mai 2008, 17:09

Call to a member function setFetchMode() on a non-object

Toujours la même erreur, que ç soit en local ou sur ovh (en php5)

Mammouth du PHP | 983 Messages

11 mai 2008, 17:17

C'est ta requête SQL qui n'est pas bonne.
Affiche ta requête et exécute là, ut devrais voir une erreur ;)

Eléphant du PHP | 209 Messages

11 mai 2008, 17:55

C'est pire !!!
ça :
$list_frm = $sql->query("SELECT * FROM ".$pre."_forums ORDER BY cat, nb ASC");
$list_cat = $sql->query("SELECT * FROM ".$pre."_categories ORDER BY nb ASC");


while($frm[] = $list_frm->fetch(PDO::FETCH_ASSOC)) $n++;
ça marche !!!!
j'ai juste réécrit la requête (mais la même !!!).
J'ai envie de dire... nan en fait je vais pas le dire tellement que je suis énervé :twisted:
lol au mois j'ai la solution... enfin si on veut car j'aimerai quand même comprendre pourquoi !!!!???!!