Fatal error: Uncaught Error: Call to a member function query()
Résolu
chabinot
Messages postés
391
Statut
Membre
-
chabinot Messages postés 391 Statut Membre -
chabinot Messages postés 391 Statut Membre -
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
- A disk read error occurred ✓ - Forum Windows
- Error 1962 ✓ - Forum PC fixe
- Playback error reconnect in 3s (1/5) francais - Forum Box et Streaming vidéo
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,