On a non-object !

Petit nouveau ! | 2 Messages

06 déc. 2010, 16:53

Bonjour à tous. Je suis nouveau sur le forum, et je viens surtout pour résoudre ce problème donc merci d'avance !

Alors en fait j'ai un problème concernant un appel à une base appelée base_blog (pour un blog on l'aura compris). J'ai donc écrit ceci :
try
	{
		$base_blog = new PDO('mysql:host=localhost;dbname=blog', 'root', '');
	}
	catch(Exception $e)
	{
		die('Erreur : '.$e->getMessage());
	}
        $a_deja_vote = false;
	$ip_du_visiteur = $_SERVER["REMOTE_ADDR"];
	
	// On vérifie si ce posteur a déjà posté pour afficher ou non dans le formulaire la possibilité de noter (à partir de l'IP)
    	// On sélectionne les éventuelles IP correspondantes à celles du visiteur pour l'article concerné
		$ip_potentielles = $base_blog->query($ip_potentielles = $base_blog->query("SELECT ip_du_pseudo FROM commentaires WHERE id_article=$id_article AND ip_du_pseudo=$ip_du_visiteur");
		// On teste et on change la valeur du booléen si l'ip du visiteur est présente dans la table
		if($ip_potentielles->rowCount())
		{
			$a_deja_vote=true;
		}
		// On libère le curseur pour de futures requêtes
		$ip_potentielles->closeCursor();
La requête SQL est bonne (j'utilise PhPmyadmin (wamp)) et l'ai testé dessus), enfin je crois. Mais par la suite l'appel de rowCount me renvoie cette erreur :
Fatal error: Call to a member function rowCount() on a non-object in C:\wamp\www\blog\traitement_formulaire.php
Or j'ai déjà fait un autre appel à cette base de données à un endroit, appel qui fonctionnait. Et de même j'ai déjà utilisé la fonction rowCount() sur un tel objet donc je ne comprends absolument pas pourquoi, ici, cela ne veut pas "refonctionner".

PS : la variable $id_article que j'utilise dans la requête est définie dans le code php "précédent" car ce bout de code est dans un php "include" dans un autre. Je ne sais pas si cela est lié à l'erreur ?

Merci pour le futur temps accordé à la lecture et à la résolution de mon problème !

ViPHP
ViPHP | 5462 Messages

06 déc. 2010, 18:03

active la gestion des erreurs pour PDO :
sql-bases-donnees/gestion-des-erreurs-m ... 55306.html
:wink:

devlop78
Invité n'ayant pas de compte PHPfrance

06 déc. 2010, 20:49

Oui PDO a dû te retourner false plutot qu'une exception. Ce qui est étonnant c'est que je n'ai rien activé moi, et PDO me jette des exceptions ... Tant mieux ! J'utilise même maintenant une fonction pour que toutes les erreurs Php se transforme en exceptions ^^ (php > 5.3, ça c'est dur ...)

Invité
Invité n'ayant pas de compte PHPfrance

06 déc. 2010, 20:51

Hum je ne comprends pas bien ce que je dois faire du bout de code récupéré ?
Je dois remplacer l'appel à la base par cela ?
Ou l'ajouter ? (et où ?)

devlop78
Invité n'ayant pas de compte PHPfrance

06 déc. 2010, 21:00

Hum je ne comprends pas bien ce que je dois faire du bout de code récupéré ?
Je dois remplacer l'appel à la base par cela ?
Ou l'ajouter ? (et où ?)
En parlant de "je ne comprends pas", moi je ne comprends pas ça :
$ip_potentielles = $base_blog->query($ip_potentielles = $base_blog->query("SELECT ip_du_pseudo FROM commentaires WHERE id_article=$id_article AND ip_du_pseudo=$ip_du_visiteur");

ViPHP
ViPHP | 5462 Messages

06 déc. 2010, 21:12

Hum je ne comprends pas bien ce que je dois faire du bout de code récupéré ?
Je dois remplacer l'appel à la base par cela ?
Ou l'ajouter ? (et où ?)
tu dois rajouter le setAttribute

Invité
Invité n'ayant pas de compte PHPfrance

07 déc. 2010, 01:21

blabla
Alors en fait je cherche dans la base des commentaires, les commentaires correspondants à l'article concerné qui ont été postés par l'IP du visiteur. Si de tels commentaires existent, alors plus loin je n'afficherai pas la possibilité de noter dans le formulaire.

C'est pour faire une 'tite limitation IP pour les notations. (contournables en changeant d'IP mais osef)

Et sinon en ajoutant les lignes de codes précédemment citées deux nouvelles erreurs apparaissent :
Warning: PDO::query() [pdo.query]: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'error' at line 1 in C:\wamp\www\blog\traitement_formulaire.php on line 12

Warning: PDO::query() [pdo.query]: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.0.1' at line 1 in C:\wamp\www\blog\traitement_formulaire.php on line 19
Je ne vois pas d'où peut provenir la seconde (la ligne 19 correspond au query ip_potentielles et je n'y mets pas de '0.1'.
Et la première vient apparemment d'une mauvaise syntaxe dans les lignes copiées !?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

07 déc. 2010, 01:50

hum a quoi correspondent ces ligne chez toi ?

dans le code fournit la ligne 12 y a rien, la ligne 19 c'est une affectation !
d'après ce que tu a fournis tu oublie que les chaine doivent être entourées de simple quote en SQL !!!

j'en remet une couche sur le
$ip_potentielles = $base_blog->query($ip_potentielles = $base_blog->query("SELECT ip_du_pseudo FROM commentaires WHERE id_article=$id_article AND ip_du_pseudo=$ip_du_visiteur");

la suite devrait être plus indiqué :
<?php
$sql = 'SELECT ip_du_pseudo FROM commentaires WHERE id_article='.$id_article.' AND ip_du_pseudo=\''.$ip_du_visiteur.'\'';
 $ip_potentielles = $base_blog->query($sql);
?>
pour ce qui est des ip, pas osef car tu empechera plusieurs personnes différentes derrière un même proxy de pouvoir répondre (cas d'entreprise université etc).

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 2 Messages

07 déc. 2010, 13:51

blabla productif !
Waw merci ! Tout ça pour une erreur aussi stupide :'). Moi qui cherchait des trucs beaucoup plus complexes que ça !

Un grand merci à toi !

devlop78
Invité n'ayant pas de compte PHPfrance

08 déc. 2010, 02:01

Oui j'ai posé la question car je ne pars pas du principe que je connais tout. Mais tu demandais à PDO d'exécuter un objet. J'ai pointé le doigt dessus pour que tu regardes par toi-même, c'est plus enrichissant que d'avoir une réponse toute faite. :)