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();
}
?>
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.