Page 1 sur 2

class pdo en fille

Posté : 18 avr. 2008, 14:57
par x@v
Bonjour,
je me suis fait ma classe pdo(); qui fonctionne mais pas par héritage, et je préferai, quoi qu'il en soit donnez moi votre avis en vue de l'amélioré.
Merci
PS: j'ai ajouté une gestion d'erreur qui envoie le message d'erreur par e-mail, rentrons dans le vif du sujet.
class pdo
<?php
require_once('message.class.php');
class Connection
{
	private $db = 'boutique'; 		// base de données
	private $host = 'localhost'; 	// adresse de la base
	private $user = 'root'; 		// nom
	private $pwd = ''; 				// mot de passe
	//private $pwd = 'tiensTiens';	// mot de passe
	private $con;					// 
	private $select; 				// requette de séléction
	private $execute; 				// requette d'execution
	
	public function __construct()
	{
		try 
		{
			$dsn = "mysql:dbname=$this->db;host=$this->host";
			$this->con = new PDO($dsn, $this->user, $this->pwd);
		}
		catch (PDOException $e)
		{
			//On indique par email qu'on n'a plus de connection disponible
			error_log(date('D/m/y').' à '.date("H:i:s").' : '.$e->getMessage(), 1, '[email protected]');
			$message= new Message();
			$message->outPut('Erreur 500', 'Serveur de BDD indisponible, nous nous excusons de la gêne occasionnée');
		}
		return $this->con;
	}
	
	public function select($reqSelect)
	{
		$result = $this->con->query($reqSelect);
		return $result;
	}

	public function execute($reqExecution)
	{
		$result = $this->con->exec($reqExecution);
		return $result;
	}
}
/*
$Connec = new Connection();
$result = $Connec->select("select * FROM personne");
foreach ($result as $row)
{
	echo $row['id'].'/ '.$row['nom'] . " - " . $row['prenom'] . "<br />";
}
$result = $Connec->execute("delete id FROM personne where id=2");*/
?>
message.class.php
<?php
class Message
{
	private $messageHtml;
	function __construct($as_file='./class/erreur.html')
	{
		//file_get_contents — Lit tout un fichier dans une chaîne
		$this->messageHtml=file_get_contents($as_file);
	}
	public function exceptionHandler($exception)
	{
		Message::erreur('erreur inconnue', $exception->getMessage(), 'message.html');
	}
	public function outPut($titre, $message, $as_file=NULL)
	{
		// gestion des caractères spéciaux pour le titre et texte (affiche < == <)
		$ls_msg=htmlentities($message);
		$ls_titre=htmlentities($titre);
		// remplace dans le message
		$ls_sortie=str_replace('{MSG}', $ls_msg, $this->messageHtml);
		$ls_sortie=str_replace('{TITRE}', $ls_titre, $ls_sortie);
		// Affichage et arrêt du traitement
		die($ls_sortie);
	}
	public static function erreur($exception, $message, $file)
	{
		$ls_titre=htmlentities('Erreur inconnue');
		$ls_msg=htmlentities($message);
		$ls_messageHtml=file_get_contents($file);
		$ls_sortie=str_replace('{MSG}', $ls_msg, $this->messageHtml);
		$ls_sortie=str_replace('{TITRE}', $ls_titre, $ls_sortie);
		die($ls_sortie);
	}
}
?>
erreur.html (template de sortie en cas d'erreur)

Code : Tout sélectionner

<?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD xhtml" xml:lang="fr"> <html> <head> <title>Ereur</title> <link rel="stylesheet" type="text/css" media="all" href="*.css" /> </head> <body> <h1>{TITRE}</h1> <h3> <a href="http://<?php echo $_SERVER['HTTP_HOST'];?>">Cliquez ici pour retournez à la page d'accueil</a> </h3> <p class=""> {MSG} </p> </body> </html>

Posté : 19 avr. 2008, 00:19
par Hywan
Hey :),

j'ai pas compris où était la question mais je donne mon avis.
Moi j'aurais plutôt fait une classe qui gère les erreurs et ce serait à l'utilisateur de capturer les exceptions et de lancer des actions de ta classe d'erreur comme il le souhaite. Histoire d'être plus modulaire quoi. Parce que là, je ne vois pas vraiment l'intérêt.
Un exemple de classe d'erreur : on affiche une belle page, on écrit les logs, on envoie un mail ...

Posté : 19 avr. 2008, 00:34
par x@v
Moi j'aurais plutôt fait une classe qui gère les erreurs et ce serait à l'utilisateur de capturer les exceptions et de lancer des actions de ta classe d'erreur comme il le souhaite. Histoire d'être plus modulaire quoi. Parce que là, je ne vois pas vraiment l'intérêt.
en faite pour une connection à une BDD il n'y a que des ereurs internes 500, après pour le reste je ne sais pas je ne vois pas l'interêt quel type d'erreur ?
As-tu un exemple ?
Logiquement PDO() peux être hérité, mais je n'y suis pas arrivé ?
donc la faire hériter serai logique, mon utilisation n'est pas performante.

Posté : 19 avr. 2008, 11:13
par Hywan
Ah donc ce que tu veux, c'est étendre la classe PDO. Bah c'est pas compliqué.
<?php

header('Content-type: text/plain');

Reflection::export(new ReflectionClass('PDO'));
Hop, tu as tout ce qu'il te faut :).

Posté : 19 avr. 2008, 14:38
par x@v
aurrai-tu un exemple d'utilisation, parce que sa renvoie (ci-dessous), j'ai pas essayer (pas le temps dans l'immédiat), sa permet de comprendre le fonctionnement mais l'api doit surrement donnés des méthode... Tu donnes une excellent piste pour des objets (déjà instancié)

Code : Tout sélectionner

Class [ <internal:PDO> class PDO ] { - Constants [77] { Constant [ integer PARAM_BOOL ] { 5 } Constant [ integer PARAM_NULL ] { 0 } Constant [ integer PARAM_INT ] { 1 } Constant [ integer PARAM_STR ] { 2 } Constant [ integer PARAM_LOB ] { 3 } Constant [ integer PARAM_STMT ] { 4 } Constant [ integer PARAM_INPUT_OUTPUT ] { -2147483648 } Constant [ integer PARAM_EVT_ALLOC ] { 0 } Constant [ integer PARAM_EVT_FREE ] { 1 } Constant [ integer PARAM_EVT_EXEC_PRE ] { 2 } Constant [ integer PARAM_EVT_EXEC_POST ] { 3 } Constant [ integer PARAM_EVT_FETCH_PRE ] { 4 } Constant [ integer PARAM_EVT_FETCH_POST ] { 5 } Constant [ integer PARAM_EVT_NORMALIZE ] { 6 } Constant [ integer FETCH_LAZY ] { 1 } Constant [ integer FETCH_ASSOC ] { 2 } Constant [ integer FETCH_NUM ] { 3 } Constant [ integer FETCH_BOTH ] { 4 } Constant [ integer FETCH_OBJ ] { 5 } Constant [ integer FETCH_BOUND ] { 6 } Constant [ integer FETCH_COLUMN ] { 7 } Constant [ integer FETCH_CLASS ] { 8 } Constant [ integer FETCH_INTO ] { 9 } Constant [ integer FETCH_FUNC ] { 10 } Constant [ integer FETCH_GROUP ] { 65536 } Constant [ integer FETCH_UNIQUE ] { 196608 } Constant [ integer FETCH_KEY_PAIR ] { 12 } Constant [ integer FETCH_CLASSTYPE ] { 262144 } Constant [ integer FETCH_SERIALIZE ] { 524288 } Constant [ integer FETCH_PROPS_LATE ] { 1048576 } Constant [ integer FETCH_NAMED ] { 11 } Constant [ integer ATTR_AUTOCOMMIT ] { 0 } Constant [ integer ATTR_PREFETCH ] { 1 } Constant [ integer ATTR_TIMEOUT ] { 2 } Constant [ integer ATTR_ERRMODE ] { 3 } Constant [ integer ATTR_SERVER_VERSION ] { 4 } Constant [ integer ATTR_CLIENT_VERSION ] { 5 } Constant [ integer ATTR_SERVER_INFO ] { 6 } Constant [ integer ATTR_CONNECTION_STATUS ] { 7 } Constant [ integer ATTR_CASE ] { 8 } Constant [ integer ATTR_CURSOR_NAME ] { 9 } Constant [ integer ATTR_CURSOR ] { 10 } Constant [ integer ATTR_ORACLE_NULLS ] { 11 } Constant [ integer ATTR_PERSISTENT ] { 12 } Constant [ integer ATTR_STATEMENT_CLASS ] { 13 } Constant [ integer ATTR_FETCH_TABLE_NAMES ] { 14 } Constant [ integer ATTR_FETCH_CATALOG_NAMES ] { 15 } Constant [ integer ATTR_DRIVER_NAME ] { 16 } Constant [ integer ATTR_STRINGIFY_FETCHES ] { 17 } Constant [ integer ATTR_MAX_COLUMN_LEN ] { 18 } Constant [ integer ATTR_EMULATE_PREPARES ] { 20 } Constant [ integer ATTR_DEFAULT_FETCH_MODE ] { 19 } Constant [ integer ERRMODE_SILENT ] { 0 } Constant [ integer ERRMODE_WARNING ] { 1 } Constant [ integer ERRMODE_EXCEPTION ] { 2 } Constant [ integer CASE_NATURAL ] { 0 } Constant [ integer CASE_LOWER ] { 2 } Constant [ integer CASE_UPPER ] { 1 } Constant [ integer NULL_NATURAL ] { 0 } Constant [ integer NULL_EMPTY_STRING ] { 1 } Constant [ integer NULL_TO_STRING ] { 2 } Constant [ string ERR_NONE ] { 00000 } Constant [ integer FETCH_ORI_NEXT ] { 0 } Constant [ integer FETCH_ORI_PRIOR ] { 1 } Constant [ integer FETCH_ORI_FIRST ] { 2 } Constant [ integer FETCH_ORI_LAST ] { 3 } Constant [ integer FETCH_ORI_ABS ] { 4 } Constant [ integer FETCH_ORI_REL ] { 5 } Constant [ integer CURSOR_FWDONLY ] { 0 } Constant [ integer CURSOR_SCROLL ] { 1 } Constant [ integer MYSQL_ATTR_USE_BUFFERED_QUERY ] { 1000 } Constant [ integer MYSQL_ATTR_LOCAL_INFILE ] { 1001 } Constant [ integer MYSQL_ATTR_INIT_COMMAND ] { 1002 } Constant [ integer MYSQL_ATTR_READ_DEFAULT_FILE ] { 1003 } Constant [ integer MYSQL_ATTR_READ_DEFAULT_GROUP ] { 1004 } Constant [ integer MYSQL_ATTR_MAX_BUFFER_SIZE ] { 1005 } Constant [ integer MYSQL_ATTR_DIRECT_QUERY ] { 1006 } } - Static properties [0] { } - Static methods [1] { Method [ <internal:PDO> static public method getAvailableDrivers ] { } } - Properties [0] { } - Methods [15] { Method [ <internal:PDO, ctor> public method __construct ] { - Parameters [4] { Parameter #0 [ <required> $dsn ] Parameter #1 [ <required> $username ] Parameter #2 [ <required> $passwd ] Parameter #3 [ <optional> $options ] } } Method [ <internal:PDO> public method prepare ] { - Parameters [2] { Parameter #0 [ <required> $statment ] Parameter #1 [ <optional> $options ] } } Method [ <internal:PDO> public method beginTransaction ] { } Method [ <internal:PDO> public method commit ] { } Method [ <internal:PDO> public method rollBack ] { } Method [ <internal:PDO> public method setAttribute ] { - Parameters [2] { Parameter #0 [ <required> $attribute ] Parameter #1 [ <required> $value ] } } Method [ <internal:PDO> public method exec ] { - Parameters [1] { Parameter #0 [ <required> $query ] } } Method [ <internal:PDO> public method query ] { } Method [ <internal:PDO> public method lastInsertId ] { - Parameters [1] { Parameter #0 [ <optional> $seqname ] } } Method [ <internal:PDO> public method errorCode ] { } Method [ <internal:PDO> public method errorInfo ] { } Method [ <internal:PDO> public method getAttribute ] { - Parameters [1] { Parameter #0 [ <required> $attribute ] } } Method [ <internal:PDO> public method quote ] { - Parameters [2] { Parameter #0 [ <required> $string ] Parameter #1 [ <optional> $paramtype ] } } Method [ <internal:PDO> final public method __wakeup ] { } Method [ <internal:PDO> final public method __sleep ] { } } } >

Posté : 19 avr. 2008, 15:43
par Hywan
Bien, on sait qu'une exception est lancée lors de l'instanciation de l'objet PDO.
Avec ce que je t'ai donné, on connaît exactement le prototype de chaque méthode. Tu peux donc essayer un truc du genre :
<?php

class MonPDO extends PDO {

    /**
     * On sait que les trois premiers paramètres sont requis (obligatoires)
     * et que le dernier est optionnel (voir le résultat de mon premier code).
     */
    public function __construct ( $dns, $username, $passwd, $options = array() ) {

        try {

            parent::__construct($dns, $username, $passwd, $options);
        }
        catch( PDOException $e ) {
            throw $e;
        }
    }
}
Maintenant tu vois comment étendre la classe PDO :).

Posté : 19 avr. 2008, 19:55
par x@v
j'ai capter

Code : Tout sélectionner

Method [ <internal:PDO, ctor> public method __construct ] { - Parameters [4] { Parameter #0 [ <required> $dsn ] Parameter #1 [ <required> $username ] Parameter #2 [ <required> $passwd ] Parameter #3 [ <optional> $options ] } }
je savait même pas qu'on surchargeait une méthode avec parent:: (en php)
Les deux points je croyais que c'était que pour appeler méthode static.
Mais c'est vrai que c'est bien pratique...

Posté : 19 avr. 2008, 21:01
par Hywan
Les doubles deux points ce n'est pas seulement pour les méthodes statiques. C'est l'opérateur de résolution de portée, propre à PHP. Je te conseille de lire le manuel pour en savoir plus :).

La surcharge ne se fait pas à travers parent. parent est mot-clé qui appelle les méthodes la classe parent (de la mère donc, ou tout autre classe parent). La surcharge c'est le fait de déclarer la même méthode que la mère mais dans la fille. En général, c'est pour y ajouter des fonctionnalités, donc on commence (souvent, mais pas tout le temps) par appeler la classe mère (-teresa, hu-hu ...), et on récupère le résultat pour le traiter ; ce que j'ai fais dans mon dernier code.

Kapito ? Moi je vais manger, si t'as plus de question, n'hésite :). Je ne m'étale pas sur le sujet, c'est cuit ;-).

Posté : 20 avr. 2008, 22:41
par Sékiltoyai
La surcharge c'est le fait de déclarer la même méthode que la mère mais dans la fille.
Euh, désolé de te reprendre mon cher HyWaN, mais c'est la redéfinition que tu décris là.
La surcharge c'est la définition de plusieurs méthodes de même nom mais de prototype différent (qui n'existe pas vraiment en php soit dit en passant) :-/

Posté : 20 avr. 2008, 23:17
par Hywan
Vous avez raison cher confrère ;-).
Mais en plus, la surcharge en PHP (overload) c'est les méthodes magiques entre autre (__set, __get etc.), alors tu vois ... ^^

Posté : 21 avr. 2008, 02:57
par x@v
livre : Programmation Orientée Objet avec PHP 5
Sa existe ça ?
Parce que des livres en objets sur php j'en cherche toujours ^^. A postiori qui ne traite que de ce sujet mais sa serai noël...
Belle signature (quand même).[/b]

Posté : 21 avr. 2008, 05:03
par Hywan
Merci :).
Pour le livre, voir ce sujet.

Posté : 21 avr. 2008, 09:32
par Sékiltoyai
D'ailleurs c'est avec PHP et non PH5, ou alors tu mets PHP5+ mais bon

Posté : 23 avr. 2008, 17:56
par x@v
la faire hériter finalement je m'y retrouve pas.
Par contre j'aimerai que ma requete me retourne un tableau que je puisse réupérer sans passer par un foreach, mais rien à faire !
require_once('message.class.php');
class Connection
{
	private $db = 'boutique'; 		// base de données
	private $host = 'localhost'; 	// adresse de la base
	private $user = 'root'; 		// nom
	private $pwd = ''; 				// mot de passe
	//private $pwd = 'e9342TqokJ';	// mot de passe
	private $con;					// 
	private $select; 				// requette de séléction
	private $execute; 				// requette d'execution
	private $result;				//
	
	public function __construct()
	{
		try 
		{
			$dsn = "mysql:dbname=$this->db;host=$this->host";
			$this->con = new PDO($dsn, $this->user, $this->pwd);
		}
		catch (PDOException $e)
		{
			//On indique par email qu'on n'a plus de connection disponible
			error_log(date('D/m/y').' à '.date("H:i:s").' : '.$e->getMessage(), 1, '[email protected]');
			$message= new Message();
			$message->outPut('Erreur 500', 'Serveur de BDD indisponible, nous nous excusons de la gêne occasionnée');
		}
		return $this->con;
	}
	
	public function select($reqSelect)
	{
		$this->result=$result;
		$result=array();
		$this->result= $this->con->query($reqSelect);
		return $this->result;
	}
}
habituellement je fais un foreach pour obtenir le réultat :
$connect = new Connection();
////////////////////////////////////////////
$sql="SELECT * FROM produits";
$result= $connect->select($sql);
foreach ($result as $row)
{
	echo $row['id'];
}
mais j'ai besoin de retourner le tableau directement pour mon application mvc,
$sql="SELECT * FROM produits";
$result=$connect->select($sql);
	echo $resu['id'];

Posté : 23 avr. 2008, 19:20
par Hywan
Alors prépare le tableau en amont, i.e. dans ta méthode select que tu redéfinis, tu appelles le parent, tu récupères le résultat, tu boucles dessus pour retourner un beau tableau, et le tour est joué.