-2
votes

Objet de données PHP dans différentes classes

Je me connecte à PDO (PHP Data Objects) en utilisant Héritage, laissez-moi vous montrer mon code de db.php d'abord.

J'ai fait mon db.php une classe Singleton. J'ai bien connaissance du modèle singleton. p>

Je veux que mon code soit distribué et séparé, j'ai donc fait une nouvelle classe pour sélectionner les données à partir de la base de données. P>

class DB {
private $db = "";
private static $instance = null ;

    private function __construct() {
        try {
            //$dsn = "mysql:host=localhost;dbname=myDatabase;charset=utf8mb4";
            $this->db = new PDO("mysql:host=127.0.0.1;dbname=cactus", "root", "", $options = [
            PDO::ATTR_EMULATE_PREPARES   => false,
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
              ]);
        } catch(PDOException $e) {
            print("Error: " . $e->getMessage() . "<br>");
            die();
        }
}

    public function connect() {
        if(self::$instance == null) {
            self::$instance = new DB();
        }

        return self::$instance;
    }
}


<?php
include "DB.php";

class Load_Data {

    public function Fetch() {
        $db = DB::connect();
        $Querystatement = $this->db->prepare("SELECT * FROM `production`");
        $Querystatement->fetchAll();
        $Querystatement->execute();
        /** Converting data to JSON **/ 
        json_encode($Querystatement);
        return $Querystatement;
    }
}

$load_Data = new Load_Data();
$load_Data->Fetch();


1 commentaires

Où utilisez-vous l'héritage? Vous parlez-vous à un autre code non indiqué ici?


4 Réponses :


1
votes

Votre premier problème est la suivante: xxx

attribution à $ dB crée une variable locale appelée $ dB . Si vous souhaitez faire cette valeur disponible en tant que variable d'instance $ ceci-> dB , vous devez attribuer à cela explicitement.

Votre deuxième problème est qu'un objet DB n'est pas un objet PDO; Vous ne pouvez pas appeler des méthodes PDO comme préparer () dessus. Depuis la propriété db de l'objet dB est privé, il n'y a aucun moyen d'y accéder à partir d'un appelant externe; Vous devrez apporter des modifications à votre conception.


1 commentaires

En fait, cela ne résoudra pas mon problème car une autre moitié mon erreur restera à sa place. Ce qui est comme suit: "Erreur fatale: Erreur non capturée: appel à la méthode non définie dB :: Préparez () dans c: \ xampp \ htdocs \ cactus \ cactus \ load-data.php: 8 trace de pile: # 0 C: \ XAMPP \ htdocs \ cactus \ cactus \ load-data.php (18): loader_data-> récupération () # 1 {main} jeté dans c: \ xampp \ htdocs \ cactus \ cactus \ load-data.php à la ligne 8 " d'autres mots, il ne reconnaissait toujours pas dB () :: préparer () méthode comme méthode légale



0
votes

Je pense que votre problème est que vous n'avez pas défini votre méthode Connect () code> en tant que méthode statique. Par conséquent, il est impossible d'y accéder en appelant dB: Connect (); code>

Essayez de modifier votre classe ' Connect () code> méthode suivante: p>

public static function connect() {
    /* Existing Code Here */
}


1 commentaires

@Wajahahatali a publié une modification à la réponse. Vous êtes interne dB instance n'est pas visible par la variable locale $ dB en raison de l'utilisation de particuliers. Faites-le publique et cela devrait fonctionner correctement.



-1
votes

Changer xxx

à xxx


3 commentaires

Monsieur, je viens de l'essayer après votre suggestion, mais cela n'a pas fonctionné.


Cela ne serait vrai que si la variable $ db contenait directement l'instance PDO directement. Dans ce cas, la variable db contient une référence de classe qui contient une autre variable $ dB contenant l'instance pdo .


Exactement. Maintenant, la question est que la logique que j'essaie de mettre en œuvre est réalisable ou non? & Si oui, j'ai besoin d'un indice au moins comment y parvenir.



0
votes

Il y a quelques problèmes. Premièrement, pour utiliser l'héritage, la classe DB doit s'étendre en PDO. Vous avez raison que le Le constructeur devrait être privé, mais vous ne devriez pas vraiment avoir rien dedans. Votre méthode Connect () doit être statique, Et il devra appeler une autre méthode statique pour obtenir l'instance et le constructeur ne peut pas être statique. Ajoutez donc un getinstance méthode qui définit l'instance et le renvoie et appelle cela dans Connect () au lieu d'essayer d'utiliser nouveau . XXX

maintenant que DB étend PDO, vous aurez accès aux différentes méthodes PDO dont vous avez besoin. Mais il reste encore plusieurs problèmes avec la façon dont vous essayez d'obtenir des données. Tout d'abord, vous devriez appeler préparer () sur $ db plutôt que $ ceci-> dB , ce qui n'existe pas. Après cela, vous avez appelé fetchall () avant exécuté () qui ne fonctionnera pas, car il n'y a rien à récupérer avant d'exécuter La déclaration, vous n'avez pas affecté les résultats de fetchall () ou json_encode () à quoi que ce soit et que vous retournez la pdostatement objet plutôt que la matrice de JSON Cooded gamme de résultats Vous attendez. xxx

après la fixation load_data , vous devez toujours faire un ajustement supplémentaire à la façon dont vous l'utilisez si vous voulez voir quelque chose. Appel $ load_data-> fetch (); ne produit rien. fetch () retournera une chaîne maintenant, mais vous devez ECHO si vous voulez Pour voir les résultats, ou attribuez-le à une variable si vous allez faire autre chose avec elle. xxx


1 commentaires

Monsieur, premièrement, merci beaucoup pour la réponse en profondeur à ma réponse. C'est exactement ce que je voulais, mais pouvez-vous me dire aussi que comment instancier la fonction Insérer () dans le scénario ci-dessus. Encore une fois, merci beaucoup monsieur.