Question sur les formulaires

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Question sur les formulaires

Re: Question sur les formulaires

par AB » 28 janv. 2015, 16:17

Salut,

Pour qu'un bloc try/catch fonctionne correctement sur une requête sql, il faut déclarer le mode exception soit dans ta connexion soit au cas par cas avec setAttribute
<?php
//...

$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


$sql = "INSERT INTO `membres` (pseudo, password, email, sexe, question, reponse, groupe)
                                VALUES (?, ?, ?, ?, ?, ?, ?) ";

$erreur = null;

try { // ON ESSAYE D'INSERER LES INFOS DANS LA BDD.

$req = $bdd->prepare($sql);
$req->execute(array($pseudo, sha1($pass), $email, $sexe, $question, $reponse, 1 ));

$_SESSION['membre'] = $pseudo;
header('Location:membres.php?inscription=1');
exit;
}
catch(PDOException $e)
{
	// En développement, on affiche l'erreur et on sort
	// exit('Erreur : '.$e->getMessage());

        // En production on affiche un message plus vague pour ne pas renseigner d'éventuels pirates
        $erreur = "Erreur dans la requête d'insertion";
}
?>
<!DOCTYPE html>
<html lang="fr">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Titre</title>
</head>
<body>
<div>
<?= isset($erreur)? $erreur : ''?>
</div>
</body>
</html>
Donc sur le principe, dès qu'une erreur se produit dans le bloc try, le script s'arrête et va directement dans le bloc catch. La variable de session sera donc déclarée uniquement s'il n'y a pas d'erreur d'insertion, et de même pour le header de redirection qui suit.

EDIT : J'avais pas vu la réponse de Genova...

Re: Question sur les formulaires

par Genova » 28 janv. 2015, 15:57

Non il ne faut surtout pas compter le nombre de lignes affectées. Ce qu'il faut c'est gérer l'erreur, parce que si votre requête SQL plante c'est qu'il y a un gros soucis, et que la suite du script ne doit pas continuer à s'exécuter.

Dans un premier temps il faut activer les erreurs comme ceci (cette ligne est indispensable, car par défaut PDO ne lève pas d'exception pour les erreurs de requête) :
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Vous placez cette ligne juste après la création de votre objet PDO ($bdd = new PDO(...)).

Ensuite vous gérez les erreurs comme ceci :
try
{
    $req = $bdd->prepare("INSERT INTO `membres` (pseudo, password, email, sexe, question, reponse, groupe)
                                VALUES (?, ?, ?, ?, ?, ?, ?) ");
    $req->execute(array($pseudo, sha1($pass), $email, $sexe, $question, $reponse, 1 ));
}
catch (PDOException $e)
{
    echo 'Erreur SQL : ' . $e->getMessage();
    exit;
}
Informations complémentaires : http://php.net/manual/fr/pdo.error-handling.php

Re: Question sur les formulaires

par tof73 » 28 janv. 2015, 15:17

Re: Question sur les formulaires

par sirakawa » 28 janv. 2015, 10:22

Bjr,
Il existe aussi exec (cf http://php.net/manual/fr/pdo.exec.php) qui rend le nombre de lignes affectéesnlors de l'exécution de la requête...

Question sur les formulaires

par deediezi » 28 janv. 2015, 02:56

Bonsoir ! J'ai fais une page d'inscription, voici le code final (qui insère les données dans la base de données).
		
// ON PREPARE LES DONNEES A INSERER DANS LA BDD
$req = $bdd->prepare("INSERT INTO `membres` (pseudo, password, email, sexe, question, reponse, groupe)
				VALUES (?, ?, ?, ?, ?, ?, ?) ");

try { // ON ESSAYE D'INSERER LES INFOS DANS LA BDD.

$req->execute(array($pseudo, sha1($pass), $email, $sexe, $question, $reponse, 1 ));

}
Maintenant ma question est :

J'aimerai créer une session, UNIQUEMENT si l'insertion dans la base de données à bien été effectué (Oui, imaginez un peu que sa foire, mais que la session soit quand même crée! Hé bien moi, j'aurai bien l'air c** :D)

Je me suis dis qu'avec un Try, il y aurai peut être moyen de faire un truc .. mais je viens de remarquer que je n'ai aucune idée de comment l'utiliser ! C'est pour sa que je me tourne vers vous !

Merci de vos réponses :)

EDIT :

Sinon, comme sa, sa le fait pas ? ... En tout cas, grâce à se code vous aurez peut être une meilleur idée de se que je veux faire ^^.
// ON PREPARE LES DONNEES A INSERER DANS LA BDD
$req = $bdd->prepare("INSERT INTO `membres` (pseudo, password, email, sexe, question, reponse, groupe)
									VALUES (?, ?, ?, ?, ?, ?, ?) ");
				
// ON INSERE LES DONNEES
$req->execute(array($pseudo, sha1($pass), $email, $sexe, $question, $reponse, 1 ));

if (isset($req)) {

$req2 = $bdd->query('SELECT * FROM membres');
$row2 = $req2->fetch(PDO::FETCH_ASSOC);
$_SESSION['membre'] = $row2;
header('Location:membres.php?inscription=1');
}