Mysterieux problème

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Mysterieux problème

Re: Mysterieux problème

par Nestecha » 12 sept. 2015, 10:34

<?php
class DB {
    /**
     * @var PDO $oPDO
     */
    private static $oPDO = null;
    private static function init() {
        if (null === self::$oPDO) {
            self::$oPDO = new PDO('mysql:host=localhost;dbname=db','root','password');
            self::$oPDO->exec("SET CHARACTER SET utf8");
            self::$oPDO->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_ASSOC);
        }
    }

    public static function queryGetSingle($sQuery) {
        self::init();
        try
        {
            $oResults = self::$oPDO->query($sQuery);
            $oResults->setFetchMode(PDO::FETCH_ASSOC);
            $aSingleData = $oResults->fetch();
            return $aSingleData;
        }
        catch(Exception $e)
        {
            echo 'Erreur : '.$e->getMessage().'<br />';
            echo 'N° : '.$e->getCode();
        }
    }
}
Coquille dans mon code :/ ecrit sur portable, celui ci est bon !

Re: Mysterieux problème

par Nestecha » 12 sept. 2015, 10:31

J'imagine que tu aimerais faire une grosse 'Factory' qui permettra à tes classes d'avoir des méthodes qui appelleront la base etc.

Ton problème c'est qu'effectivement si tu instancies __core, tu créeras une nouvelle connexion.
Et même si tu trouvais une parade pour regarder si une connexion existe deja (en cherchant dans d'autres objets par exemple), c'est une mauvaise pratique.

La solution est : n'instancie pas.

Donc en gros, __core devra se débrouiller seule pour savoir si une connexion existe déjà ou non, sans avoir ete instanciée.

Voici un exemple simpliste que j'ai fait, la fonction de query ne fonctionne que pour un resultat unique, c'est histoire que tu comprennes l'idée.
<?php
class DB {
    /**
     * @var PDO $oPDO
     */
    private static $oPDO = null;
    private static function init() {
        if (null === self::$oPDO) {
            self::$oPDO = new PDO('mysql:host=localhost;dbname=db','root','password');
            self::$oPDO->exec("SET CHARACTER SET utf8");
            self::$oPDO->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_ASSOC);
        }
    }

    public static function queryGetSingle($sQuery) {
        self::init();
        try
        {
            $oResults = self::$oPDO->query($sQuery);
            $oResults->setFetchMode(PDO::FETCH_ASSOC);
            $aMessage = $oResults->fetch();
            return $aSingleData;
        }
        catch(Exception $e)
        {
            echo 'Erreur : '.$e->getMessage().'<br />';
            echo 'N° : '.$e->getCode();
        }
    }
}

Re: Mysterieux problème

par LAMASPANZER » 23 août 2015, 19:48

Sauf qu'il met indispensable d'utiliser la classe _Core :/
Comment faire ? As tu une meilleur solution peut etre que ma structure n'est pas bonne, mais il m'est essentiel d'avoir un resultat ou au final n'importe quelle class peut utiliser pdo et donc eviter d'etablir betement une nouvelle connexion :/

Re: Mysterieux problème

par or 1 » 23 août 2015, 19:44

<?php
class _Core{
    protected $pdo;
 
    function __construct(){    
        $this->pdo = "pdo";
        echo "constructeur";
    }
}
 
 
class PluginName extends _Core{
 
    function __construct(){
      parent::__construct();
    }
 
    public function GetNames(){
      echo $this->pdo;
    }
}
$plugin = new PluginName();
$plugin->GetNames();
?>
constructeur n'est affiché qu'une seule fois.

dans ton code, tu créés 2 objets d'où les 2 appels à l'ouverture de la connexion.

Re: Mysterieux problème

par LAMASPANZER » 23 août 2015, 19:18

Enfaite je m'apercois que si la classe herite d'une autre, le constructeur de celle qu'elle herite est relancé, je me trompe ?

Re: Mysterieux problème

par LAMASPANZER » 23 août 2015, 19:11

C'est vraiment quand je declare le construvcteur que la varaible contenant l'instance de PDO est inutilisable ..

PS Si tu as une autres idée afin que mes autres classes puisse facilement recuperer une variable instancier pour pdo
j e suis tout ouvert :)

Re: Mysterieux problème

par LAMASPANZER » 23 août 2015, 19:09

C'est deja fait j'ai meme verifié les logs (/var/log/mysql/mysql.log) du server mysql de ma machine et je confirme qu'il a bien de tentative de connexion
Les voicis :
150823 19:08:18
200 Connect USER@localhost on DATABASE
201 Connect USER@localhost on DATABASE

201 Query SELECT `name` FROM cscg_maps
200 Quit
201 Quit

Re: Mysterieux problème

par or 1 » 23 août 2015, 19:03

mets un echo dans ta fonction d'affectation de la connexion à $this->pdo pour bien vérifier que c'est appelé 2 fois, ce dont je doute.

Mysterieux problème

par LAMASPANZER » 23 août 2015, 18:46

Yop :D

Alors voila j'ai un soucis avec mes classes qui heritent de celle principale j'ai donc repris le code et simplifié pk cela me retourne une erreur disant

Fatal error: Call to a member function query() on a non-object lign 20

Voici mon codeque j'ai simplifié et commenté
<?php
class _Core{
    protected $pdo;
 
    function __construct(){    
        $this->pdo = new PDO("mysql:host=localhost;dbname=DATABASE", 'USER', 'PASSWORD');
    }
}
$core = new _Core();
 
 
class PluginName extends _Core{
 
    function __construct(){
        //Quand je declare cette methode cela me retourne une erreur disant tous simplement que
        //$this->pdo  est NULL de la classe _Core () et que du coup il ne trouve pas query()
    }
 
    public function GetNames(){
        $query = $this->pdo->query("SELECT `name` FROM cscg_maps");
        return $query->fetchAll(PDO::FETCH_ASSOC);
    }
}
$plugin = new PluginName();
 
 
 
print_r($plugin->GetNames()); // J'affiche
Franchement je sais pas, après le constructeur la variable $this->pdo semble avoir été formaté mais elle existe toujours puisque je n'ai pas de 'NOTICE' me disant que cette variable n'est pas déclaré

Je pourais faire parent::__construct(); mais ca voudrait dire que la connexion serait etablit deux fois, ce n'est pas ce que je veux

Si vous avez idée ou une semble remarque n'hésitez pas c'est urgent j'ai besoin d'utilisé le constructeur :/

Guillaume G,

Merci d'avance

EDIT: Je rappel mon objectif, c' est d'avoir une classe qui herite d'une autre afin quelle puisse accedé à PDO ($this->pdo)

EDIT2:
A par passé la variable en super-global ($_GLOBALS) je ne vois plus d'autre solution (le mieux serait uniquement dans la classe et nul par ailleur)

Mais j'aimerai vraiment que l'on m’explique ça m’intéresse le principe de héritance est justement de pouvoir accéder à certaine méthode d'une classe ainsi que les variables hors quand je déclare le constructeur de la classe qui va heritée plus rien n'est accessible (a noté que tout est définit comme nul puis que les variables existent.)
Mon objectif est de rendre accessible la connexion depuis d'importe quelle classe qui va heriter, si vous avez un exemple simple avec plusieurs classes qui heritée montrer moi que j'apprenne
Aidez moi c'est urgent :'(