.
*/
abstract class PhpMyConnect
{
/**
* Requete SQL avant le bind des parametres
*/
public $prepare = '';
/**
* Adresse du serveur de base de donnees
*/
protected $sql_server = '';
/**
* Nom de la base
*/
protected $sql_base = '';
/**
* Identifiant de l'utilisation
*/
protected $sql_login = '';
/**
* Mot de passe
*/
protected $sql_password = '';
/**
* Type de base de donnees : mysql/oracle/odbc
*/
protected $type = '';
/**
* Requere SQL qui sera executer, apres le bind des parametres
*/
private $requete = '';
/**
* Objet de connexion
*/
private $conn;
private function secure_string ($s)
{
if ($this->type == 'oracle')
{
$s = str_replace ('\'', '\\\'', $s);
}
else if ($this->type == 'mysql')
{
$s = mysql_real_escape_string ($s);
}
else if ($this->type == 'odbc')
{
/* Ne rien faire */
}
else
{
throw new Exception ('Type de base de données inconnue');
}
return $s;
}
/**
* Transforme le resultat d'une requete sous forme d'un tableau.
*/
private function parse ($result)
{
$ret = FALSE;
if ($result != FALSE)
{
if ($this->type == 'oracle')
{
$fetch_assoc = 'oci_fetch_assoc';
}
else if ($this->type == 'mysql')
{
$fetch_assoc = 'mysql_fetch_assoc';
}
else if ($this->type == 'odbc')
{
$fetch_assoc = 'odbc_fetch_array';
}
else
{
throw new Exception ('Type de base de données inconnue');
}
$i = 0;
while (($row = $fetch_assoc ($result)))
{
$ret[$i] = $row;
$i++;
}
}
return $ret;
}
private function get_error ()
{
$msg = '';
if ($this->type == 'oracle')
{
$e = oci_error ();
$msg = $e['message'];
}
else if ($this->type == 'mysql')
{
$msg = mysql_error ();
}
else if ($this->type == 'odbc')
{
$msg = odbc_errormsg ();
}
else
{
throw new Exception ('Type de base de données inconnue');
}
}
/**
* Lance la connexion a la base de donnees
*/
public function __construct ()
{
if ($this->type == 'oracle')
{
$this->conn = oci_connect ($this->sql_login, $this->sql_password,
$this->sql_base);
if(!$this->conn)
{
throw new Exception ($this->get_error ());
}
}
else if ($this->type == 'mysql')
{
$this->conn = mysql_connect ($this->sql_server, $this->sql_login,
$this->sql_password);
if ($this->conn != FALSE)
{
if (mysql_select_db ($this->sql_base, $this->conn) == FALSE)
{
throw new Exception ('Impossible de se connecter à la base de données '.$this->sql_base);
}
}
else
{
throw new Exception ($this->get_error ());
}
}
else if ($this->type == 'odbc')
{
$this->conn = odbc_connect ($this->sql_base, $this->sql_login,
$this->sql_password);
if ($this->conn == FALSE)
{
throw new Exception ($this->get_error ());
}
}
else
{
throw new Exception ('Type de base de données inconnue');
}
}
/**
* Ferneture de la connexion
*/
public function __destruct ()
{
$result = FALSE;
if ($this->type == 'oracle')
{
$result = oci_close ($this->conn);
}
else if ($this->type == 'mysql')
{
$result = mysql_close ($this->conn);
}
else if ($this->type == 'odbc')
{
odbc_close ($this->conn);
/* odbc_close ne retourne aucune valeur */
$result = TRUE;
}
else
{
throw new Exception ('Type de base de données inconnue');
}
if ($result == FALSE)
{
throw new Exception ('Impossible de fermer la connexion à la base de données');
}
}
/**
* Bind le parametre prochain avec la valeur \$value. Ceci consiste a
* remplacer le caractere '?' dans la requete preparee par la valeur
* qui sera protegee contre les injection SQL.
*
* @param string $value valeur du parametre.
*/
public function bind ($value)
{
if ($this->requete == '')
{
$this->requete = $this->prepare;
}
if ($this->requete != '')
{
$pos = strpos ($this->requete, '?');
if ($pos != FALSE)
{
$value = $this->secure_string ($value);
$this->requete = substr_replace ($this->requete, $value, $pos, 1);
}
else
{
throw new Exception ('Aucune paramètre a remplacer');
}
}
else
{
throw new Exception ('Aucune requête préparée');
}
}
/**
* Execute la requete preparee + bind des parametres
*
* @return array Un tableau contenant les résultats de la requête
*/
public function execute ()
{
$result = FALSE;
/* Si aucun argument n'a été bindé */
if ($this->requete == '' && !strchr ($this->prepare, '?'))
{
$this->requete = $this->prepare;
}
if ($this->requete != '' && !strchr ($this->requete, '?'))
{
if ($this->type == 'oracle')
{
$req = oci_parse ($this->conn, $this->requete);
if ($req != FALSE)
{
$result = oci_execute ($req);
if ($result != FALSE)
{
$result = $req;
}
}
}
else if ($this->type == 'mysql')
{
$result = mysql_query ($this->requete, $this->conn);
}
else if ($this->type == 'odbc')
{
$result = odbc_exec ($this->conn, $this->requete);
}
else
{
throw new Exception ('Type de base de données inconnue');
}
if ($result == FALSE)
{
throw new Exception ('Impossible d\'exécuter la requête :
'."\n
".$this->requete.'