Acces MySQL depuis plusieurs classes

Petit nouveau ! | 6 Messages

23 déc. 2011, 21:30

Bonsoir

Je réalise un projet de suivi de points d'un match sportif. Rien de compliqué, mais je butte sur un probleme d'architecture.

Mon applicatof nécessite l'enregistrement de chaque membre pour qu'ils aient chacun leur compte.
Pour cela, lors de leur login, leurs infos personnelles sont récupérées depuis une BDD

Suivant l'evolution du match, l'appli peut etre amené a se faire des acces a la BDD pour ajouter ou retirer des points.

Pour cela, j'ai créée 2 classes:
class MySQL pour gerer la connection a la base, l'execution des requetes, etc...
class Gestion Points dans laquelle j'ai une methode qui ajoute ou soustrait des points et mets a jour la base.

Mon probleme se situe dans la class GestionPoints.
public function getNumberOfPoints() {
	try {
		$MySQL = new Mysql();
        $query = "SELECT NumberOfCredits FROM credits WHERE UserId=".$this->_UserId;

        $result = MySQL->RunQuery($query);
    }
    catch (MySQLExeption $e) {
        echo $e -> ShowError();
    }
return  $result[0]['NumberOfPoints'];   
}
A chaqus fois que je voudrais récupérer le nbre de points, par exemple, je devrais instancier la class MySQL (et la fermer aprse pr faire plus propre).
Est-ce que ca risque de ne pas etre trop gourmand en ressource de faire ce genre de choses? Est-ce qu'il y aurait moyen de creer la connection a la base uniquement lors de l'ouverture du compte, une seule fois ?
enfin, est-ce qu'instancer des class dans des class ne fait pas trop crades ?

Quels sont vos conseils, notamment en matiere de bonnes pratiques ?

merci :)

ViPHP
xTG
ViPHP | 7331 Messages

23 déc. 2011, 21:36

Regardes du côté du design pattern Singleton, c'est tout à fait ce qu'il te faut pour la class Mysql. ;)

Petit nouveau ! | 6 Messages

23 déc. 2011, 21:41

Merci

Je suis en train de l'analyser...
JE vois aussi que certaines personnes sont contre ce genre d'archi, car elle est crade :/ que faut-il en penser ?

Tu saurais ou trouver des exemple de code qui font ce que je voudrais ?

ViPHP
xTG
ViPHP | 7331 Messages

23 déc. 2011, 21:46

Ce pattern crade ? Je me demande bien qui peut dire cela... :roll:
S'il existe ce n'est pas pour rien, il est utilisé par de nombreuses applications/frameworks pour ce genre d'utilisation.

Petit nouveau ! | 6 Messages

23 déc. 2011, 21:52

j'ai vu ca ici : http://zenprog.com/index.php?cle=Critiq ... -singleton


par contre, je n'ai pas trouve d'exemple, et du tuto clair :/ tu en connaitrias ?

ViPHP
xTG
ViPHP | 7331 Messages

23 déc. 2011, 22:41

Il déraille totalement... Faut pas confondre variable globale et statique.
Et il n'apporte aucune solution viable... Car il déporte le problème sur l'utilisateur...
Evidement si on décide de coder et de suivre tout un tas de règles et que par bonheur le code passé de main en main durant 5ans est toujours aussi beau et propre on n'a pas besoin d'utiliser de pattern... :mrgreen:

Pour l'exemple tu en as un beau en tout début de son article. Tu en trouveras d'autre sur google rien qu'en tapant "pattern singleton".

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 déc. 2011, 12:22

Je comprend la critique de la personne, puisque commencer à utiliser le Singleton, si on n'y prend pas garde, on se retrouve vite à tomber dans ce que j'appelle la "singletonite", c'est à dire utiliser des Singleton de partout, parce que c'est simple d'y accéder.
Or, le but initial du Singleton, c'est de s'assurer qu'il n'existe pas plusieurs instance d'une classe, pas faciliter son accès.
Après, je trouve que le ton de l'article est aussi nul que ce qu'il critique. Ca me rappelle ces gens qui crachent sur ceux qui utilisent les tableaux, mais quand on creuse le pourquoi, on se rend compte qu'ils ne connaissent que les arguments que les autres utilisent.

De plus, utiliser un Singleton pose un gros soucis de dépendance de code (tu ne peux pas changer de classe d'accès simplement).
Bref, pour moi, la bonne solution utilise un Singleton (ne pas ouvrir 50 connexions à ta base de données), mais au niveau des classes du modèle, il faut que tu injectes cette connexion à la construction :
class Point
{
	protected $db;

	public function __construct($db)
	{
		$this->db = $db;
	}

	public function getNumberOfPoints() 
	{
		try 
		{
			$query = "SELECT NumberOfCredits FROM credits WHERE UserId=".$this->_UserId;
			$result = $this->db->RunQuery($query);
		}
		catch (MySQLExeption $e) {
			echo $e -> ShowError();
		}
		return  $result[0]['NumberOfPoints'];   
	}
}

$point = new Point( MySQL::getInstance() );
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

24 déc. 2011, 20:59

"singletonite"
tu veux parler d'un mec qui créer une classe qui gère des multitons :mrgreen: :mrgreen:

parce que bon le singleton c'est bien mais si tu a besoin d'aller sur deux bases de données ça marche pu :/ donc on fait un multiton.
pis après tu te tiens plutôt que de la faire dans plusieurs classes je vais faire une classe qui gère la chose, comme ça j'ai des des multitons pour tous ce que je veux :d

et heu oui c'est vite le brin :)
Il en faut peu pour être heureux ......

ViPHP
ViPHP | 2287 Messages

02 janv. 2012, 19:32

Tiens, un débat intéressant :)

J'ai pas lu tout le billet du blog, mais quand je vois l'en-tête "Programmez simplement" je peux comprendre la critique.

En php on dispose en effet d'une manière beaucoup plus simple (et moins propre) de faire la même chose qu'un singleton : une simple variable globale.

Forcément, c'est moins sécurisé (n'importe quel morceau de code peut écraser le contenu de la variable globale) et de + le concept n'est pas portable dans un autre langage, et enfin pas dans la philosophie objet. En gros c'est plus simple, mais c'est pas propre et aussi (surtout) moins fiable, en particulier sur de gros projets.

EDIT : d'ailleurs une certaine personne lui a très bien répondu dans le premier commentaire...

Après, l'auteur du blog n'est pas le seul à aimer réduire le nombre de lignes de code (et la complexité) de ses projets, on peut donc se laisser séduire par l'une ou l'autre approche suivant le besoin.
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

02 janv. 2012, 20:42

EDIT : d'ailleurs une certaine personne lui a très bien répondu dans le premier commentaire...
*kof* *kof* ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer