Classe php5 pour se connecter à mysql avec gestion d'erreurs

Contenu du snippet

Oui, vous allez me dire : encore une classe pour utiliser Mysql
mais elle permet de rappeler les différentes possibilités offertes par PHP5
(classe réalisée au cours de Webmaster)
en lisant les commentaires, vous allez comprendre ...

Source / Exemple :


<?php
// classe standard Exception de PHP5
// gestion des erreurs avec une classe personnelle héritant de la classe générique Exception
// un rappel
/* 
classe Exception
class Exception {
	private $message;
	private $code;
	private $line;
	private $file;
public function __construct($message,$code = NULL) {
$this->message = $message;
$this->code = $code;
}
// méthode getMessage pour récupérer le message d'erreur ...
public function getMessage() {
return $this->message;
}
public function getCode() {
return $this->code;
}
public function getFile() {
return $this->file;
}
public function getLine() {
return $this->line;
}
}

  • /
//************************************************************************* //définition d'une classe personnelle de gestion des erreurs class MyException extends Exception { // ma classe MyException hérite de la classe générique Exception //les attributs hérités de la classe Exception protected $message; protected $file; protected $code; protected $line; // définition du constructeur public function __construct($msg) { // on associe le constructeur de la classe générique à celui de cette classe personnelle parent::__construct($msg); // possibilité d'envoyer un mail directement à l'administrateur pour l'avertir de l'erreur // ou encoder dans un fichier log ... // à vous de voir } private function getTime() { return date('d-m-Y H:i:s'); // récupérer la date du serveur lorsqu'on lance l'exception } public function getSummary() { // méthode à appeler pour afficher l'erreur $str = "une exception a été générée: <br>"; $str .= "<strong>Le message : " . $this->getMessage() . "</strong><br>"; $str .= "Nom du fichier : " . $this->getFile() . "<br>"; $str .= "Ligne du script : " . $this->getLine() . "<br>"; $str .= "Erreur exécutée le : " .$this->getTime() . "<br>"; return $str; } public function __tostring(){ // si appel direct de l'objet pour impression return $this->getSummary(); } } // définition de la classe class myconnect { // déclaration des attributs private $server; // nom du serveur mysql private $user; //nom de l'administrateur private $password; // password de l'administrateur private $database; // nom de la base de données à manipuler private $array_config; // tableau regroupant tous les attributs de la configuration mysql public $querySql; // chaîne string qui va représenter la requête SQL elle-même private $error; // récupérer le message d'erreur transmis lors de la connexion mysql private $error_no; // récupérer le code d'erreur private $true_select = FALSE; // permettra de vérifier si la requête SQL commence par select ... private $nb_arg_construct; // nombre d'arguements du constructeur private $numrows; // nombre de lignes pour le résultat private $numfields; // nombre de champs private $array_datas; // tableau contenant toutes les valeurs des enregistrements private $array_fields; // tableau contenant les noms des champs lors de la requête private $link; // identifiant de la ressource mysql private $success; // attribut qui va garantir la sélection correcte de la BD private $result; // attribut qui va stocker le résultat de ma requête SQL // déclarer le constructeur public function __construct($nameserver,$nameuser,$namepassword,$namedatabase){ // assigner les attributs de l'objet avec les variables que je vais transmettre en argument // tester le nombre d'arguments que l'on passe // func_num_args() qui permet de calculer le nombre d'arguments d'une fonction // func_get_args() permet de récupérer un array avec tous les arguments du constructeur $this->nb_arg_construct = func_num_args(); if ( $this->nb_arg_construct != 4 ) { $str_error = "sorry, le nombre de paramètres transmis est incorrect<br>"; $str_error .= "5 paramètres obligatoires <br>"; throw new MyException($str_error); } else { // le nombre d'arguments est correct // assignation des attributs de l'objet avec les variables transmises $this->server = $nameserver; $this->user = $nameuser; $this->password = $namepassword; $this->database = $namedatabase; // vérifier les données transmises // compléter le tableau array_config $this->array_config['server'] = $this->server; $this->array_config['user'] = $this->user; $this->array_config['password'] = $this->password; $this->array_config['database'] = $this->database; // faire notre connexion avec la fonction mysql_connect $this->link = @mysql_connect($this->server,$this->user,$this->password); if (!$this->link) { $this->error = mysql_error($this->link); $this->error_no = mysql_errno($this->link); $str_error = "sorry, connexion impossible à Mysql <br>"; $str_error .= "Code : " . $this->error_no . "<br>"; $str_error .= "Message d'erreur : " . $this->error . "<br>"; throw new MyException($str_error); } else { // sélectionner la base de données $this->success = @mysql_select_db($this->database,$this->link); if (!$this->success) { $this->error = mysql_error($this->link); $this->error_no = mysql_errno($this->link); $str_error = "sorry, base de données impossible à sélectionner <br>"; $str_error .= "Code : " . $this->error_no . "<br>"; $str_error .= "Message d'erreur : " . $this->error . "<br>"; throw new MyException($str_error); } } } //fin if test arguments } //fin constructeur // créer une méthode publique qui va me permettre d'exécuter une requête SQL public function toQuery($sql) { if (func_num_args() != 1) { $str_error = "attention, un seul argument pour cette fonction ...<br>"; throw new MyException($str_error); } else { // exécuter la requête SQL et la mettre dans une variable de l'objet $this->result = @mysql_query($sql,$this->link); //echo gettype($this->result) . "<br>"; if (!$this->result) { $this->error = mysql_error($this->link); $this->error_no = mysql_errno($this->link); $str_error = "attention, requête SQL impossible à réaliser... <br>"; $str_error .= "Code : " . $this->error_no . "<br>"; $str_error .= "Message d'erreur : " . $this->error . "<br>"; throw new MyException($str_error); } else { // traiter la variable $this->result // uniquement si la requête commence par un select ... if (!$this-> search_Select($sql)) { // echo "requête SQL exécutée... <br>"; } else { // traitement de la requête SELECT $this->true_select = TRUE; // changer la valeur de l'attribut true_select pour permettre les traitements sur le résultat de la requête ... } } } } private function search_Select($value) { // return true si la requête SQL commence par le mot select if ( ereg("^(select|SELECT)",$value) ) { return true; } else { return false; } } // récupérer le nombre d'enregistrements public function getNumRows(){ if ( $this->true_select == TRUE ) { $this->numrows = @mysql_num_rows($this->result); return $this->numrows; } else { return "pas de valeur"; } } // récupérer le nombre d'enregistrements public function getNumFields(){ if ( $this->true_select == TRUE ) { $this->numfields = @mysql_num_fields($this->result); return $this->numfields; } else { return "pas de valeur"; } } // récupérer les valeurs des champs public function getDatas() { if ( $this->true_select == TRUE ) { $tab_array = array(); @mysql_data_seek($this->result,0); // remettre le pointeur au début du résultat while ( $list = @mysql_fetch_assoc($this->result) ) { $tab_array[] = $list; } $this->array_datas = $tab_array; unset($list); unset($tab_array); return $this->array_datas; } else { return "pas de valeur"; } } // récupérer les noms des champs public function getFields() { if ( $this->true_select == TRUE ) { $tab_array = array(); @mysql_data_seek($this->result,0); // remettre le pointeur au début du résultat $list = @mysql_fetch_assoc($this->result); foreach($list as $key=>$value) { $tab_array[] = $key; } $this->array_fields= $tab_array; unset($list); unset($tab_array); return $this->array_fields; } else { return "pas de valeur"; } } // récupérer les noms des champs public function getSimpleDatas() { if ( $this->true_select == TRUE ) { $tab_array = array(); @mysql_data_seek($this->result,0); // remettre le pointeur au début du résultat if ( $this->numfields == NULL ) { $this->numfields = getNumFields(); } while( $list = @mysql_fetch_array($this->result) ) { $string = ""; for ($i=0; $i < $this->numfields; $i++) { $string .= $list[$i] . " "; } $tab_interm = explode(" ",trim($string)); $tab_array[] = $tab_interm; } $this->array_fields= $tab_array; unset($list); unset($tab_array); return $this->array_fields; } else { return "pas de valeur"; } } // fonctions pour récupérer les erreurs public function getError() { return $this->error; } public function getNoError() { return $this->error_no; } // forcer la libération des ressources public function toResultFree() { if ( $this->true_select == TRUE ) { @mysql_free_result($this->result); } else { echo "pas de valeur"; } } //Utilisation des fonctions propres pour récupérer la valeur d'un attribut // par exemple récupérer le nom du serveur Mysql public function getServer() { return $this->server; } // modifier le nom du serveur public function setServer($nameserver) { $this->server = $nameserver; } // normalement il est préférable de rendre les attributs importants en private pour ne pas les modifier constamment // il existe une méthode __set() appelée à chaque fois que l'on veut modifier directement un attribut sans passer par le setter public function __set($nom,$valeur) { $str = "Vous avez voulu modifier l'attribut " . $nom . " avec la valeur " . $valeur . ".<br>"; $str .= "Utilisez de préférence les fonctions Setter prévues à cet effet. <br>"; throw new MyException($str); } // de même pour la fonction __get appelée à chaque fois que l'on veut lire directement un attribut public function __get($nom) { $str = "Vous avez voulu lire l'attribut " . $nom . ".<br>"; $str .= "Utilisez de préférence les fonctions Getter prévues à cet effet. <br>"; throw new MyException($str); } // même chose pour l'appel de méthodes inexistantes (non prévues dans la classe) public function __call($nom,$valeur) { $str = "Vous avez voulu appeler la méthode " . $nom . " avec l'argument " . $valeur . ".<br>"; $str .= "Sorry, il n'a pas de méthode avec ce nom; consultez la définition de la classe. <br>"; throw new MyException($str); } // getter pour retourner le contenu du tableau array_config public function getArray_config() { return $this->array_config; } // créer le destructeur public function __destruct() { mysql_close($this->link); // on ferme la connexion au serveur mysql } // la méthode appelée directement si on veut faire un echo ou un print public function __tostring() { return "vous ne pouvez pas afficher l'objet directement...<br>"; } } //fin classe //*************************************************************** //*************************************************************** // UTILISATION DE LA CLASSE //error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING); // pour ne pas afficher les erreurs de warning ... //création de l'objet try { $obj = new myconnect("localhost","root","","testbase"); $marequete = "SELECT * FROM test"; $obj->toQuery($marequete); // illustration des méthodes __set, __get, __call //$obj->server; //$obj->server = "hpph.net"; //$obj->mamethode('hello'); echo gettype($obj->getArray_config()) . "<br>"; foreach ($obj->getArray_config() as $key=>$value) { echo $key . " : " . $value . "<br>"; } } catch (MyException $e) { // affichage des erreurs si nécessaire echo $e->getSummary(); } ?>

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.