Fatal error: Uncaught Error: Call to a member function query()
Résolu
chabinot
Messages postés
322
Date d'inscription
Statut
Membre
Dernière intervention
-
chabinot Messages postés 322 Date d'inscription Statut Membre Dernière intervention -
chabinot Messages postés 322 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je suis en train de tester une classe Database, il me retourne l'erreur suivante après avoir fait un update. Voilà les sources:
1 - Source index.php :
2 - Source classe Database :
3 - Source index.view.php :
Egalement une capture de l'erreur :

Je ne vois pas comment faire, merci de m'aider
Cordialement,
Je suis en train de tester une classe Database, il me retourne l'erreur suivante après avoir fait un update. Voilà les sources:
1 - Source index.php :
<?php // Autoload require './vendor/autoload.php'; $date = new Date(); $bdd = new Database('datalib'); if (isset($_GET['confirme']) && !empty($_GET['confirme'])) { $confirme = (int) $_GET['confirme']; $req = $bdd->update('UPDATE membres SET confirme = 1 WHERE id = ?', [$confirme]); } include './views/index.view.php';
2 - Source classe Database :
<?php class Database { private $db_name; private $db_host; private $db_user; private $db_pass; private $dsn; private $pdo; // Connection à la base de donnée public function __construct($db_name, $db_user = 'root', $db_pass = '', $db_host = 'localhost') { $this->db_name = $db_name; $this->db_user = $db_user; $this->db_pass = $db_pass; $this->db_host = $db_host; } private function getPDO() { $this->dsn = "mysql:dbname={$this->db_name};host={$this->db_host};charset=utf8"; if ($this->pdo === null) { $pdo = new PDO($this->dsn, $this->db_user, $this->db_pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->pdo = $pdo; return $pdo; } } public function query($stmt) { $req = $this->getPDO()->query($stmt); $datas = $req->fetchAll(PDO::FETCH_OBJ); return $datas; } public function update($stmt, $params = []) { $req = $this->getPDO()->prepare($stmt)->execute($params); } }
3 - Source index.view.php :
<!DOCTYPE html> <html lang="fr"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Test PDO</title> <!-- Typographie --> <link href="https://fonts.googleapis.com/css?family=Open+Sans|Roboto:100,300,400,500,700" rel="stylesheet"> <!-- Style CSS --> <link rel="stylesheet" href="./css/bootstrap.css"> <link rel="stylesheet" href="./css/app.css"> <link rel="stylesheet" href="./css/sticky-footer.css"> <!-- Scripts --> <script src="./js/time.js"></script> </head> <body> <div class="header"> <div class="date"> <?= $date->toDay() ?><br> <?= '(semaine ' . $date->week() . ') ' ?> <?= '(jour ' . $date->dayofYear() . ') ' ?> <?= '(' . $date->reste() . ')' ?> </div> <h1 class="text-center"><a href="/">Test Classe PDO</a></h1> <div class="time" id="time"> <script>window.onload=dsptime('time');</script> </div> </div> <div class="container"> <table class="table table-bordered table-striped"> <caption><h4>Liste des membres</h4></caption> <thead class="text-center"> <tr> <th scope="col">Identifiant</th> <th scope="col">Nom</th> <th scope="col">Pseudo</th> <th colspan="2" class="text-center">Action</th> </tr> </thead> <tbody> <?php foreach ($bdd->query('SELECT * FROM membres') as $m) : ?> <?= '<tr><td class="text-center">' . $m->id ?> <?= '</td><td class="text-center">' . $m->name ?> <?= '</td><td class="text-center">' . $m->pseudo ?> <?php if ($m->confirme == 0) : ?> <?= '</td><td scope="row" class="text-center"><a href="index.php?confirme='. $m->id . '" class="btn btn-success btn-sm">Confirmer</a>' ?> <?php else : ?> <?= '</td><td scope="row" class="text-center"><button class="btn btn-secondary btn-sm">Confirmé ' ?> <?php endif; ?> <?= '</td><td scope="row" class="text-center"><a href="index.php?supprime='. $m->id . '" class="btn btn-danger btn-sm">Supprimer</a>' ?> <?= '</td></tr>' ?> <?php endforeach; ?> </tbody> </table> </div> <footer class="footer text-center"> <div class="container"> <span>Copyright © 2017 - <?= date('Y') ?> <a href="">Amaury le Cour</a>. Tous droits réservés</span> </div> </footer> </body> </html>
Egalement une capture de l'erreur :
Je ne vois pas comment faire, merci de m'aider
Cordialement,
A voir également:
- Fatal error: uncaught error: call to a member function on null
- Darkino fatal error - Meilleures réponses
- Fatal error: uncaught error: call to a member function query() on null - Meilleures réponses
- Fan error lenovo - Forum Refroidissement
- Cmos checksum error ✓ - Forum Carte-mère/mémoire
- Playback error reconnect in 3s (1/5) francais - Forum Box et Streaming vidéo
- Error 1962 ✓ - Forum PC fixe
- A disk read error occurred ✓ - Forum Windows
3 réponses
Bonjour,
Commence par ça :
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
(en ajoutant, aussi bien dans ta connexion PDO que pour CHAQUE requête un bloc TRY/CATCH )
Et au passage .... A quel endroit, dans ton fichier index.view.php instancies tu la class Database ?
Car là .. ta variable $bdd est "null" d'où ton message d'erreur....
Commence par ça :
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
(en ajoutant, aussi bien dans ta connexion PDO que pour CHAQUE requête un bloc TRY/CATCH )
Et au passage .... A quel endroit, dans ton fichier index.view.php instancies tu la class Database ?
Car là .. ta variable $bdd est "null" d'où ton message d'erreur....
Bonjour,
La class Database, je le fais dans le fichier index.php. Dans la fonction getPDO() il se connecte à la base.
Dans le fichier index.view.php, la connexion se fait avec la fonction query
<?php foreach ($bdd->query('SELECT * FROM membres') : ?>.
Le problème vient lorsque je clique sur un bouton Confirmer qui fait un update de la table, et c'est au retour, il se plante à l'instruction :
<?php foreach ($bdd->query('SELECT * FROM membres') : ?>
Je vais essayé de me connecter dans la fonction __contruct et non dans la fonction hetPDO().
Effectivement j'ajouterais le bloc (TRY/CATCH).
Si cela marche, je te tiendrai au courant.
Cordialement,
La class Database, je le fais dans le fichier index.php. Dans la fonction getPDO() il se connecte à la base.
Dans le fichier index.view.php, la connexion se fait avec la fonction query
<?php foreach ($bdd->query('SELECT * FROM membres') : ?>.
Le problème vient lorsque je clique sur un bouton Confirmer qui fait un update de la table, et c'est au retour, il se plante à l'instruction :
<?php foreach ($bdd->query('SELECT * FROM membres') : ?>
Je vais essayé de me connecter dans la fonction __contruct et non dans la fonction hetPDO().
Effectivement j'ajouterais le bloc (TRY/CATCH).
Si cela marche, je te tiendrai au courant.
Cordialement,
Bonjour Jordane45,
J'ai modifié ma classe Database comme suit:
Maintenant cela marche comme je veux, voilà mon fichier index.php :
Et dans le fichier index.view.php, j'ai juste modifié la ligne suivante:
Encore merci pour ton aide, je vais mettre ce sujet en résolu.
Cordialement,
J'ai modifié ma classe Database comme suit:
<?php class Database { private $db_name; private $db_host; private $db_user; private $db_pass; private $dsn; private $pdo; private $error; // Connection à la base de donnée public function __construct($db_name, $db_user = 'root', $db_pass = '', $db_host = 'localhost') { $this->db_name = $db_name; $this->db_user = $db_user; $this->db_pass = $db_pass; $this->db_host = $db_host; // Définir le dsn $this->dsn = "mysql:dbname={$this->db_name};host={$this->db_host};charset=utf8"; // Connexion à la base de donnée try { $pdo = new PDO($this->dsn, $this->db_user, $this->db_pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $this->pdo = $pdo; } catch (PDOException $e) { $this->error = $e->getMessage(); } } public function query($stmt) { $req = $this->pdo->query($stmt); $datas = $req->fetchAll(PDO::FETCH_OBJ); return $datas; } public function update($stmt, $params = []) { $req = $this->pdo->prepare($stmt)->execute($params); } public function delete($stmt, $params = []) { $req = $this->pdo->prepare($stmt)->execute($params); } }
Maintenant cela marche comme je veux, voilà mon fichier index.php :
<?php // Autoload require './vendor/autoload.php'; // Date du jour $date = new Date(); // Connexion à la base de donnée $bdd = new Database('datalib'); if (isset($_GET['confirme']) && !empty($_GET['confirme'])) { $confirme = (int) $_GET['confirme']; $req = $bdd->update('UPDATE membres SET confirme = 1 WHERE id = ?', [$confirme]); } if (isset($_GET['supprime']) && !empty($_GET['supprime'])) { $supprime = (int) $_GET['supprime']; $req = $bdd->delete('DELETE FROM membres WHERE id = ?', [$supprime]); } include './views/index.view.php';
Et dans le fichier index.view.php, j'ai juste modifié la ligne suivante:
<?php foreach ($bdd->query('SELECT * FROM membres') as $m) : ?>
Encore merci pour ton aide, je vais mettre ce sujet en résolu.
Cordialement,