PDO: Call to undefined method DB::query()
Essayer d'obtenir le coup de PDO, mais ne pas avoir beaucoup de plaisir à le moment. Je parie que c'est quelque chose de vraiment simple.
EDIT: Ce serait une meilleure façon de faire cela? j'.e au lieu de l'enveloppant dans une classe?
classes/DB.class.php:
<?php
//DB.class.php
class DB {
protected $db_name = "PDO";
protected $db_user = "root";
protected $db_pass = "root";
protected $db_host = "localhost";
//Establish Connection to Database.
public function connect() {
try {
$DB = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
}
catch (PDOException $e) {
echo $e->getMessage();
}
}
}
?>
includes/global.inc.php:
<?php
require_once 'classes/DB.class.php';
//Establish Connection to Database.
$db = new DB();
$db->connect();
?>
index.php:
<?php
require_once 'includes/global.inc.php';
$STH = $db->query("SELECT * FROM users");
echo "<pre>";
print_r($STH->fetch());
?>
Vous auriez besoin d'utiliser
$db->DB->query()
. Votre classe n'est pas l'extension de la classe PDO, c'est tout simplement l'enveloppant.OriginalL'auteur ritch | 2011-06-10
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas de DB propriété et
query()
méthode dans votre classe DB. Ajouter comme cette inscription:La meilleure façon serait d'utiliser certains ORM bibliothèque ou nue objet PDO - c'est tout à fait sympathique.
Y avait-il un message d'erreur à partir de PDO, qu'il ne pouvait pas se connecter à la base de données? Semble comme objet PDO n'a pas été instancié.
Garde en disant: Undefined variable $db_name, user, pass et d'accueil?
Vous avez
echo $e->getMessage();
partie dans le code, je veux dire ce message qui doit être indiqué sur la page lorsque vous exécutez le code.Mise à jour de la réponse - le manque
$this->
pièces.OriginalL'auteur Tomasz Kowalczyk
Essayez ceci:
Aussi, j'ai ajouté le
$this
de mots clés en avant de vos membres, parce que$db_name
et telle n'ont pas été déclarées dans la portée de la méthode.Si vous ne voulez pas que la connexion est initiée lorsque l'objet est créé, vous pouvez faire:
Remarque importante: Normalement, lors de la substitution de méthodes dans les enfants, vous devez spécifier la même signature de la méthode en tant que parent (ou vous aurez une erreur E_STRICT). Heureusement, cela ne s'applique pas à des classes de base, probablement pour permettre des remplacements comme ça.
OriginalL'auteur netcoder
L'objet instancié comme $db n'ont pas la méthode de la requête. Il n'y a probablement pas besoin d'envelopper l'objet PDO dans un autre objet, mais si vous allez faire cela, vous devez assurez-vous que toutes les méthodes sont accessibles.
Dans ce cas d'utilisation spécifiques, il n'est pas tout. L'héritage est mieux. L'adaptateur modèle est en effet utile lorsque vous créez une couche d'abstraction.
OriginalL'auteur datasage
votre classe DB n'a pas de méthode de requête! vous pourriez faire de cette façon:
Avec la fonction magique
__call()
vous pouvez passer toutes les fonctions que PDO prend en charge à votre nouvellement créé Objet PDO.Je ne veux pas de corriger les erreurs du développeur, je veux juste inclure AOP fonctionnalités dans la classe DB.
Et ce n'est pas la corriger, parce que si il a appeler AOP méthode incorrecte de l'utilisation de ces "proxy", il va lui donner "undefined quelque chose" erreur et il ne savent pas ce qui se passe. Je ne vais pas downvote votre réponse, juste pour dire, que ce n'est pas la bonne façon de résoudre le problème.
OriginalL'auteur Sascha Galley