JeuWeb - Crée ton jeu par navigateur
POO et DB - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : POO et DB (/showthread.php?tid=4598)

Pages : 1 2 3 4 5 6 7


RE: POO et DB - Tho - 19-02-2010

(19-02-2010, 06:04 PM)Anthor a écrit :
Citation :Micro optimization isn't worth it.

You had to do it ten million times to notice a difference, a little more than 2 seconds

$a===NULL; Took: 1.2424390316s
is_null($a); Took: 3.70693397522s

difference = 2.46449494362
difference/10,000,000 = 0.000000246449494362

The execution time difference between ===NULL and is_null is less than 250 nanoseconds. Go optimize something that matters.

http://fr.php.net/manual/fr/function.is-null.php#84161

Ne t'inquiète pas, ma remarque n'avait rien de sérieux.. Smile

@wildd : dans le cas de PDO, je pense qu'il vaut mieux stocker la connexion dans un attribut. Ainsi, tu as un constructeur privé, sans héritage. Bon, l'inconvénient est qu'il faut redéfinir toutes les méthodes... Mais ce n'est qu'un détail.
Faites pas attention, pas lu tout le sujet --'


RE: POO et DB - Anthor - 19-02-2010

(19-02-2010, 07:23 PM)wildd a écrit :
(19-02-2010, 05:57 PM)Anthor a écrit : Tu peux aussi faire un pseudo Singleton avec un constructeur publique, mais je le dis très bas, car ça ne serait plus du tout un singleton ^^

ben c'est ce que je fais quand l'héritage me force à une méthode public (et dans le constructeur tu envoie une exception si t'as déjà une instance
- c'est plus du singleton ?! mouai c'est vrai qu'on pourrait créer la première instance avec un appel new externe mais il me semble que le pattern singleton vise avant tout l'instanciation unique; non à définir une seule méthode d'instanciation pour le singleton).
ça à l'avantage de permettre de faire un héritage sur PDO, sans ce farcir le "wrapping" de toute ses méthodes.

En quoi dans l'exemple donné tu dois redonner les méthodes ?


RE: POO et DB - QuentinC - 19-02-2010

JE ne vois pas le problème d'avoir un $db global.
Le seul avantage que je vois à un singleton, c'est qu'avec le singleton on ne se connecte que quand c'est nécessaire, alors qu'avec une globale on se connecte de toute façon. Mais comme de toute façon dans toutes les pages dynamiques on se connecte à MySQL, du coup ça ne change rien.

Enfin perso je ne me porte pas plus mal avec mon $db global et quelques global $db dans ma classe Record (en l'occurence dans les méthodes du type save ou findByXXX)


RE: POO et DB - Anthor - 19-02-2010

Effectivement, QuentinC, ça revient au même, mais ça permet de ne pas chercher dans toutes les lignes où se trouve la variable global, et si elle existe.
Et ça facilite grandement le debuggage du coup.

EDIT: De plus c'est bien plus sécurisé, te garantissant que la variable n'est jamais instancié plus de deux fois, ou modifiée.


RE: POO et DB - wildd - 20-02-2010

(19-02-2010, 07:41 PM)Anthor a écrit : En quoi dans l'exemple donné tu dois redonner les méthodes ?

lol, maintenant que tu le dis, moi non plus je vois pas Big Grin

---
@tho
je vois pas en quoi le fait d'étendre PDO empêche de stocker les info de connexion en attributs ou dans un fichier de config.


RE: POO et DB - Anthor - 20-02-2010

(20-02-2010, 02:14 PM)wildd a écrit :
(19-02-2010, 07:41 PM)Anthor a écrit : En quoi dans l'exemple donné tu dois redonner les méthodes ?

lol, maintenant que tu le dis, moi non plus je vois pas Big Grin

La différence est minime, mais le singleton représenté utilise une classe externe effectivement :p


RE: POO et DB - NicoMSEvent - 01-03-2010

Alors, merci a tous pour vos multiples avis Smile

J'ai utilisé ceci :

Code :
class t_DB{
    protected static $_instance;
    private $link_db;
//----------------------------------------------------------------------
    public static function getInstance(){
        if(null === self::$_instance){
            self::$_instance = new t_DB($MySqlServer, $MySqlLogin, $MySqlPass,$MySqlDatabase);
        }
        return self::$_instance;
    }
//----------------------------------------------------------------------
    private function __construct($MySqlServer, $MySqlLogin, $MySqlPass,$MySqlDatabase){ //open_DB
        $this->link_db = @mysql_connect ($MySqlServer, $MySqlLogin, $MySqlPass);
        if(!$this->link_db){
            echo'<p><strong>Erreur : Connection a la DB echouee</strong></p>';
        }
        else{
            mysql_select_db($MySqlDatabase,$this->link_db);
        }
    }
//----------------------------------------------------------------------
[....]
//----------------------------------------------------------------------
}

et lorsque j'ai besoin d'un accès DB dans une méthode, j'utilise
Code :
$db=t_DB::getInstance();

$my_req=$db->Request('SELECT ...');
while($db->GetLine($my_req)){
}



RE: POO et DB - christouphe - 01-03-2010

heu, tant qu'à faire:

Code PHP :
<?php 
echo'<p><strong>Erreur : Connection a la DB echouee</strong></p>';

tu peux pas faire plutôt:

Code PHP :
<?php 
throw new PDOException("<p><strong>Erreur : Connexion a la DB echou&eacute;e.</strong></p>",1);

Puis après un beau
Code PHP :
<?php 
try {
$db=t_DB::getInstance();

$my_req=$db->Request('SELECT ...');
while(
$db->GetLine($my_req)){
//blabla
}
} catch (
PDOException $pdoE) {
echo
$pdoE.getMessage();
}



RE: POO et DB - Kihmé - 13-03-2010

quelqu'un aurait un bon tuto afin de démarrer ma poo. Je maitrise très bien la poo en java ou c#, mais là en php le fait de devoir l'utiliser en relation avec ma BDD me perd complétement, je ne vois pas comment je dois créer mes classes.


RE: POO et DB - NicoMSEvent - 13-03-2010

pour l'utilisation d'une DB avec tes classes en PHP, j'utilise ce qu'on appelle le "singleton", c'est une classe instanciée une seule fois (impossible de l'instancier une seconde fois), qui va gérer la connection et les appels a la DB. Pour ma part, j'utilise ça :

dans chaque fonction d'une classe (peu importe la classe), je récupere l'instance (ou au besoin, je la crée) grace a la ligne suivante :

$db=t_DB::getInstance();
puis j'utilise normalement l'objet $db

$my_req=$db->Request('SELECT * FROM ma_table;');
while($res=$db->GetLine($my_req){
[...]
}

j'avais les mêmes questions que toi il y a quelques semaines... j'ai trouvé par moi même grace a quelques indications dans ce thread. Je te conseille de te renseigner sur le singleton, c'est la meilleure piste que je puisse te donner. Le fait de trouver par toi même va t'apporter beaucoup Wink