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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 15 653 fois - Téléchargée 26 fois

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

Ajouter un commentaire

Commentaires

malalam
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
Hello,

je suis plutôt d'accord avec FhX. La théorie objet PHP5 ne fait pas fie de l'optimisation (quoi qu'en pense certains vu la rapidité de la POO PHP5... ;-) ).

En fait, il y a pas mal de choses qui me gêne dans cette classe, surtout si c'est pour montrer à des débutants, qui plus est.

Trop de propriétés, certes. Trop de méthodes aussi. Passer par une méthode getTime() pour aficher une date me semble un peu poussé. Idem pour getSummary. __toString est là pour générer du html, alors pourquoi lui faire récupérer le html généré par une tierce méthode ?Il peut le générer lui-même.

Pourquoi passer par des tableaux, pous stocker les résultats de tes divers types de requêtes ?
-Tu parcours les résultats de ta requête
- tu stockes dans un tableau (dans le meilleur des cas, quand tu ne repasses pas par des boucles)
- tu retournes un tableau...qu'il faudra de nouveau parcourir pour en exploiter le contenu! Perte de temps et d'efficacité.
Quant au retour de type string...me semble pas très orienté philosophie objet ça ;-) Je ne m'attends pas à avoirt une méthode qui me renvoie return 'pas de résultat';...

Tu n'exploites pas les comparaisons typées, plus pratiques, plus sûres, plus rigoureuses, et plus rapides.

Ca manque de tests, sur la validité de la ressource utilisée par exemple, entre autres. Et puis, on a un tas de @... non exploités, alors qu'on a une classe d'exceptions à disposition.

Même remarque que FhX pour __set et __get.
Je veux dire, j'aurais plutôt essayé de montrer à mes élèves comment les utiliser...plutôt que comment NE PAS les utiliser, ça me semble plus logique lol.


J'préfère
à
mais bon...

Bref...l'idée est bonne, l'intention louable, mais mal exploitée à mon sens.
cs_hpph
Messages postés
3
Date d'inscription
dimanche 22 février 2004
Statut
Membre
Dernière intervention
5 novembre 2009
-
c'était surtout pour illustrer la théorie concernant les classes en php5 avec mes étudiants
chacun prendra ce qui l'intéresse ...
ben voilà ...
A+
FhX
Messages postés
2350
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
18 avril 2015
3 -
Classe trop lente et mal exploitée.

Supprimer les accès __get() et __set() n'est pas vraiment approprié.
Trop de propriétés en début de classe qui ne servent à rien.
Un code un peu trop lourd :)

Voila =)

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.