[ODBC-Excel] Echec connexion

Résolu/Fermé
Moeb Messages postés 102 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 5 août 2008 - 29 avril 2008 à 09:42
Moeb Messages postés 102 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 5 août 2008 - 29 avril 2008 à 10:00
Bonjour,

je vous expose mon problème : je développe un logiciel qui, entre autre choses a besoin de récupérer des infos contenues dans un fichier Excel. Je gère donc la connexion au fichier Excel par ODBC, et j'utilise PDO. Voici le code incriminé.

<?php
	
	require 'DBPDO_ODBC.class.php';
	
	$config_odbc = array(ODBC_DRIVER 		=> 			'Microsoft Excel Driver (*.xls)',
						 ODBC_FILE 			=> 			'C:\wamp\www\Vannes\logs.xls'
	);

	$mydb = new DBPDO_ODBC($config_odbc);
	$mydb->Connect() or die ("Impossible de se connecter au fichier Excel. Verifiez vos infos de connexion");


	$mydb->Prepare("SELECT * FROM [Extraction$]");
	$mydb->Execute();
		
?>


D'abord, mon probleme se posait au niveau du prepare, pour lequel il me disait que $mydb n'était pas un objet, j'ai donc cru que le constructeur ne marchait pas, mais il fonctionne, le probleme vient du connect, la condition "or die" s'exécute à chaque fois... Voilà le code de la classe DBPDO_ODBC et celui de sa classe parente DBPDO

<?php	
	define("ODBC_DRIVER", "ODBC_DRIVER");
	define("ODBC_FILE", "ODBC_FILE");
	define("ODBC_USER", "ODBC_USER");
	define("ODBC_PWD", "ODBC_PWD");
	
if (!class_exists('DBPDO'))
{
	require(dirname(__FILE__) . '/DBPDO.class.php');
}

class DBPDO_ODBC extends DBPDO
{
	/**************************************************************/
	/* CONNECT									       */
	/*											       */
	/* Permet de se connecter à la base en passant en paramètre la chaine de */
	/* connexion qu'il faut.								       */
	/*											       */
	/**************************************************************/
	public function Connect()
	{
		$this->m_oPDO = new PDO('odbc:Driver={'.$this->m_tabOptions[ODBC_DRIVER].'};Dbq='.$this->m_tabOptions[ODBC_FILE],
								$this->m_tabOptions[ODBC_USER], $this->m_tabOptions[ODBC_PWD]);
		
		return parent::Connect();
	}
}

?>



[quote="DBPDO"]
<?php

if (!class_exists('DB'))
{
	require(dirname(__FILE__) . '/DB.class.php');
}

class DBPDO extends DB
{

	private $m_oPDO = null;
	private $m_oStatement = null;
	
	
	/**************************************************************/
	/* CONSTRUCTEUR 								       */
	/*											       */
	/* Permet de construire un DBPDO avec la configuration donnee par        */
	/* $options.									       */
	/*											       */
	/* $options : tableau contenant les informations de connexion a la base   */
	/* $oDbg : 										       */
	/*											       */
	/**************************************************************/
	function __construct($options, $oDbg=null)
	{
		$this->m_tabOptions = $options;
	}
	
	/**************************************************************/
	/* CONNECT									       */
	/*											       */
	/* Permet de se connecter à la base						       */
	/*											       */
	/**************************************************************/
	public function Connect() 
	{
		if ($this->m_oPDO != null)
			return true;
		else
			return false;
	}
	
	/**************************************************************/
	/* DISCONNECT									       */
	/*											       */
	/* Permet de se deconnecter de la base.					       */
	/*											       */
	/**************************************************************/
	public function Disconnect()
	{
		unset($this->m_oPDO);
	}

	/**************************************************************/
	/* PREPARE									       */
	/*											       */
	/* Prépare la future execution de la requete passee en parametre	       */
	/*											       */
	/* $sql : Requete SQL a preparer						       */
	/*											       */
	/**************************************************************/
	public function Prepare($sql)
	{
		return $this->m_oStatement = $this->m_oPDO->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
	}
	
	/**************************************************************/
	/* EXECUTE									       */
	/*											       */
	/* Execute une requete precedemment preparee				       */
	/*											       */
	/**************************************************************/
	public function Execute()
	{
		return $this->m_oStatement->execute();
	}
		
	/**************************************************************/
	/* FETCH										       */
	/*											       */
	/* Permet de récupérer les résultats d'une requête sous forme d'un	       */
	/* qui peut avoir différentes formes selon le parametre $style	       */
	/*											       */
	/* $style : Style de retour du fetch (differents types de tableaux)	       */
	/*											       */
	/**************************************************************/
	public function Fetch($style=FETCH_BOTH)
	{
		switch($style)
		{	
			case 0 : return ( $this->m_tabResults = $this->m_oStatement->fetch(PDO::FETCH_ASSOC));
			case 1 : return ( $this->m_tabResults = $this->m_oStatement->fetch(PDO::FETCH_NUM));
			case 2 : return ( $this->m_tabResults = $this->m_oStatement->fetch(PDO::FETCH_BOTH));
		}		
	}
	
	/**************************************************************/
	/* CONNECT									       */
	/*											       */
	/* Permet de récupérer une information précise du resultset courant en   */
	/* passant la clé (nom de la colonne) en parametre				       */
	/*											       */
	/* $sKey : Cle permettant d'acceder a un element précis du Resultset	       */
	/*											       */
	/**************************************************************/
	public function Get($sKey)
	{
		return $this->m_tabResults[$sKey];
	}
}

?>


J'ai essayé plusieurs choses, notamment de simplifier cette structure de DBPDO_ODBC qui hérite de DBPDO pour voir s'il s'emmelait les pinceaux dans le connect. Et visiblement oui, quand je mets tout le code de connexion dans le connect de DBPDO, il ne rentre plus dans le "or die", et me refait l'erreur "call to prepare() on a non-object".
J'ai testé avec un is_object, pour vérifier, et $mydb est bien un objet. Help >_<
A voir également:

1 réponse

Moeb Messages postés 102 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 5 août 2008 12
29 avril 2008 à 10:00
J'ai trouvé mon soucis, il suffisait que je mette $m_oPDO et $m_oStatement en protected au lieu de private, j'avais tout regardé sauf ca..
1