hotjunkie
29/03/2010, 11h27
Finalement j'ai trouve le problème
c'est la nouvelle version de ma class de connexion a la DB
et je comprend vraiment pas pourquoi cela influe sur le contenu de mes variables avant même que j'exécute la requête .
voici l'ancienne qui marche :
et la nouvelle qui deconne :
sur le premier j'avais trop de too many connexion .j'ai voulu changer avec la deuxieme pour ouvrir une connexion a chaque requête et la refermer tout de suite après
c'est la nouvelle version de ma class de connexion a la DB
et je comprend vraiment pas pourquoi cela influe sur le contenu de mes variables avant même que j'exécute la requête .
voici l'ancienne qui marche :
Code PHP:
/**
* Database class to implement singleton pattern on top of mysqli
*/
class Database extends mysqli
{
/**
* @var object Singleton instance
*/
private $query;
private $results;
private $link;
private $job;
var $error;
private static $instance = null;
// DB connection parameters:
private $dbHost = '';
private $dbUser = '';
private $dbPwd = '';
private $dbName = '';
/**
* Constructor
* @return void
*/
private function __construct()
{
$this->link = @mysql_connect($this->dbHost, $this->dbUser,$this->dbPwd);
if(!$this->link)
{
exit("Impossible de se connecter au serveur");
}
else
if(!@mysql_select_db($this->dbName, $this->link))
exit("Impossible de se connecter a la base de donnée");
}
/**
* Do the singleton thing
* @return object Database
*/
public static function getInstance() {
if(self::$instance === null)
{
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}
public function __clone()
{
throw new Exception("Cannot clone ".__CLASS__." class");
}
public function query($query)
{
$this->query = $query;
$this->execute();
return($this->state());
}
//execute the mysql query
private function execute()
{
$this->results = mysql_query($this->query, $this->link) or $this->seterror(mysql_error());
if($this->results)
$this->job = true;
else
{
$this->job = false;
}
}
function seterror($err)
{
$_SESSION['sql-error'] = $err;
}
public function state()
{
//exit(var_dump($this->job));
return($this->job);
}
public function error()
{
return(mysql_error());
}
//protect against SQL injection attacks
public function antisql($data)
{
if (is_array($data))
{
foreach ($data as $name=>$value)
{
$data[$name] = mysql_real_escape_string($value);
}
}
else
{
$data = mysql_real_escape_string($data);
}
return $data;
}
//retrive the insert id
public function insertid()
{
return mysql_insert_id();
}
//return an array of results
public function returnArray()
{
$toret = array();
while ($row_recordset = mysql_fetch_assoc($this->results)) {
array_push($toret, $row_recordset);
}
return $toret;
}
public function num_rows($requete = null)
{
if(!empty($requete))
$this->query($requete);
return mysql_num_rows($this->results);
}
}
?>
et la nouvelle qui deconne :
Code PHP:
/**
* Database class to implement singleton pattern on top of mysqli
*/
class Database
{
/**
* @var object Singleton instance
*/
private $query;
private $results;
private static $link ;
private $job;
private $error;
private $last_id;
private $result_array;
private $result_nbr;
private static $instance = null;
private static $db_id = null;
private static $db_connect = false;
private $dbHost = '';
private $dbUser = '';
private $dbPwd = '';
private $dbName = '';
/**
* Constructor
* @return void
*/
private function __construct()
{
//global $db_srv, $db_user, $db_pass, $db_name;
//self::$link = @mysql_connect($db_srv, $db_user, $db_pass);
$this->connecte_db(0);
}
/**
* Do the singleton thing
* @return object Database
*/
private function connecte_db($id_db = 0)
{
if($id_db == 0)
{
$this->dbUser = '';
$this->dbPwd = '';
$this->dbName = '';
}
elseif($id_db == 1)
{
$this->dbUser = '';
$this->dbPwd = '';
$this->dbName = '';
}
self::$link = @mysql_connect($this->dbHost, $this->dbUser,$this->dbPwd);
if(!mysql_ping(self::$link))
{
new Error("c_db_f");
}
else
{
if(!mysql_select_db($this->dbName, self::$link) )
new Error("s_db_f");
}
}
public static function getInstance() {
if(self::$instance === null)
{
$c = __CLASS__;
self::$instance = new $c;
}
return self::$instance;
}
public function __clone()
{
throw new Exception("Cannot clone ".__CLASS__." class");
}
function lastid()
{
return $this->last_id;
}
public function query($query)
{
$this->query = $query;
$this->execute();
return($this->state());
}
/**
* This is method execute
*
* @return void Execute la requete SQL demande
*
*/
private function execute()
{
if(stristr($this->query, 'filesystem'))
$this->connecte_db(1);
else
$this->connecte_db(0);
/*if(!mysql_ping(self::$link))
$this->connecte_db(0); */
$this->results = mysql_query($this->query, self::$link) ;
$this->job = false;
if($this->results)
$this->job = true;
else
$this->error = mysql_error();
$this->result_nbr = @mysql_num_rows($this->results);
if(stristr($this->query, 'INSERT'))
$this->last_id = @mysql_insert_id();
if(stristr($this->query, 'SELECT'))
{
$this->result_array = array();
while ($row_recordset = @mysql_fetch_assoc($this->results))
{
array_push($this->result_array, $row_recordset);
}
}
@mysql_close(self::$link);
@mysql_close();
}
/**
* This is method insertid
*
* @return int l'id de la derniere insertion
*
*/
public function insertid()
{
return $this->last_id;
}
/**
* This is method returnArray
*
* @return array return an array of results
*
*/
public function returnArray()
{
return $this->result_array;
}
/**
* This is method num_rows
*
* @param string $requete requete sql
* @return int le nombre de resultat de la requete
*
*/
public function num_rows($requete = null)
{
if(!empty($requete))
$this->query($requete);
return $this->result_nbr;
}
/**
* This is method begin
*
* @return void Commence une transaction
*
*/
public function begin()
{
$this->trans = true;
$this->query(" BEGIN ");
}
/**
* This is method commit
*
* @return void Valide une transaction SQL
*
*/
public function commit()
{
$this->trans = false;
$this->query(" COMMIT ");
}
/**
* This is method rollback
*
* @return void Annule une transaction SQL
*
*/
public function rollback()
{
$this->query(" ROLLBACK ");
$this->trans = false;
}
/**
* This is method get_result
*
* @return mysqli_result retourne la reponse brut de Mysql
*
*/
public function get_result()
{
return($this->results);
}
/**
* This is method state
*
* @return bool renvoie l'etat de la requete SQL
*
*/
public function state()
{
return($this->job);
}
/**
* This is method error
*
* @return string Renvoi le Message d'erreur de Mysql
*
*/
public function error()
{
return $this->error;
}
/*//protect against SQL injection attacks
public function antisql($data)
{
if(!mysql_ping(self::$link))
$this->connecte_db(0);
if (is_array($data))
{
foreach ($data as $name=>$value)
{
$data[$name] = mysql_real_escape_string($value);
}
}
else
{
$data = mysql_real_escape_string($data);
}
return $data;
}*/
}
?>
sur le premier j'avais trop de too many connexion .j'ai voulu changer avec la deuxieme pour ouvrir une connexion a chaque requête et la refermer tout de suite après