. */ 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.'

'."\n".$this->get_error ()); } } else { throw new Exception ('Impossible de lancer la requête : "'.$this->requete.'" (construction de la requête incorecte)'); } $this->requete = ''; return $this->parse ($result); } }