2010-08-01 8 views
0

C'est la première fois que je reçois une erreur comme celle-ci, laissez-moi vous expliquer:boucle Foreach apporte une erreur fatale: Appel à une fonction de membre bindParam() sur un non-objet

Voici mon code:

La première itération fonctionne très bien, elle imprime ce que je veux (un nom de catégorie et le nombre d'éléments qu'il contient).

Mais après cette première itération, je reçois cette erreur classique:

Fatal error: Call to a member function bindParam() on a non-object in

En effet, co $ est un objet PDO valide car il fonctionne pour la première itération. Mais il semble que dès que nous entrons dans le second, il ne l'est plus? : 0

Je suis un peu nouveau avec PDO, donc c'est peut-être un comportement normal que je n'ai pas encore reconnu. S'il vous plaît aider! =)

+0

S'il vous plaît mettez votre code dans un bloc de code, il est illisible autrement. –

+0

Vous voulez dire, même des petits morceaux de code comme $ foo? – Pioul

+0

Pourquoi avez-vous plusieurs tables pour le même type de données? Ceci est une odeur de code de conception de base de données. –

Répondre

2

On dirait que $co->prepare... retourne FALSE pour au moins un des stamtents que vous essayez de préparer.
Testez le code if (!$tr) .... ou définissez $co->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); pour obtenir une exception lorsque PDO rencontre une erreur.

+0

Merci pour le '$ co-> setAttribute (PDO :: ATTR_ERRMODE, PDO :: ERRMODE_EXCEPTION); '! Merci au message d'erreur que j'avais, qui m'a dit d'utiliser 'fetchAll()' au lieu de 'fetchColumn()', ça fonctionne WORKS! Mais je ne comprends toujours pas pourquoi j'ai dû utiliser 'fetchAll()', mes requêtes ne retournant qu'une ligne .. – Pioul

0

Je pense que $ co-> prepare renvoie un échec (faux probablement) qui suggère que l'instruction n'est pas valide. Assurez-vous que $ aSection n'est pas vide.

Vous ne devriez pas mettre $ aSection à la requête comme vous le faites maintenant car vous pourriez rencontrer un problème d'injection SQL si $ aSection provient d'une entrée utilisateur.

+0

Je me suis déjà assuré que $ aSection n'était pas vide, et testé la requête SQL pour chaque $ aSection possible:/ Et $ aSection ne vient pas d'une entrée utilisateur, je suis coincé mais ne manque pas de bonnes pratiques: p – Pioul

0

Très probablement $aSection n'est pas valide. Comme vous n'avez pas fourni les données, c'est difficile à deviner. S'il vous plaît en savoir plus sur le traitement des erreurs PDO: http://de.php.net/manual/en/pdo.error-handling.php

quelque chose comme ce code devrait aider:

foreach($allSections as $aSection => $aSectionName){ 
    $tr = $co->prepare("SELECT COUNT(id) FROM ". $aSection ." WHERE site=:id AND valide=1"); 
    if (!$tr) { 
     print_r($co->errorInfo()); 
     continue; 
    } 

    $tr->bindParam(':id', $id, PDO::PARAM_INT); 
    $tr->execute(); 
    if($indexedItems = $tr->fetchColumn()) echo '<p>'. $aSectionName .' : '. $indexedItems .'</p>'; 
} 
+0

Arf, 'print_r (errorInfo());' ne fonctionnait pas, mais 'print_r ($ co -> errorInfo()); 'fait, je me suis rendu compte qu'après avoir regardé votre lien (je suppose que c'était une erreur de frappe). Merci quand même ! – Pioul

+0

Correction du code ci-dessus. Vous êtes le bienvenu. – johannes

Questions connexes