2010-11-24 3 views
0

Je reçois l'erreur suivante:Pourquoi j'obtiens une erreur d'entrée en double lorsqu'il n'y a pas d'entrée en double?

Duplicate entry 'ahamzaoui_v2' for key 'Username' in /opt/lampp/htdocs/webEchange/SiteWeb_V5/dupliquerCompte2.php on line 135 

lors de l'exécution d'un script php. Je l'ai essayé plusieurs fois mais je ne sais pas pourquoi je reçois cette erreur. Voici le code autour de la ligne 135:

$sql = "UPDATE utilisateur SET Username = '" . mysql_real_escape_string($infos['Username']) . "2', MotDePasse = '" . mysql_real_escape_string($infos['MotDePasse']) . "2' WHERE Matricule = " . $infos['Matricule']; 

line 135 -> if(mysql_query($sql)) 

comme vous pouvez le voir, je suis en train d'ajouter un 2 à la valeur existante pour nom d'utilisateur. Voici ce que je ne comprends pas. Si je vais jeter un oeil à la table des utilisateurs, je ne trouve aucune entrée avec la valeur ahamzaoui_v2.Ensuite, j'essaie d'exécuter le script, et j'obtiens l'erreur! La chose amusante est, après l'exécution du script (et signalé une erreur), la valeur est modifiée! J'ai maintenant ahamzaoui_v2 au lieu de ahamzaoui_v. Le problème est que le REST du script n'est pas exécuté donc je reçois seulement une partie de ce que je veux (une petite partie). En dehors d'une instruction SELECT, c'est la première requête que je lance, donc je ne vois vraiment pas comment il peut y avoir une entrée en double, d'autant plus que je viens de vérifier cela auparavant.

à la lecture this thread, je tryed courir vérifier la table Utilisateur, mais il a révélé aucune erreur que ce soit ..

BTW, si je lance plusieurs fois le script dans une rangée, je reçois toujours l'erreur, et les extrémités de nom d'utilisateur avec beaucoup de 2 ajoutés (ahamzaoui_v222)

Répondre

0

La table en question a-t-elle une contrainte d'unicité sur la colonne username? Avez-vous vérifié s'il existe des valeurs dupliquées du même nom dans le tableau $ infos sur votre itération de mise à jour - des valeurs en double qui n'étaient pas présentes dans la base de données après avoir effectué un certain type de manipulation de chaînes en php? En dehors d'une base de données corrompue ou d'un index de clé, je ne peux penser qu'à une autre chose: le champ Matricule est-il unique à

+0

nom d'utilisateur est unique, oui. comme pour le tableau $ info, je l'utilise comme ceci: $ infos = mysql_query ($ sqlCopier); if ($ infos) {if (mysql_num_rows ($ infos)> 0) {$ infos = mysql_fetch_array ($ infos); Aucune manipulation de chaîne PHP. – Shawn

2

? Est-ce que SELECT * FROM utilisateur WHERE Matricule = '{$infos['Matricule']}' renvoie plus d'une ligne? Dans ce cas, la déclaration UPDATE changera la première ligne apparié (d'où le changement de données), mais mises à jour les lignes suivantes échouera et générer un avertissement (arrêter l'exécution du script):

mysql> create table test (a INT UNIQUE, b INT); 
Query OK, 0 rows affected (0.10 sec) 

mysql> insert into test VALUES (NULL, 2); 
Query OK, 1 row affected (0.03 sec) 

mysql> insert into test VALUES (NULL, 2); 
Query OK, 1 row affected (0.00 sec) 

mysql> update test set a = 1 where b = 2; 
ERROR 1062 (23000): Duplicate entry '1' for key 'a' 
mysql> select * from test; 
+------+------+ 
| a | b | 
+------+------+ 
| 1 | 2 | 
| NULL | 2 | 
+------+------+ 
2 rows in set (0.00 sec) 
+0

Matricule est la clé primaire en fait. Je suis sûr que c'est unique. Et je sais pertinemment que mon instruction SELECT ne retourne pas plusieurs lignes (j'ai essayé d'imprimer les résultats) – Shawn

+0

Modifiez le script pour sortir l'instruction 'UPDATE' mais ne l'exécutez pas. Au lieu de cela, copiez et collez l'instruction dans la console MySQL ou PHPMyAdmin - ceci devrait retourner le nombre de lignes trouvées et le nombre de lignes affectées, les deux devraient être '1' si le nom d'utilisateur est unique avec une recherche par la clé primaire. Si vous obtenez la même erreur avec la console MySQL/PHPMyAdmin, il y a un problème avec la table de la base de données. S'il n'y a pas d'erreur dans la console, il y a un problème avec votre script. – leepowers