CLASSE D'ACCÉS BASE DE DONNÉES

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 - 10 mai 2007 à 02:28
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 - 11 mai 2007 à 10:27
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/42649-classe-d-acces-base-de-donnees

FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
11 mai 2007 à 10:27
Au risque de me répéter :p


On ne fait pas une classe comme on fait une fonction. C'est pas un truc qu'on va pondre comme ca, simplement parce que ca fait jolie, mais simplement parce que c'est plus propre à écrire (je trouve ^^).

Exemple :

Je fais un site sur les bagnoles. Sur une des voitures que je vends, je me retrouve avec une voiture spéciale qui est la voiture de James Bond.
Allez hop, jme fais ma classe de voitures "JamesBond":
class JB {
// code
}
Et puis voila, jm'en sers comme ca.
Tiens, j'ai la voiture de K2000, c'est reparti, jme fais une autre classe :
class k2000 {
// code
}

Ou est l'intéret ? Ici nul part.

Pour faire quelque chose de propre, il faut hierarchiser un peu tout ca. Commencons déja par l'abstraction :
abstract class item {
// code
}
Puis, par l'abstraction de la voiture :
abstract class voiture extends item {
// code
}
Puis, par le fait qu'on puisse avoir des voitures spéciales :
class voiture_spe extends voiture {
// code
}
Et aussi le fait qu'on ai des voitures normales :
class voiture_nrml extends voiture {
// code
}

Tiens, jme suis acheté une porche, voyons ses caractéristiques :
$porche = new voiture_nrml('porshe', 'modèle n°xxx111');
$porche->getInfos();

Et puis, jme suis acheté la voiture de JamesBond :
$JamesBond = new voiture_spe('JamesBond');
$JamesBond->getInfos();

Je vais lancer un missile de ma voiture JamesBond sur ma porche, on va voir ce que ca fait :
$degats = $JamesBond->LanceMissileVers($porche, $puissance=1000);
Et puis, je vais voir si ma porche est encore en vie tiens :
echo $porche->EtatDeLaVoiture();

Et puis, jveux savoir le nombre de missile de ma voiture JamesBond :
echo $JamesBond->NombreDeMissilesRestant();


Voila, c'est tout simple !
La, il vaut mieux utiliser les classes plutot que des fonctions !
Car si un jour, je me dis :
Tiens, et si je me faisais une voiture super spéciale ? Facile :
class voiture_ultra_spe extends voiture_spe {
// code
}
Ou alors :
class voiture_ultra_spe extends voiture {
// code
}
C'est au choix. (je préfère la seconde)

Et après, tu fais mumuses (autre exemple) :
try {
$map = new map(10,10);
$k2000 = new voiture_ultra_spe('K2000');
$opel = new voiture_nrm('opel', 'astra');
$map->PlaceVoitureXY($k2000, 2, 2);
$map->PlaceVoitureXY($open, 10, 10);
$map->BougeVoitureVers($k2000, 10, 10);
echo $map->InfosVoiture($k2000);

} catch ( InitException $ie ) {
die ( $ie->getMessage() );
} catch ( MouvementException $me ) {
die ( $me->getMessage() );
} catch ( PositionException $pe ) {
die ( $pe->getMessage() );
} catch ( FatalException $fe ) {
die ( $fe->getMessage() );
} catch ( Exception $e ) {
die ( $e->getMessage() );
}


Je trouve ca plutot marrant moi :)
Ca permet toutes les fantaisies... vous trouvez pas ?

Bon, jme suis écarté du sujet, mais pour MySQL, c'est strictement pareil :

abstract class sql {
// code
}
class mysql extends sql {
// code
}
class pgsql extends sql {
// code
}
class mysql_transaction extends mysql {
// code
}

etc...

Sachant que de toute facon, dans ta classe Mysql, tu as ca :
static private function Connect($host, $user, $passwd, $dbname, $alreadyconnected=false) {
if ( !$alreadyconnected ) {
self::$_link = @mysql_connect($host, $user, $passwd);
if ( self::$_link === false ) throw new Exception('....');
}
if ( !mysql_select_db($dbname) ) throw new Exception ('....');
}

Dans le cas d'une connection unique à ta base de donnée.
Réutilisable dans toutes tes instances mysql :)
Ca te permet de faire du :
$db = new mysql;
et cela, sans contrainte :)

Le mieux étant de faire, je pense :

class System {

static public function Init( ObjectDB $object ) {
self::$_db = $object;
}

static public function GetConnection() {
return self::$_db;
}

}

System::Init(new mysql);

$array = System::GetConnection()->query('SELECT ...')->fetch_array();


Ca te permet de faire de l'abstraction "à la pdo".
C'est ta classe system, lors de l'initialisation, qui choisit le driver sql. A adapter si il y a des connections multiples, bien entendu :)


L'intérêt de l'objet aussi, c'est de pouvoir faire :
echo $db->query('SELECT truc, machin...')->fetch_object()->getTruc();
Voir, encore mieux :
echo $db->query('SELECT truc, machin...')->fetch_object($mavar)->getTruc();
echo $mavar->getMachin();

Dans le cas d'une récupération future :)
Bref, on peut tout faire :)
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
10 mai 2007 à 15:11
"Tu ouvres et fermes à CHAQUE fois la connexion au serveur MySQL...
ô_O"

C'est clair... bonjour la perte de perf... .. .

Sinon je vais reredire ce que j'ai dis dans un commentaire d'une autre source...

"concernant mysql je ne vois pas l'intérêt d'encapsuler les fonctions native de php si c'est juste pour y ajouter un timer lors de l'exécution de la requête... s'il faut développer un classe SGDB autant faire une classe d'abstraction sinon c'est de la perte de performance pour rien... mieux vaut faire du procédural dans ce cas là... .. ."

et...

"autant externaliser le traitement du résultat via des méthodes dédiées à ça..."

tu fais comment si tu veux faire un mysql_fetch_row() ou un mysql_fetch_object()... .. ?

Euuh sinon... tu assigne la valeur null à ton attribut result_query et 5 lignes de code après tu l'utilise comme un tableau... y a comme un hic non... .. ?

@ tchaOo°
vilhjalms Messages postés 591 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 16 juillet 2009 2
10 mai 2007 à 09:06
Une de plus c est la periode :) :(
yoadsl Messages postés 120 Date d'inscription mercredi 14 avril 2004 Statut Membre Dernière intervention 22 mai 2007
10 mai 2007 à 05:17
et moi je me demande bien pk ds ts cet afflux de classes super trop de la balle qui tue ces derniers tps sur CS yen a pas plus qui permettent de choisir entre mysql et PgSQL, hé ouais mySQL n'est pas le seul en BD ...
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
10 mai 2007 à 02:49
J'avais lu trop vite...
Tu ouvres et fermes à CHAQUE fois la connexion au serveur MySQL...
ô_O
Pourquoi ?
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
10 mai 2007 à 02:28
Salut,

Y'a pas mal de trucs qui me chagrinent...

1/ Quelle est la différence entre les méthodes insert, update et delete ?

2/ Utiliser $this -> connect() pour chaque requête, c'est pas un peu lourd ? Je sais bien que MySQL s'occupe de retourner l'identifiant de connexion si une connexion déjà existante avec les mêmes paramètres de connexion existe, m'enfin quand même... C'est pas super optimisé...

3/ replace_carriage_return => LoL
http://ch2.php.net/manual/fr/function.nl2br.php
C'est vrai que sur Windows, c'est \r\n... Mais en général, c'est de l'unix (si on n'est pas suicidaire) et donc, c'est \n

4/ Stocker les paramètres de connexion dans des constantes... Je trouve ça très moyen : c'est accessible de partout, et donc, c'est pas super sécurisé.

5/ Je ne comprends pas l'utilité d'avoir une méthode query() si c'est pour ne même pas t'en servir dans tes autres méthodes.

6/ Dommage qu'il n'y ait absolument AUCUNE gestion d'erreur

7/ Tu stockes la requête dans une propriété que tu n'exploites jamais.

8/ Certaines méthodes sont redondantes et, à l'inverse, d'autres manquent cruellement (comme une méthode qui renvoit le nombre de lignes affectées, le nombre de lignes retournée, etc).

9/ Des incohérences dans les propriétés. Par exemple, dans ta classe nb_rows peut contenir soit un entier soit un booléen. C'est moyen. Même si PHP est permissif là dessus, ce n'est pas très rigoureux. Du coup, je n'ose imaginer comment tu fais tes tests dans le traitement.

En fait, je suis au regret de te dire que je trouve ta classe un peu inutile puisque je trouve qu'elle n'apporte rien. Désolé...