IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

SQLSTATE[23000]: Integrity constraint violation


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Points : 460
    Points
    460
    Par défaut SQLSTATE[23000]: Integrity constraint violation
    Bonjour,
    J'ai défini un champ de ma table users "email" à UNIQUE KEY `email` (`email`). Une fois qu'une adresse email est enregistrée, lors d'un nouvel enregistrement et que la meme adresse revient, j'ai cette erreur :
    SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'okoweb@yahoo.fr' for key 'email'
    Comment peut-on gérer cette erreur en PHP?

    Merci d'avance...

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    regarder si l’émail existe

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    regarder si l’émail existe
    Oui merci, je pensais qu'il était possible de récupérer et de gérer correctement ce retour que de faire un test d'email dans la bdd avant l'insertion. Cela fait un double appel de Mysql. Or en gérant juste ce retour, on aurait juste une seule sollicitation de la bdd.

    Merci d'avance...

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Sinon tu peux également gérer le retour d'erreur et agir en fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if($sql->execute())
    {
        //Insertion OK
    }
    else
    {
        $error = $sql->errorInfo();
        //Vérifier code erreur
    }
    Une duplicate entry ayant le code de retour 1062 tu devrais pouvoir le gérer assez simplement.

    voir : http://php.net/manual/fr/pdo.error-handling.php
    http://www.php.net/manual/fr/pdo.errorinfo.php
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par okoweb Voir le message
    Oui merci, je pensais qu'il était possible de récupérer et de gérer correctement ce retour que de faire un test d'email dans la bdd avant l'insertion. Cela fait un double appel de Mysql. Or en gérant juste ce retour, on aurait juste une seule sollicitation de la bdd.

    Merci d'avance...
    tu peux très bien faire ça, mais je vois pas ou est ton soucis ducoup

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Points : 460
    Points
    460
    Par défaut
    J'ai vu un truc de ce genre quelque part :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    // Gestion des doublons
    } else {
     
    	// Changement de nom de variable (plus lisible)
    	$erreur =& $id_utilisateur;
     
    	// On vérifie que l'erreur concerne bien un doublon
    	if (23000 == $erreur[0]) { // Le code d'erreur 23000 siginife "doublon" dans le standard ANSI SQL
     
    		preg_match("`Duplicate entry '(.+)' for key \d+`is", $erreur[2], $valeur_probleme);
    		$valeur_probleme = $valeur_probleme[1];
     
    		if ($nom_utilisateur == $valeur_probleme) {
     
    			$erreurs_inscription[] = "Ce nom d'utilisateur est déjà utilisé.";
     
    		} else if ($adresse_email == $valeur_probleme) {
     
    			$erreurs_inscription[] = "Cette adresse e-mail est déjà utilisée.";
     
    		} else {
     
    			$erreurs_inscription[] = "Erreur ajout SQL : doublon non identifié présent dans la base de données.";
    		}
     
    	} else {
     
    		$erreurs_inscription[] = sprintf("Erreur ajout SQL : cas non traité (SQLSTATE = %d).", $erreur[0]);
    	}
     
    	// On reaffiche le formulaire d'inscription
    	include CHEMIN_VUE.'formulaire_inscription.php';
    }
    Quand dites vous?

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Points : 460
    Points
    460
    Par défaut
    Voici le code de ma fonction, y'a t-il une erreur?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function insertUser($pasword, $firstname, $lastname, $email, $tel, $type, $administration, $service, $autorisation, $level_struc, $user_parent) {
    	global $db;
    	$sql = 'INSERT INTO users
    	              (pasword, firstname, lastname, email, tel, type, administration, 	service, autorisation, level_struc, user_parent, date_inscription) 
    								 VALUES (:pasword, :firstname, :lastname, :email, :tel, :type, :administration, 	:service, :autorisation, :level_struc, :user_parent, NOW())';	
    	$statement = $db->prepare($sql);	
      if($statement->execute(array(':pasword'=>$pasword, ':firstname'=>$firstname, ':lastname'=>$lastname, ':email'=>$email, ':tel'=>$tel, ':type'=>$type, ':administration'=>$administration, ':service'=>$service, ':autorisation'=>$autorisation, ':level_struc'=>$level_struc, ':user_parent'=>$user_parent))){
      		return $db->lastInsertId();
      }
    	else return $db->errorInfo();	  
    }

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/03/2013, 18h06
  2. Réponses: 2
    Dernier message: 14/08/2011, 14h25
  3. Réponses: 9
    Dernier message: 24/04/2011, 17h03
  4. Réponses: 3
    Dernier message: 04/03/2011, 09h30
  5. Réponses: 7
    Dernier message: 29/11/2010, 17h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo