Bonjour,
Je sollicite le forum car je ne comprends pas où se cache l'erreur.
J'ai une fonction qui prend trois variables (id, table, base) et qui fait un 'SELECT' pour ensuite afficher le contenu à l'écran :
function lecture_base($titre,$table,$base){
$titre=transforme($titre);
$d=array('id'=>$titre);
$sql = "SELECT * FROM `$table` WHERE `titre`=:id";
try{
$req=$base->prepare($sql);
$req->execute($d);
$affiche=$req->fetch(PDO::FETCH_OBJ);
if(lang=="en"){
$affiche=($affiche->content);
return $affiche;
}else{
$affiche=($affiche->contenu);
return $affiche;
}
$req->closeCursor();
}
catch(PDOException $e){
echo 'Erreur : '.$e->getMessage().'<br />';
echo 'Trace : '.$e->GetTraceAsString().'<br />';
echo 'N° : '.$e->getCode();
}
}
La fonction transforme récupère une chaîne de caractères et rend la même chaîne avec uniquement des lettres a-z en minuscule.
La page index fait appel trois fois à cette fonction lecture_base :
<div id="hauteurimage">
<img src="image/2_vieillephoto.png" alt="Pascal Gonthier, enfant" title="Pascal, enfant" width="180" height="180" />
<!-- Lecture de la base de données pour récupérer le contenu -->
<?php
$affiche=lecture_base($domaine_fr,$pageCurrent,$DB_loc);
print_r($affiche);
?>
</div><!-- divhauteurimage-->
<div class="cb"></div>
<h2><?php echo $galerie; ?></h2>
<!-- Lecture de la base de données pour récupérer le contenu -->
<?php
$affiche=lecture_base($galerie_fr,$pageCurrent,$DB_loc);
print_r($affiche);
?>
<div id="gallery"> ...
</div><!--divgallery-->
<h2><?php echo $entreocean; ?></h2>
<!-- Lecture de la base de données pour récupérer le contenu -->
<?php
$affiche=lecture_base($entreocean_fr,$pageCurrent,$DB_loc);
print_r($affiche);
?>
Les deux premiers appels fonctionnent correctement et affiche le contenu de la BDD.
Le troisième appel affiche une erreur :
Notice: Trying to get property of non-object in /chemin/vers/fonction.php on line 63
La ligne 63 :
$affiche=$affiche->contenu;
En traçant le problème avec FireBugPHP, il apparaît que la ligne
$affiche=$req->fetch(PDO::FETCH_OBJ)
donne le résultat
bool/false
.
Rien de concluant n'apparaît de plus dans la console de FireBugPHP.
Comment une structure qui fonctionne correctement deux fois, peut-elle ne plus fonctionner la troisième fois ?
Les données sont présentes dans la base. La variable $titre est bien renseignée avec la bonne valeur pour aller lire la table...
Merci pour vos idées car j'en ai vraiment besoin.
Cordialement.
PS : s'il manque des informations pour expliciter plus avant le problème n'hésitez pas à me les demander.
J'ai malheureusement le même soucis que toi enfin pas la même erreur mais ça vient d'une mauvaise conception du code ;) . J'ai réglé mon problème en refaisant toute la partie foireuse de A à Z en élaborant une meilleure façon de faire.
Ici tu reçois une erreur parce qu'au bout de la 3ème fois le $affiche n'est pas un objet mais un booléen comme tu le dis.
Il est possible qui sait qu'aucun résultat ne correspond à ta requête d'où ton erreur de booléen et d'utilisation en tant qu'objet d'une variable qui n'en est pas un.
Tu peux nous faire un
print_r($entreocean_fr);
?
Bonjour,
Merci pour la réponse. Le contenu de la variable :
$entreocean_fr='Entre océan et Limousin'
.
Est-ce préférable d'utiliser la propriété PDO::BindParam ?
Cordialement.
Je ne demande pas le contenu en soit mais ce qu'un print_r te renvoie pour la variable voir si le contenu passe bien ^^ .
Essayes de remplacer $affiche par un autre nom du genre
$name = $affiche->contenu;
Histoire de voir si c'est pas un problème de nom de variable équivalent.
Le bindParam servira pour la requête mais si elle est déjà bien constituée ça ne changera rien mais comme tu utilises PDO autant l'utiliser comme il se doit et donc utiliser le bindParam.
Tu peux essayer un fetchAll au lieu d'un simple fetch.
Bonjour,
Avant la transformation le print_r renvoie :
Entre océan et Limousin
.
Après avoir testé ton idée,
$name = $affiche->contenu
, pas de changement.
D'après FireBugPHP, la requête est bien formulée. Pas de différence visible au niveau des 3 requêtes.
Je vais recoder avec un BindParam.
Je vais également testé avec fetchall().
Tu disais dans ton premier message que tu avais tout recodé après avoir rencontré ce problèle.
Peux-tu m'en dire plus ou bien n'est-ce pas pertinent ?
Cordialement.
Dans mon cas c'était pour un e commerce (vêtements de différentes tailles) en fait j'avais mis dans un tableau en index la taille du produit et en valeur l'id du produit le problème c'est que je pouvais avoir plusieurs produits avec la même taille dans le panier donc ça coinçait à ce moment là puisque dans un tableau on ne peut avoir deux fois le même index.
Ce qui faisait que j'avais un trying to get property on non object sur une de mes requêtes sql étant données que la taille n'existait pas donc ma requête me renvoyait un booléen false et lorsque j'essayais d'utiliser le résultat de la requête l'erreur trying to get property on non object apparaissait puisque j'avais un booléen et non un objet.
J'ai donc réécris la partie du code qui posait problème en mettant les tailles dans un tableau multidimensionnel avec un index allant de 0 à l'infini et je vérifiais s'il y avait pas déjà un index ayant la même valeur dans l'index en cours avec array_search si c'est le cas je change d'index et je place la taille dedans etc...
En gros ça me donne ça:
array(
[0]=> array(
[42] => 104
[43] => 105
)
[1]=> array(
[42]=> 105
)
)
Au début j'avais ça:
array(
[42] => 104
[43] => 105
)
Bonjour,
Finalement il faut savoir reconnaître les grosses bourdes que l'on fait quand on développe. La base à partir de laquelle j'essayais de lire le fameux troisième enregistrement n'était pas la bonne base. Donc l'enregistrement n'existant pas dans cette base, j'essayais de récupérer un enregistrement qui n'existait pas ce qui dans mon code se traduisait par le fait d'utiliser la propriété d'un objet qui n'existe pas d'où l'erreur. J'ai quand même changé un peu mon code pour utiliser le bindParam et le bindColumn ce qui rend le code plus clair et plus sécurisé.
Voici donc la fonction lecture_base:
function lecture_base($id,$table,$base){
$id=transforme($id);
$sql = "SELECT titre, contenu, content FROM `$table` WHERE `titre`=:id";
try{
$req=$base->prepare($sql);
// Liaison du paramètre
$req->bindParam(':id',$id,PDO::PARAM_STR);
// Liaison des résultats à des variables
$req->bindColumn('titre', $titre);
$req->bindColumn('contenu', $contenu);
$req->bindColumn('content', $content);
$req->execute();
$donnees=$req->fetch(PDO::FETCH_OBJ);
$req->closeCursor();
if(lang=="en"){
return $content;
}else{
return $contenu;
}
$req=null;
}
catch(PDOException $e){
echo 'Erreur : '.$e->getMessage().'<br />';
echo 'Trace : '.$e->GetTraceAsString().'<br />';
echo 'N° : '.$e->getCode();
}
}
Merci pour ton aide Xtr3me. Toujours très utile d'échanger.
Cordialement.