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();
4 Réponses :
Votre premier problème est la suivante: attribution à 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 $ dB code> crée une variable locale appelée
$ dB code>. Si vous souhaitez faire cette valeur disponible en tant que variable d'instance
$ ceci-> dB code>, vous devez attribuer à cela explicitement. P>
préparer () code> dessus. Depuis la propriété
db code> de l'objet
dB code> est privé, il n'y a aucun moyen d'y accéder à partir d'un appelant externe; Vous devrez apporter des modifications à votre conception. P> p>
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
Je pense que votre problème est que vous n'avez pas défini votre méthode Essayez de modifier votre classe ' Connect () code> en tant que méthode statique. Par conséquent, il est impossible d'y accéder en appelant
dB: Connect (); code>
Connect () code> méthode suivante: p>
public static function connect() {
/* Existing Code Here */
}
@Wajahahatali a publié une modification à la réponse. Vous êtes interne dB code> instance n'est pas visible par la variable locale
$ dB code> en raison de l'utilisation de particuliers. Faites-le
publique code> et cela devrait fonctionner correctement.
Changer à p>
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 code> contenait directement l'instance
PDO code> directement. Dans ce cas, la variable
db code> contient une référence de classe qui contient une autre variable
$ dB code> contenant l'instance
pdo code>.
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.
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 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 après la fixation Connect () code> 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 code>
méthode qui définit l'instance et le renvoie et appelle cela dans
Connect () code> au lieu d'essayer d'utiliser
nouveau code>.
préparer () code> sur
$ db code> plutôt que
$ ceci-> dB code>, ce qui n'existe pas.
Après cela, vous avez appelé
fetchall () code> avant
exécuté () code> 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 () code> ou
json_encode () code> à 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. p>
load_data code>, 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 (); code> ne produit rien.
fetch () code> retournera une chaîne maintenant, mais vous devez
ECHO code> si vous voulez
Pour voir les résultats, ou attribuez-le à une variable si vous allez faire autre chose avec elle. p>
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.
Où utilisez-vous l'héritage? Vous parlez-vous à un autre code non indiqué ici?