Bonjour,

Suite aux réponses que j'ai reçu dans un de mes dernier posts.

J'ai compris que je devais tester si la fonction execute vaut true (lors de l'envoi d'un formulaire).

J'ai donc essayer.
Mais j'ai le droit à une erreur, en gros elle dit que la fonction execute n'est pas défini à la ligne 20 (Correspondant à l'endroit ou je teste si elle vaut true ou false).

Je vous montre l'intégralité de mon code car je pense que le problème ne vient pas spécialement de la ligne 20

<?php
require 'cnx.php';
if(!empty($_POST)){ //Si les variables POST ne sont pas vide on continue

//Récupération des données depuis le formulaire
$lastname = $_POST['lastname'];
$firstname = $_POST['firstname'];
$nickname = $_POST['nickname'];
$email = $_POST['email'];
$password = sha1($_POST['password']);

//Insertion des données dans la bdd
$q = array('lastname' => $lastname, 'firstname' => $firstname, 'nickname' => $nickname, 'email' => $email, 'password' => $password);
$sql = 'INSERT INTO users (lastname, firstname, nickname, email, password) VALUES (:lastname, :firstname, :nickname, :email, :password)';
$req = $cnx->prepare($sql);
$req->execute($q);

}else{//Sinon on ne fait rien. 
}

//L'insertion s'est-elle bien dérouler ?
if($req -> execute($q)){
header('Location:index.php'); //Oui, on redirige vers la page de connnexion. 
}else{ 
header('Location:404.php'); //Non, on redirige vers la page d'erreur. 
}

?>

18 réponses


Lartak
Réponse acceptée

Il te suffit de faire comme ceci :

//Insertion des données dans la bdd
$q = array('lastname' => $lastname, 'firstname' => $firstname, 'nickname' => $nickname, 'email' => $email, 'password' => $password);
$sql = 'INSERT INTO users (lastname, firstname, nickname, email, password) VALUES (:lastname, :firstname, :nickname, :email, :password)';
$req = $cnx->prepare($sql);
if ($req->execute($q)) { // Changement ici.
    header('Location: index.php');
} else {
    header('Location: 404.php');
}
Laznet
Auteur

J'ai fais une petite modification, et l'erreur à changer

if($req=$cnx->execute($q)){
header('Location:index.php'); //Oui, on redirige vers la page de connnexion. 
}else{ 
header('Location:404.php'); //Non, on redirige vers la page d'erreur. 
}

L'erreur :

Call to undefined method PDO::execute()

Bonsoir Mika445
1) La méthode execute s'applique à l'objet statement et pas à la connection.
2) Tu as oublié les ':' devant chaque paramètre
3) englobes tes requêtes par des try/catch pour voir les erreurs

Laznet
Auteur

" 1) La méthode execute s'applique à l'objet statement et pas à la connection."

Pourrais-tu être plus précis ?

Tu l'as pourtant bien fait dans ton premier code

$req = $cnx->prepare($sql);
$req->execute($q);

le statement c'est ce que tu nommes $req

Laznet
Auteur

"Tu l'as pourtant bien fait dans ton premier code"

J'ai ré-utiliser un code fait depuis un tuto de Graf' sur les espace membres.

ta petite modification devrait ressembler à ça

if($req->execute($q)){
    header('Location:index.php'); //Oui, on redirige vers la page de connnexion. 
}else{ 
    header('Location:404.php'); //Non, on redirige vers la page d'erreur. 
}
Laznet
Auteur

C'est un véritable casse tête.
Car avec le code de test (celui pour savoir si elle vaut true ou false) on me dit que req n'est pas défini.
Et quand j'isole le code avec des commentaires, je n'ai plus ces erreurs.

Si ton $req n'est pas défini, c'est que tu passes par l'autre branche du if
c-a-d que ton $_POST est empty
fait un var_dump($_POST) pour en être sûr

Laznet
Auteur

Bah c'est normal, car au début de mon code je défini une condition :
Si les POST ne sont pas vide on continu le code. Sinon rien.

J'ai fais ça pour éviter les erreurs du genre "Le champ email n'est pas défini".
Et oui le var_dump me retourne bien un "Empty".

EDIT :

J'ai remplacer le empty par un isset et j'ai (comme prévu. Bizarrement) le droit à ça (Une erreur par donnée email, nickname etc..) :

Undefined index: password

vérifie bien que dans le formulaire de saisie, chaque input doit avoir un attribut name, c'est la valeur de cet attribut qu'on retrouve comme index du tableau $_POST
par exemple

<input type="text" name="firstname" >

vérifie aussi que ton form a bien la method="POST"

Laznet
Auteur
  • Vérifie bien que dans le formulaire de saisie, chaque input doit avoir un attribut name - Valider
  • Vérifie aussi quand ton form a bien la method POST. - Valider
<form action="register.php" method="POST">
<input type="text" name="lastname" class="input" placeholder="Nom :">
    <br>
<input type="text" name="firstname" class="input" placeholder="Prénom:">
    <br>
<input type="text" name="nickname" class="input" placeholder="Nom d'utilisateur :">
    <br>
<input type="email" name="email" class="input" placeholder="E-mail :">
    <br>
<input type="password" name="password" class="input" placeholder="Mot de passe :">
    <br>
<input type="submit" value="Inscription" class="submitform">
</form> 

Le formulaire m'a l'air correct
montre nous la partie (les lignes) qui bugguent

Laznet
Auteur

Bah, en faite au dessus du formulaire c'est que de l'HTML (rien à voir donc). Et sinon j'ai poster la totalité de mon code PHP.

Laznet
Auteur

@Lartak,
Merci, mon code fonctionne !
J'essaye de comprendre ce qui a changer dans le code pour que ça fonctionne.
Si je ne trompe pas, ce qui posait problème c'est le else en dessous de la toute première condition.

La condition "Ou sinon on ne fait rien".

//Insertion des données dans la bdd
$q = array('lastname' => $lastname, 'firstname' => $firstname, 'nickname' => $nickname, 'email' => $email, 'password' => $password);
$sql = 'INSERT INTO users (lastname, firstname, nickname, email, password) VALUES (:lastname, :firstname, :nickname, :email, :password)';
$req = $cnx->prepare($sql);
$req->execute($q);

}else{//Sinon on ne fait rien. 
}

Rien n'a changé, ton pb venait du $_POST qui ne contenait pas les valeurs.
dis nous comment tu procèdes
Vérifie aussi ce que ton formulaire envoie, en utilisant les outils developpeur (F12) , c'est très pratique

Laznet
Auteur

Sauf que vu les erreurs recouvrait ma page je n'avais pas accès au formulaire.
Donc c'était une boucle sans fin en quelque sorte.
Pas de value > Rien à envoyer > Blocage du code en attendant qu'il y est des valeurs > Blocage du formulaire à cause des erreurs > Pas de value.

Laznet
Auteur

Mais oui tu as raison Huggy, l'outil de développement aurait-pu m'aider ^^.