Question sur les formulaires

Avatar du membre
Eléphanteau du PHP | 25 Messages

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');
}

Mammouth du PHP | 2278 Messages

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...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Mammouth du PHP | 688 Messages

28 janv. 2015, 15:17


ViPHP
ViPHP | 928 Messages

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

ViPHP
AB
ViPHP | 5818 Messages

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...