class pdo en fille

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : class pdo en fille

par Hywan » 27 avr. 2008, 15:07

Tu ne te protèges effectivement pas des injections SQL avec ton code.

Les notions de POO n'appartiennent pas à Java hein. On en a tué pour l'exemple pour moins que ça tu sais ...
Le polymorphisme existe pour nous permettre des implémentations abstraites, ou une utilisation abstraite du code. Donc ça passe à travers l'extension d'une classe normale, d'une classe abstraite, ou d'une interface.

Le fait que tu puisses utiliser l'association (notion générale de l'agrégation et composition) est dû au fait que tu as un polymorphisme. Tu peux interchanger les objets entre eux sans te poser de question car ils ont un type particulier.

Bon — on y arrive — pourquoi dis-tu qu'on ne peut pas faire de surchage avec la classe de PDO ? Je doute que toutes les méthodes soient finalisées (via le mot-clé final) ...

par x@v » 27 avr. 2008, 14:45

en faite je l'ai revue, mais sans requete préparé je ne me protège pas des injections ?
<?php
#########################################################################################################
//////////////////////////////////				/************************************************/		#
//  	 #              #		//				/*     *****   class par Xavier Artot alias x@v */		#
//       #             ##		//				/*     *****   [email protected] ****************/		#
//       ###        #####		//				/*     *****   Ma première classe en php ********/		#
//       # ###    #######		//				/*     *****   cette classe permet d'avoir un ***/		#
//            ########  #		//				/*     *****   panier ou cadie pour un site *****/		#
//           #######			//				/*     *****   vous êtes conviés à laisser ******/		#
//       # #########			//				/*     *****   ce commentaire *******************/		#
//       ######     ### #		//				/*     *****   developpus.com *******************/		#
//       ###          ###		//				/*     *****   developpus.com *******************/		#
//       #              #		//				/*     *****   developpus.com *******************/		#
//          ###					//				/*     *****   developpus.com *******************/		#
//        #######    ##			//				/*     *****   developpus.com *******************/		#
//       #########  ####		//				/************************************************/		#
//       ##     ##   # ##		//																		#
//       #      ##      #		//																		#
//       ##     #      ##		//																		#
//       ###############		//																		#
//       ##############			//																		#
//       #						//																		#
//								//																		#
//                      #		//																		#
//                    ###		//																		#
//                #######		//																		#
//             ##########		//																		#
//        ##########			//																		#
//       ########				//																		#
//           ###				//																		#
//               ####   #		//																		#
//                   ####		//																		#
//                      #		//																		#
//////////////////////////////////																		#
#########################################################################################################
require_once('message.class.php');
class Connection extends PDO 
{	
	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 = '**********';	// mot de passe
	private $con;					// 
	private $select; 				// requette de séléction
	private $execute; 				// requette d'execution
	private $result;				//
	private $dns;
      
    public function __construct () 
    {
        try {
			$this->con = parent::__construct($this->getDns(), $this->user, $this->pwd);
		    // pour mysql on active le cache de requête
		    if($this->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql')
		    {
		    	$this->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
		    }
		    return $this->con;
        }
        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');
		}
    }
    
	public function select($reqSelect)
	{
		try 
		{
			$this->con = parent::beginTransaction();
			$result= parent::query($reqSelect);
			$this->con = parent::commit();
	  		return $result;
		}
		catch (Exception $e) 
		{
			//On indique par email que la requête n'a pas fonctionné.
			error_log(date('D/m/y').' à '.date("H:i:s").' : '.$e->getMessage(), 1, '[email protected]');
			$this->con =parent::rollBack();
			$message= new Message();
			$message->outPut('Erreur dans la requêtte', 'Votre requête a été abandonné');
		}
	}
	
	public function getDns()
	{
		return 'mysql:dbname='.$this->db.';host='.$this->host;
	}
}
?>
J'entends polymorphisme surcharger les méthodes ou redéfinir grace à l'héritage en passant d'une classe à l'autre à travers des associations de compositions.
Mais ça fait longtemps que j'ai pas codé en java et ont perds vite.

par Hywan » 27 avr. 2008, 14:31

Ce que tu as fait est correcte même si c'est un peu bancale. Mais bon, ça reste quand même pas trop mauvais dans l'ensemble.

Qu'est-ce que tu veux dire qu'on ne peut pas redéfinir les méthodes de PHP ? Et là, je crois que tu confonds le terme polymorphisme avec autre chose, car « faire du polymorphisme » ne s'applique pas dans ton cas.

par x@v » 27 avr. 2008, 13:55

ce que je ne comprend pas c'est pourquoi ont ne peux pas surcharger ou faire du polymorphisme avec la classe héritée PDO ?

par x@v » 23 avr. 2008, 20:56

j'ai pas compris :oops:
par contre ceci me retourne le résultat en double :?:
	public function select($reqSelect)
	{
		$this->result=$result;
		$result=array();
		$result= $this->con->query($reqSelect);
		foreach ($result as $row)
		{
			foreach ($row as $ligne)
			{
				return $ligne.'<br>';
			}
		}
	}
j'ai un exemple en procédural qui fonctionne...
function get_news($id)
{
$news_req = mysql_query("SELECT * FROM news WHERE id='$news_id'",dbconnect());
return mysql_fetch_array($news_req);
}

function get_comment($news_id)
{
	$comment_req = mysql_query("SELECT * FROM commentaires WHERE news_id='$news_id'",dbconnect());
	$result = array();
	while ($comment = mysql_fetch_array($comment_req)) 
	{
		$result[] = $comment;
	}
	return $result;
}
edit->
j'ai refait ma class avec héritage, donc sa fonctionne, j'ai aussi ajouter les transactions qui d'après la doc améliorent la vitesse entre autre chose.
http://www.developpus.com/mvc/controlle ... page=index (sa semble vrai)
Mais suis-je dans le vrai ?
<?php
require_once('message.class.php');
class Connection extends PDO {
	
	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 = '***********';	// mot de passe
	private $con;					// 
	private $select; 				// requette de séléction
	private $execute; 				// requette d'execution
	private $result;				//
	private $dns;
      
    public function __construct () 
    {
        try {
			$dsn = "mysql:dbname=$this->db;host=$this->host";
			$this->con = parent::__construct($dsn, $this->user, $this->pwd);
			//return $this->con;
        }
        catch(PDOException $e) {
			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');
        }
    }

	public function select($reqSelect)
	{
		try 
		{
			parent::beginTransaction();
			$result=parent::query($reqSelect);
			parent::commit();
	  		return $result;
		}
		catch (Exception $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]');
			parent::rollBack();
			$message= new Message();
			$message->outPut('Erreur dans la requêtte', 'Votre requête a été abandonné');
		}
	}
	public function selectTest($reqSelect)
	{
			$result=parent::query($reqSelect);
	  		return $result;
	}
}
/*
$connection = new Connect();
////////////////////////////////////////////
$sql="SELECT * FROM categorie";
$result= $connection->select($sql);
foreach ($result as $row)
{
	echo $row['description'].'<br>';
}
*/
?>

par Hywan » 23 avr. 2008, 19:20

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é.

par x@v » 23 avr. 2008, 17:56

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'];

par Sékiltoyai » 21 avr. 2008, 09:32

D'ailleurs c'est avec PHP et non PH5, ou alors tu mets PHP5+ mais bon

par Hywan » 21 avr. 2008, 05:03

Merci :).
Pour le livre, voir ce sujet.

par x@v » 21 avr. 2008, 02:57

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]

par Hywan » 20 avr. 2008, 23:17

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 ... ^^

par Sékiltoyai » 20 avr. 2008, 22:41

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) :-/

par Hywan » 19 avr. 2008, 21:01

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 ;-).

par x@v » 19 avr. 2008, 19:55

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...

par Hywan » 19 avr. 2008, 15:43

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 :).