Erreur requête MySQL

Petit nouveau ! | 8 Messages

14 nov. 2010, 13:46

J'ai un petit problème, que je n'arrive pas à résoudre.
En fait je voudrais avant inscription d'un nouveau pseudo dans une base de donnée, vérifier que celui-ci est libre.
Petit pépin, lorsque j'ouvre ma base et tente de vérifier que parmi tous les pseudo existants, aucuns n'est égal à celui entré par l'utilisateur, il m'affiche un message d'erreur tel celui-ci:
Fatal error: Call to a member function execute() on a non-object in E:\wamp\www\PHP Test\test.php on line 14
Avec un petit "or die(print_r($bdd->errorInfo()))" le message devient:
Array ( [0] => 42000 [1] => 1064 [2] => 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 '?' at line 1 ) 1
Je vous ai donc copié ici l'entité de mon code.
J’espère que vous pourrez m'aider à trouver l'erreur ..


Code : Tout sélectionner

<?php try { $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', ''); } catch(Exception $e) { die('Erreur : '.$e->getMessage()); } $Pseudo=$_POST['Pseudo']; $disp=0; //L'ERREUR SE TROUVE ICI $reponse = $bdd->query('SELECT Nom FROM inscription WHERE Nom=?'); $req->execute(array($_POST['Pseudo'])); while ($donnees = $reponse->fetch()) { $disp = $disp + 1; } if ($disp = 0) { $req = $bdd->prepare('INSERT INTO inscription(Nom) VALUES(:Nom)'); $req->execute(array( 'Nom' => $Pseudo )); } $reponse->closeCursor(); } ?>
Et là voici la partie html .. sans importance car ça je pense ne pas trop y avoir fais d'erreurs.

Code : Tout sélectionner

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" > <head> <title>Bienvenue sur mon site !</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> </head> <body> <form method="POST" action="test.php"> <span> Pseudo:<span/><br/> <input type="text" name="Pseudo"/><br/> <input type="reset" name="Reset" /> <input type="submit" name="Inscription" value="Inscription" /><br/> <?php if ($disp = 0) { echo 'Inscription validée'; } else { echo 'Pseudo déjà utilisé'; } ?> </form> </body> </html>

Invité
Invité n'ayant pas de compte PHPfrance

14 nov. 2010, 14:38

salut,

sans importance le html ? ??? tu as oublié les 'value' dans tes input :D
a+

ViPHP
ViPHP | 5462 Messages

14 nov. 2010, 20:40


Petit nouveau ! | 8 Messages

14 nov. 2010, 21:43

Je vais passer voir ces deux choses .. (quelle erreur de naze !)

ViPHP
ViPHP | 2291 Messages

15 nov. 2010, 00:41

Salut,

Ceci n'est pas juste
'Nom' => $Pseudo
Correction
':Nom' => $Pseudo
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

ViPHP
ViPHP | 5462 Messages

15 nov. 2010, 00:45

Salut,

Ceci n'est pas juste
'Nom' => $Pseudo
Correction
':Nom' => $Pseudo
non non les deux façons sont corrects :wink:

Eléphant du PHP | 74 Messages

15 nov. 2010, 14:45

Enfin tout ceci ne doit pas bcp aider voblivion .

Le message d'erreur indique que tu utilises une méthode d'un objet qui n'existe pas : Call to a member function execute() on a non-object

et en effet l'objet $req à mon avis n'est pas un objet :

Code : Tout sélectionner

$req->execute(array($_POST['Pseudo']));
ne serait ce pas plutot $bdd qu'il faut utiliser ? (ne connaissait pas du tout PDO)

Code : Tout sélectionner

$bdd->execute(array($_POST['Pseudo']));
Pierre.
Mon projet opensource de gestion de Devis, Commandes, Factures, pour TPE : OpenDCF : http://opendcf.1g6.biz

ViPHP
ViPHP | 5462 Messages

15 nov. 2010, 14:48

Enfin tout ceci ne doit pas bcp aider voblivion .

Le message d'erreur indique que tu utilises une méthode d'un objet qui n'existe pas : Call to a member function execute() on a non-object

et en effet l'objet $req à mon avis n'est pas un objet :

Code : Tout sélectionner

$req->execute(array($_POST['Pseudo']));
ne serait ce pas plutot $bdd qu'il faut utiliser ? (ne connaissait pas du tout PDO)

Code : Tout sélectionner

$bdd->execute(array($_POST['Pseudo']));
Pierre.
ca l'aide pas non plus t'en qu'il a pas activer les erreurs comme je lui ai dis...

Eléphant du PHP | 74 Messages

15 nov. 2010, 14:51


ca l'aide pas non plus t'en qu'il a pas activer les erreurs comme je lui ai dis...
Mais l'erreur ne viens pas de PDO, l'erreur vient de PHP lui même, l'utilisation d'un objet qui n'existe pas. En quoi l'affichage des erreurs PDO pourrait t'il être utile étant donnée que PDO n'est même pas appelé :roll:
Mon projet opensource de gestion de Devis, Commandes, Factures, pour TPE : OpenDCF : http://opendcf.1g6.biz

ViPHP
ViPHP | 5462 Messages

15 nov. 2010, 14:55


ca l'aide pas non plus t'en qu'il a pas activer les erreurs comme je lui ai dis...
Mais l'erreur ne viens pas de PDO, l'erreur vient de PHP lui même, l'utilisation d'un objet qui n'existe pas. En quoi l'affichage des erreurs PDO pourrait t'il être utile étant donnée que PDO n'est même pas appelé :roll:
si la requete ne fonctionne pas PDO renvoie false a la place d'un PDOStatement, sauf que lui ne sais pas qu'il renvoie false puisqu'il na pas activé les erreurs.

Petit nouveau ! | 8 Messages

17 nov. 2010, 21:22

Un grand merci pour vos réponses ..

J'ajouterais donc:
>> J'ai beau eu cherché, je n'ais pas trouvé comment activer les erreurs u-u
>>remplacer req par bdd n'a rien changé ..
Je continu donc à chercher .. si vous avez d'autres idées ..

ViPHP
ViPHP | 5462 Messages

17 nov. 2010, 21:25

pour les erreurs je t'ai mis le lien

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

17 nov. 2010, 22:00

salut,

dans le même sens ajoute un test sur $req
<?php
if ( $req === false) {
$err = $dbh->errorInfo();
echo $err(2];// <= message d'erreur
}
?> 
Il en faut peu pour être heureux ......

Petit nouveau ! | 8 Messages

19 nov. 2010, 16:42

Jai bien lu la partie appropriée à mon problème, à savoir celle-ci:
Extension : PDO

Gestion des erreurs avec l'attribut PDO::ATTR_ERRMODE

Options : PDO::ERRMODE_SILENT, PDO::ERRMODE_WARNING, PDO::ERRMODE_EXCEPTION
Défaut : PDO::ERRMODE_SILENT
Recommandé : PDO::ERRMODE_WARNING
Mais je ne sais pas ni comment ni où changer ERRMODE_SILENT (par défaut) en ERRMODE_WARNING ou EXCEPTION.

..

Je continu de chercher .. en fait j'ai basé mon code sur les exemples du siteduzéro .. c'est peut-être pour ça que je n'ai pas réussi à faire fonctionner $req. De ce que j'ai appris, c'est la variable créé pour contenir les données organisées grace à "execute" et provenants de $rep ..

Si jamais vous sauriez comment faire, auriez vous un code "type" qui permettrais de récupérer une colonne d'une table et de vérifier que le champs entré par l'utilisateur n'est jamais égal à l'une de ces colonnes ?

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

19 nov. 2010, 16:55

yop

je suppose que tu parle de http://www.siteduzero.com/tutoriel-3-34 ... x-bdd.html ?
exemple de connexion au sgbd :
/!\ Attention tu doit modifier les infos de connexion PDO pour que cela correspondent à ton SGBD (utilisateur, mdp, host )etc
try {
    $dbh = new PDO("pgsql:dbname=test_base;host=192.168.56.101", 'postgres', md5('tipounet'));
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING); //affichage des erreurs
} catch (Exception $e) {
    echo 'Erreur : ' . $e->getMessage() . '<br />';
    echo 'N° : ' . $e->getCode();
}
pour les requêtes c'est indiqué dans le 1er lien.

pour savoir si une valeur existe dans une colonne (par exemple)

select count(clefprimaire) as nb from table where champ='valeur entrée par l utilisateur';

le résultat de la requête de fournira (avec l'exemple du sdz) $data->nb qui contiendra le nombre de fois que tu a l'info fournit par l'utilisateur. si == 0 ta condition est vrai si non rejet !

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