Fatal error: Uncaught exception 'PDOException'
                                    
                        Jhon                    
                                    -
                                     
jordane45 Messages postés 40050 Statut Modérateur -
        jordane45 Messages postés 40050 Statut Modérateur -
        Bonjour, 
Je cherche a faire une requete pour vérifier qu'un pseudo n'est pas déja pris mais il m envoi un e erreur
( ! ) Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicata du champ 'Jhon Macalister' pour la clef 'pseudo'' in C:\wamp\www\inscription.php on line 30
voici mon code
<?php
session_start();
include('database.php');
if(isset($_POST['submit'])){
if(!empty($_POST['pseudo']) AND !empty($_POST['mail']) AND !empty($_POST['mdp']) AND !empty($_POST['mdp2']))
{
$pseudo = htmlspecialchars($_POST['pseudo']);
$mail = htmlspecialchars($_POST['mail']);
$mdp = sha1($_POST['mdp']);
$mdp2 = sha1($_POST['mdp2']);
if($mdp == $mdp2)
{
$reqpseudo = $bdd->prepare("SELECT * FROM membre WHERE pseudo = ?");
$reqpseudo->execute(array($mail));
$pseudoexist = $reqpseudo->rowCount();
if($pseudoexist == 0)
{
}else
{
$erreur = 'Ce pseudo est déja utilisé';
}
if(filter_var($mail, FILTER_VALIDATE_EMAIL))
{
						
$insertmbr = $bdd->prepare("INSERT INTO membre(pseudo, email, password) VALUES(?, ?, ?)");
$insertmbr->execute(array($pseudo, $mail, $mdp));
header('Location: connexion.php');
}else
{
$erreur = 'Votre adrese mail n\'est pas valide';
}
}else
{
$erreur = 'Vos mots de pase ne corepondent pas' ;
}
}else
{
$erreur = "Merci de remplir tous les champs";
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Inscription</title>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="css/inscription.css">
</head>
<body>
<div class="page">
<h1>INSCRIPTION</h1>
<form action="" method="POST">
<table align="center">
<td align="right">
<label for="pseudo">
pseudo :
</label>
</td>
<td>
<input type="text" name="pseudo" id="pseudo" placeholder="Votre pseudo">
</td>
<tr />
<td align="right">
<label for="mail">
E-mail :
</label>
</td>
<td>
<input type="email" name="mail" id="mail" placeholder="Votre mail">
</td>
<tr />
<td align="right">
<label for="mdp">
mot de passe :
</label>
</td>
<td>
<input type="password" name="mdp" id="mdp" placeholder="Votre mot de passe">
</td>
<tr />
<td align="right">
<label for="mdp2">
confirmez mot de passe
</label>
</td>
<td>
<input type="password" name="mdp2" id="mdp2" placeholder="confirmez mot de passe">
</td>
<tr />
<td></td>
<td align="center">
<input type="submit" name="submit" value="envoyer">
</td>
</table>
</form>
<a href="connexion.php">J'ai déja un compte</a>
<?php if(isset($erreur)){echo $erreur;} ?>
</div>
</body>
</html>
                
            
                
    
    
    
        Je cherche a faire une requete pour vérifier qu'un pseudo n'est pas déja pris mais il m envoi un e erreur
( ! ) Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicata du champ 'Jhon Macalister' pour la clef 'pseudo'' in C:\wamp\www\inscription.php on line 30
voici mon code
<?php
session_start();
include('database.php');
if(isset($_POST['submit'])){
if(!empty($_POST['pseudo']) AND !empty($_POST['mail']) AND !empty($_POST['mdp']) AND !empty($_POST['mdp2']))
{
$pseudo = htmlspecialchars($_POST['pseudo']);
$mail = htmlspecialchars($_POST['mail']);
$mdp = sha1($_POST['mdp']);
$mdp2 = sha1($_POST['mdp2']);
if($mdp == $mdp2)
{
$reqpseudo = $bdd->prepare("SELECT * FROM membre WHERE pseudo = ?");
$reqpseudo->execute(array($mail));
$pseudoexist = $reqpseudo->rowCount();
if($pseudoexist == 0)
{
}else
{
$erreur = 'Ce pseudo est déja utilisé';
}
if(filter_var($mail, FILTER_VALIDATE_EMAIL))
{
$insertmbr = $bdd->prepare("INSERT INTO membre(pseudo, email, password) VALUES(?, ?, ?)");
$insertmbr->execute(array($pseudo, $mail, $mdp));
header('Location: connexion.php');
}else
{
$erreur = 'Votre adrese mail n\'est pas valide';
}
}else
{
$erreur = 'Vos mots de pase ne corepondent pas' ;
}
}else
{
$erreur = "Merci de remplir tous les champs";
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Inscription</title>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="css/inscription.css">
</head>
<body>
<div class="page">
<h1>INSCRIPTION</h1>
<form action="" method="POST">
<table align="center">
<td align="right">
<label for="pseudo">
pseudo :
</label>
</td>
<td>
<input type="text" name="pseudo" id="pseudo" placeholder="Votre pseudo">
</td>
<tr />
<td align="right">
<label for="mail">
E-mail :
</label>
</td>
<td>
<input type="email" name="mail" id="mail" placeholder="Votre mail">
</td>
<tr />
<td align="right">
<label for="mdp">
mot de passe :
</label>
</td>
<td>
<input type="password" name="mdp" id="mdp" placeholder="Votre mot de passe">
</td>
<tr />
<td align="right">
<label for="mdp2">
confirmez mot de passe
</label>
</td>
<td>
<input type="password" name="mdp2" id="mdp2" placeholder="confirmez mot de passe">
</td>
<tr />
<td></td>
<td align="center">
<input type="submit" name="submit" value="envoyer">
</td>
</table>
</form>
<a href="connexion.php">J'ai déja un compte</a>
<?php if(isset($erreur)){echo $erreur;} ?>
</div>
</body>
</html>
        A voir également:         
- Fatal error: Uncaught exception 'PDOException'
- Fan error lenovo - Forum Refroidissement
- Cmos checksum error ✓ - Forum Carte-mère/mémoire
- Error 1962 ✓ - Forum PC fixe
- Bad request error 403 paiement ✓ - Forum Réseaux sociaux
- Whea error occt - Forum Processeur
2 réponses
                        
                    Bonjour,
Déjà.. pour poster du code sur le forum, merci de le faire en utilisant les balises de code
https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code
Ensuite, pense à activer la gestion des erreurs PDO ainsi que les erreurs PHP.
Puis niveau organisation de ton code, commence par récupérer PROPREMENT les variables AVANT de les utiliser
et enfin.. rowCount ne s'utilise pas pour les requêtes SELECT.
A la place on fera un COUNT sur un fetchAll
Je t'invite vivement à lire (et à appliquer !) ceci
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
et ça :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code
Ce qui donne un truc du genre :
PS: Au passage... on n'utilise plus le SHA1 pour "cryper" les password.
A la place on va utiliser la fonction password_hash....
http://php.net/manual/fr/function.password-hash.php
 
 
                
                
    
                Déjà.. pour poster du code sur le forum, merci de le faire en utilisant les balises de code
https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code
Ensuite, pense à activer la gestion des erreurs PDO ainsi que les erreurs PHP.
Puis niveau organisation de ton code, commence par récupérer PROPREMENT les variables AVANT de les utiliser
et enfin.. rowCount ne s'utilise pas pour les requêtes SELECT.
A la place on fera un COUNT sur un fetchAll
Je t'invite vivement à lire (et à appliquer !) ceci
https://forums.commentcamarche.net/forum/affich-37584941-php-pdo-gerer-les-erreurs
et ça :
https://forums.commentcamarche.net/forum/affich-37584947-php-gestion-des-erreurs-debogage-et-ecriture-du-code
Ce qui donne un truc du genre :
<?php
session_start();
//Affichage des erreurs PHP
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
//on inclus le fichier de connexion à la bdd
require_once 'database.php';
//Récupération PROPRE des variables AVANT de les utiliser
$pseudo = !empty($_POST['pseudo']) ? $_POST['pseudo'] ; NULL;
$mail = !empty($_POST['mail']) ? $_POST['mail'] ; NULL;
$mdp = !empty($_POST['mdp']) ? $_POST['mdp'] ; NULL;
$mdp2 = !empty($_POST['mdp2']) ? $_POST['mdp2'] ; NULL;
//début du traitement
if(isset($_POST['submit'])){
  if($pseudo &&  $mail &&  $mdp &&  $mdp2) {
    if($mdp == $mdp2) {
      //on verifie si le pseudo existe déjà
      $sql = "SELECT * FROM membre WHERE pseudo = ?";
      $datas = array($pseudo);
      try{
        $prep = $bdd->prepare($sql);
        $prep->execute($datas);
      }catch(Exception $e){
        echo "Erreur : ".$e->getMessage();
        die();
      }
      $user = $prep->fetchAll();
      $pseudoexist = count($user) >0 ? TRUE : FALSE ;
      if($pseudoexist){
        $erreur = 'Ce pseudo est déjà utilisé';    
      }else {       
        $mdp = sha1($_POST['mdp']);
        if(filter_var($mail, FILTER_VALIDATE_EMAIL)) {
          $sql ="INSERT INTO membre(pseudo, email, password) VALUES(?, ?, ?)";
          $datas = array($pseudo, $mail, $mdp);
          try{
            $prep = $bdd->prepare($sql);
            $insert = $prep->execute($datas);
            header('Location: connexion.php');
            exit();
          }catch(Exception $e){
            echo "Erreur : ".$e->getMessage();
            die();
          }  
        }else {
          $erreur = 'Votre adrese mail n\'est pas valide';
        } 
      }
    }else{
      $erreur = 'Vos mots de pase ne corepondent pas' ;
    }
  } else {
    $erreur = "Merci de remplir tous les champs";
  }
  
  if(!empty($erreur)){
    echo "<div class='error'>". $erreur ."</div>";
  }
  
}
?> 
PS: Au passage... on n'utilise plus le SHA1 pour "cryper" les password.
A la place on va utiliser la fonction password_hash....
http://php.net/manual/fr/function.password-hash.php
 
    
    
    
    
<?php
session_start();
include('database.php');
if(isset($_POST['submit'])){
if(!empty($_POST['pseudo']) AND !empty($_POST['mail']) AND !empty($_POST['mdp']) AND !empty($_POST['mdp2']))
{
$pseudo = htmlspecialchars($_POST['pseudo']);
$mail = htmlspecialchars($_POST['mail']);
$mdp = sha1($_POST['mdp']);
$mdp2 = sha1($_POST['mdp2']);
if($mdp == $mdp2)
{
if(filter_var($mail, FILTER_VALIDATE_EMAIL))
{
$insertmbr = $bdd->prepare("INSERT INTO membre(pseudo, email, password) VALUES(?, ?, ?)");
$insertmbr->execute(array($pseudo, $mail, $mdp));
header('Location: connexion.php');
$reqpseudo = $bdd->prepare("SELECT * FROM membre WHERE pseudo = ?");
$reqpseudo->execute(array($pseudo));
$pseudoexist = $reqpseudo->rowCount();
if($pseudoexist == 0)
{
}else
{
$erreur = 'Ce pseudo est déja utilisé';
}
}else
{
$erreur = 'Votre adrese mail n\'est pas valide';
}
}else
{
$erreur = 'Vos mots de pase ne corepondent pas' ;
}
}else
{
$erreur = "Merci de remplir tous les champs";
}
}
?>