Page 1 sur 1

IteratorIterator pb

Posté : 15 oct. 2009, 21:21
par devcphp
Bonjour à tous,

je suis en train de créer ( ne rigolez pas) ma premiere classe Iterator !!

explication :
$iMyIterateAnalysimmo = new MyDbIterator('MyDb','SELECT A.Proprietaire,A.nom  FROM titi AS A  WHERE A.idCommande='.$iIdDossier);
		
			if ( TRUE === is_object($iMyIterateAnalysimmo) AND $iMyIterateAnalysimmo instanceof MyDbIterator){
				
			  foreach($iMyIterateAnalysimmo as $sValeur){
					$sTitreProprietaire=$sValeur['Proprietaire'];
					$sNomProprietaire=$sValeur['nom'];
					
				}
c'est ce que je voudrais faire .Et ce serait ma classe Iterator qui se chargerait de faire les connexions avec le sbases de données les fermetures.Jusque la je pense que c'est pas mal.

Ainsi ma classe est la suivante :
interface ConnectionServeur{
	public static function GetConnection();
}
if (TRUE === interface_exists('ConnectionServeur')){

	//-------------------------------------Acces au serveur Access -------------------------------
	final class GetConnectionMyDb implements ConnectionServeur{
		public static function GetConnection(){
			$sServeur =  Mabasededonnees ....   // notre fichier d ebase données
			$oConnectionAnalysimmo=new PDO($sServeur);   //on se connecte à la base de
				if(TRUE === is_object($oConnection) AND $oConnection instanceof PDO){
					return $oConnection;
				}
				
		}
	}
interet est si on a plusieurs bases de données ce qui est mon cas.
et voici le code qui marche pas !!!!
class MyDbIterator implements Iterator {

	  public $sOutput;             // corespond à un élement de resultat de la requete , un seul est renvoyé et sera parcouru e à l'extereieur par le foreach
	  private $oPDOStatement;
	  private $oConnectionDb;
	  private $key;

	  public function __construct ($sDb,$sQuery){
	

	
		if (!isset($sDb)){
			
			throw new NewInvalidArgumentException('La base de données n`\'a pas été passé');
		}elseif(!$sQuery){
			
			throw new NewInvalidArgumentException('Aucune requete n\'a été definie');
		}
		switch($sDb){
			case 'MyDb':$this->oConnectionDb = GetConnectionMyDb::GetConnection();
			break;
			case 'MyDb2':$this->oConnectionDb =GetConnectionMyDb2::GetConnection();
			break;
			case 'MyDb3':$this->oConnectionDb =GetConnectionMyDb3::GetConnection();
			break;
			default: throw new NewInvalidArgumentException(''La base de donnée choisie n\'existe pas');
			break;
		}
		//avec pdo pour acces on ne peut utiliser la fonction pdo prepare
		$this->oPDOStatement=$this->oConnectionDb->query($sQuery);
	   
	  }
	 
	 public function key() {
		return $this->key;
	 }

	 public function valid() {
		return isset($this->sOutput);
	 }

	 public function next() {
		
		$this->sOutput = new IteratorIterator($this->oPDOStatement); 
		$this->key++;
	 }

	 public function rewind() {
		//si jamais une connexion existe deja, on la ferme
	if (TRUE === isset($this->oConnectionDb)){
			$this->oConnectionDb=NULL;
			unset($this->oConnectionDb);
		}
		$this->key = 0;
	 }

	 public function current() {
		return $this->sOutput;
	 }

	public function __destruct(){
		$this->oConnectionDb=NULL;
		unset($this->oConnectionDb);
	}

}
et le probleme vient du fait tres certainement que pdoStatement est un iterateur lui aussi ( à ce que j'ai lu avec mon ami google).
OU est mon erreur dans mon code car aucun resultat de requete ne m'est renvoyé?

Re: IteratorIterator pb

Posté : 15 oct. 2009, 21:24
par devcphp
Pardon un erreur s'est glissé lors du formattage du texte il fallait lire :
$oConnection=new PDO($sServeur);   //on se connecte à la base de
                                if(TRUE === is_object($oConnection) AND $oConnection instanceof PDO){
                                        return $oConnection;
                                }


en effet , l'erreur n'est pas aussi simple