[RESOLU] PDO Read erreur

Eléphant du PHP | 194 Messages

19 févr. 2023, 20:32

Bonjour à tous ,

je rencontre cette erreur :

Fatal error: Uncaught Error: Call to undefined function read() in /index-ctrl.php:8 Stack trace: #0 /volume1/index.php(2): require_once() #1 {main} thrown in /controllers/index-ctrl.php on line 8

Voici mes fichiers :

Model :
<?php
require_once(dirname(__FILE__).'/../publics/utils/database.php');

class Messageaccueille {

private $id;
private $message;

public function __construct($id = NULL, $message = NULL) {
$this->id = $id;
$this->message = $message;
$this->pdo = Database::getInstance();
}

public function read($id) {
$sql = "SELECT 'message' FROM 'messageaccueille' WHERE id = :id;";


$pdo = Database::getInstance();
$req = $pdo->prepare($sql);
$req->bindValue(':id', $id);
$req->execute();
return $req->fetch();
}

public function update($id, $message) {
$query = "UPDATE textes SET texte = :texte WHERE id = '1'";
$stmt = $this->db->prepare($query);
$stmt->bindParam(':id', $id);
$stmt->bindParam(':texte', $message);
return $stmt->execute();
}

}
Vue :
<?php
ob_start();
?>

<!-- Message accueille -->
<?= $messageaccueille ->message ?>


<!-- Accueil -->

<div class="container">
<div class="row justify-content-center">
<div class="col-10">

<div class="mt-3">
<h1>Accueil</h1>
</div>
</div>
</div>
</div>





<div class="container">
<div class="row justify-content-center">
<div class="col-8 my-5 text-center">
<h4 class="p">Site en construction</h4>
</div>
</div>
</div>

<div class="container ">
<div class="row justify-content-center fixed-bottom mb-4">
<div class="col-6 my-5 text-center">
<a href="/../controllers/connexionInscription-ctrl.php"><button type="button" class="btn btn-outline-success">Connexion / Inscription</button></a>
</div>
</div>
</div>

<?php

$content = ob_get_clean();

$titlePage = 'Bienvenue';
$metaDescription ="";
$metaKeywords ="";
$title = 'Bienvenue';
$css = 'connexion';
$page = 'connexion';

include(dirname(__FILE__).'/templates/nonConnecter.php');
?>
Controlleur :
<?php
require_once(dirname(__FILE__).'/../models/Messageaccueille.php');

$id = '1';

// créer une instance de la classe Texte
$texte = new Messageaccueille();
$messageaccueille = $texte>read($id);


// Démarrer une nouvelle session
session_start();




$page = '';

include(dirname(__FILE__).'/../views/index.php');
Si quelqu'un passe sur mon post est peut m'aider.
Merci par avance pour votre aide

Eléphant du PHP | 194 Messages

19 févr. 2023, 21:42

En me relisant j'ai vu que dans le contrôleur j'ai oublié un "-" ligne 8 , maintenant j'ai l'erreur suivante

"Warning: Attempt to read property "message" on bool in /volume1/EASYKODE/easykodePhp/views/index.php on line 6 "

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9715 Messages

19 févr. 2023, 22:41

Traduis le message d'erreur.
Comment le comprends-tu en regardant ta ligne 6 ?
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 194 Messages

20 févr. 2023, 07:12

Bonjour,

Merci pour ta réponse , mais je ne comprend pas très bien ce que tu veux dire.
Quand je traduit la réponse cela veut dire qu'il attend une reponse vrai ou faux, il attend un booléen.
Je débute dans le code, j'ai quelques notions de base

A très bientôt
@+ Filou

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9715 Messages

20 févr. 2023, 11:15

"Attention : tentative de lecture de la propriété "message" sur un booléen."

:!: Un booléen (vrai/faux) n'est pas un objet, et donc n'a pas de propriété

:idea: Donc il faut que tu regardes à la ligne 6, sur quel variable tu essayes d'appeler une propriété "->message"

:arrow: Et que tu débugues en remontant dans ton code pour comprendre pourquoi cette variable contient un booléen plutôt qu'un objet.
A noter que PHP considère qu'une variable vide/non initialisé/qui vaut zéro équivaut au booléen "false"
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 194 Messages

20 févr. 2023, 22:12

Bonsoir,

via le controller
<?php
require_once(dirname(__FILE__).'/../models/Messageaccueille.php');


$id = '1';

// créer une instance de la classe Texte
$texte = new Messageaccueille();
$messageaccueille = $texte->findOne($id);

var_dump($messageaccueille);
exit;

// Démarrer une nouvelle session
session_start();

$page = '';

include(dirname(__FILE__).'/../views/index.php');
quand je fait un var dump de $texte cela me donne ceci :

object(Messageaccueille)#1 (4) { ["id":"Messageaccueille":private]=> NULL ["message":"Messageaccueille":private]=> NULL ["pdo":"Messageaccueille":private]=> object(PDO)#2 (0) { } ["mail"]=> NULL }

et le var dump de $messageaccueille me met ceci :
bool(false)

Merci par avance pour votre aide
@+ Filou

Eléphant du PHP | 194 Messages

22 févr. 2023, 21:22

Bonsoir,

Je viens de corrigé une erreur de code mais cela ne règle pas mon problème dans mon modéle j'ai mis mail a la place de message.

Ci quelqu’un passe par la pour me débloqué .... merci par avance
@+ Filou

Avatar du membre
Mammouth du PHP | 1609 Messages

23 févr. 2023, 11:17

Salut filou80, à priori le findOne ne trouve pas de ligne et retourne donc le booléen false. J'imagine que tu as renommé la méthode read en findOne car on ne voit pas cette méthode sur la classe dans ton message de départ.

En tout cas si tu regardes sur la doc la valeur du retour de pdo fetch, tu verras que c'est false si la requête ne retourne pas de ligne.
Développeur web depuis + de 20 ans

Eléphant du PHP | 194 Messages

23 févr. 2023, 21:58

Voici ma methode :
<?php
require_once(dirname(__FILE__).'/../publics/utils/database.php');

class Messageaccueille{
private $id;
private $message;
private $pdo;

//Methode magique pour hydraté l'objet
public function __construct($id = NULL, $message = NULL){
$this->id = $id;
$this->message = $message;
$this->pdo = Database::getInstance();
}

function __set($property, $value)
{
$this->$property = $value;
}

public function findOne($id){
$sql = 'SELECT `id`, `message` FROM `utilisateurs` WHERE `id`= :id;';
$pdo = Database::getInstance();
$req = $pdo->prepare($sql);
$req->bindValue(':id',$id,PDO::PARAM_INT);
try {
if($req->execute()) {
return $req->fetch(PDO::FETCH_OBJ);
}
} catch (PDOException $ex) {
return false;
}
}



// public function findOne($id){
// $sql = 'SELECT `id`, `message` FROM `utilisateurs` WHERE `id`= :id;';
// $pdo = Database::getInstance();
// $req = $pdo->prepare($sql);
// $req->bindValue(':id', $id, PDO::PARAM_INT);
// try {
// if ($req->execute()) {
// $result = $req->fetch(PDO::FETCH_OBJ);
// if ($result) {
// $this->id = $result->id;
// $this->message = $result->message;
// }
// return $result;
// }
// } catch (PDOException $ex) {
// return false;
// }
// }




}

ynx
Mammouth du PHP | 586 Messages

24 févr. 2023, 14:11

Il faut que tu continues à remonter le fil d'exécution pour comprendre comment fonctionne ton code.
Le rapport d'erreur de PDO est bien défini sur PDO::ERRMODE_EXCEPTION dans le fichier database.php ?

Essaye d'ajouter des log/echo/var_dump dans ta fonction :
public function findOne($id){
	$sql = 'SELECT `id`, `message` FROM `utilisateurs` WHERE `id`= :id;';
	$pdo = Database::getInstance();
	$req = $pdo->prepare($sql);
	$req->bindValue(':id',$id,PDO::PARAM_INT);
	try {
		if($req->execute()) {
			echo 'la requête est bien exécutée, la fonction retourne false si aucun résultat';
			return $req->fetch(PDO::FETCH_OBJ);
		}
	} catch (PDOException $ex) {
		echo 'exception pdo, voir le message pour plus de détail : ';
		echo $ex->getMessage();
		return false;
	}
}

Si tu as une erreur lors de l'exécution de ta requête, le message de l'exception devrait te donner la piste pour corriger l'erreur.
Si la requête sql est bien exécutée mais que fetch retourne false, c'est qu'il n'y a aucun résultat correspondant à la requête. Il faut alors vérifier les données et tester la requête avec un outil comme PhpMyAdmin.

Eléphant du PHP | 194 Messages

25 févr. 2023, 04:23

Merci Ynx pour ton aide,

En mettant ton code cela me donne ceci :

exception pdo, voir le message pour plus de détail : SQLSTATE[42S22]: Column not found: 1054 Unknown column 'message' in 'field list'
Warning: Attempt to read property "message" on bool in /volume1/EASYKODE/easykodePhp/views/index.php on line 6

Grace a toi j'ai trouver mon erreur je vise la table utilisateur et non celle ou se trouve le message.

Merci a toi Ynx et merci au forum
@+ Filou