INTEGER UNSIGNED AUTOINCREMEN

Eléphant du PHP | 88 Messages

08 févr. 2008, 22:20

Bonjour,

D'aprés un conseil que j'ai suivie afin que je puisse rendre un champs dans une table de ma base de donnée à valeur unique.

Comme ça je ne pourrair pas avoir 2 champs identifiant égaux, ou 2 champs code_membre égaux.

La requete que l'on ma conseillée est :

Code : Tout sélectionner

ALTER TABLE `inscription` CHANGE `identifiant` `identifiant` INTEGER UNSIGNED AUTO_INCREMENT
Mais elle affiche une erreur :

Code : Tout sélectionner

#1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key
Quelle est l'erreur ou comment faut-il faire afin que modifier le champs identifiant afin qu'il n'est que des valeurs différentes ?

Merci

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

ViPHP
ViPHP | 5924 Messages

08 févr. 2008, 22:27

Il faut faire un

Code : Tout sélectionner

ALTER TABLE `inscription` CHANGE `identifiant` `identifiant` INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY;
Mais il faut être conscient que ce sera un champ auto incrémenté, si tu veux simplement un champ unique et qui ne sera pas auto incrémenté, il faut faire ceci :

Code : Tout sélectionner

ALTER TABLE `inscription` ADD UNIQUE(`identifiant`);

Eléphant du PHP | 88 Messages

08 févr. 2008, 22:47

merci

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

09 févr. 2008, 02:02

Modération :
zaknaou, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 88 Messages

09 févr. 2008, 12:09

Non, en fait ce n'est pas résolu car quand je met + de 2 cchamps en unique certain ne sont pas pris en compte.

Je doit mettre 12 champs en UNIQUE mais le champs e-mail n'est pas pris en compte

En vérité seulement le champs identité et identifiant sont pris en compte (quand il y a deux fois la même valeur y a erreur) mais pour les autres il n'y a pas d'erreur...

VOICI a QUOI ressemble ma table :

Code : Tout sélectionner

CREATE TABLE `inscription` ( `identifiant` varchar(20) collate latin1_general_ci NOT NULL, `mot_de_passe` varchar(20) collate latin1_general_ci NOT NULL, `pseudo_forum` varchar(20) collate latin1_general_ci NOT NULL, `pseudo_chat` varchar(20) collate latin1_general_ci NOT NULL, `pseudo_blog` varchar(20) collate latin1_general_ci NOT NULL, `pseudo_article` varchar(20) collate latin1_general_ci NOT NULL, `question_secrete` varchar(30) collate latin1_general_ci NOT NULL, `reponse_secrete` varchar(30) collate latin1_general_ci NOT NULL, `date_heure_inscription` varchar(255) collate latin1_general_ci NOT NULL, `civilite` varchar(4) collate latin1_general_ci NOT NULL, `nom` varchar(20) collate latin1_general_ci NOT NULL, `prenom` varchar(20) collate latin1_general_ci NOT NULL, `jour` varchar(2) collate latin1_general_ci NOT NULL, `mois` varchar(9) collate latin1_general_ci NOT NULL, `annee` varchar(4) collate latin1_general_ci NOT NULL, `numero_rue_1` varchar(4) collate latin1_general_ci NOT NULL, `rue_1` varchar(90) collate latin1_general_ci NOT NULL, `code_postal_1` varchar(5) collate latin1_general_ci NOT NULL, `ville_1` varchar(90) collate latin1_general_ci NOT NULL, `pays_1` varchar(30) collate latin1_general_ci NOT NULL, `batiment_1` varchar(20) collate latin1_general_ci NOT NULL, `etage_1` varchar(4) collate latin1_general_ci NOT NULL, `porte_1` varchar(6) collate latin1_general_ci NOT NULL, `numero_rue_2` varchar(4) collate latin1_general_ci NOT NULL, `rue_2` varchar(90) collate latin1_general_ci NOT NULL, `code_postal_2` varchar(5) collate latin1_general_ci NOT NULL, `ville_2` varchar(90) collate latin1_general_ci NOT NULL, `pays_2` varchar(30) collate latin1_general_ci NOT NULL, `batiment_2` varchar(20) collate latin1_general_ci NOT NULL, `etage_2` varchar(4) collate latin1_general_ci NOT NULL, `porte_2` varchar(6) collate latin1_general_ci NOT NULL, `numero_rue_3` varchar(4) collate latin1_general_ci NOT NULL, `rue_3` varchar(90) collate latin1_general_ci NOT NULL, `code_postal_3` varchar(5) collate latin1_general_ci NOT NULL, `ville_3` varchar(90) collate latin1_general_ci NOT NULL, `pays_3` varchar(30) collate latin1_general_ci NOT NULL, `batiment_3` varchar(20) collate latin1_general_ci NOT NULL, `etage_3` varchar(4) collate latin1_general_ci NOT NULL, `porte_3` varchar(6) collate latin1_general_ci NOT NULL, `telephone_fixe_1` varchar(10) collate latin1_general_ci NOT NULL, `telephone_fixe_2` varchar(10) collate latin1_general_ci NOT NULL, `telephone_fixe_3` varchar(10) collate latin1_general_ci NOT NULL, `telephone_portable_1` varchar(10) collate latin1_general_ci NOT NULL, `telephone_portable_2` varchar(10) collate latin1_general_ci NOT NULL, `telephone_portable_3` varchar(10) collate latin1_general_ci NOT NULL, `email_1` varchar(90) collate latin1_general_ci NOT NULL, `email_2` varchar(90) collate latin1_general_ci NOT NULL, `email_3` varchar(90) collate latin1_general_ci NOT NULL, `site_1` varchar(100) collate latin1_general_ci NOT NULL, `site_2` varchar(100) collate latin1_general_ci NOT NULL, `site_3` varchar(100) collate latin1_general_ci NOT NULL, `site_4` varchar(100) collate latin1_general_ci NOT NULL, `site_5` varchar(100) collate latin1_general_ci NOT NULL, `loisir` longtext collate latin1_general_ci NOT NULL, `langue` longtext collate latin1_general_ci NOT NULL, `langage` longtext collate latin1_general_ci NOT NULL, `ip` varchar(255) collate latin1_general_ci NOT NULL, `identite` varchar(40) collate latin1_general_ci NOT NULL, `statut` varchar(255) collate latin1_general_ci NOT NULL, `code_membre` varchar(255) collate latin1_general_ci NOT NULL, `code_compte` varchar(255) collate latin1_general_ci NOT NULL, `etat` varchar(255) collate latin1_general_ci NOT NULL, `fin_activation` varchar(10) collate latin1_general_ci NOT NULL, UNIQUE KEY `identifiant` (`identifiant`,`pseudo_forum`,`pseudo_chat`,`pseudo_blog`,`pseudo_article`,`telephone_portable_1`,`telephone_portable_2`,`telephone_portable_3`,`email_1`,`email_2`,`email_3`,`identite`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci PACK_KEYS=0;
Cordialement zaknaou

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

09 févr. 2008, 13:05

Dans la structure de ta table, tu as défini 1 seul index unique portant sur 12 champs. Donc, cet index va interdire la présence de 2 enregistrements dont les 12 champs ont la même valeurs.

Si tu veux qu'un champ ne puisse avoir 2 fois la même valeur, il faut créer un index unique ne portant que sur ce champ.

Donc, si tu veux que chacun de tes 12 champs soient uniques, il te faut 12 index, chacun portant sur un champ.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 88 Messages

09 févr. 2008, 13:38

Merci, mais cette fois lorsque je fait :

Code : Tout sélectionner

CREATE TABLE `inscription` ( `identifiant` varchar(20) collate latin1_general_ci NOT NULL, `mot_de_passe` varchar(20) collate latin1_general_ci NOT NULL, `pseudo_forum` varchar(20) collate latin1_general_ci NOT NULL, `pseudo_chat` varchar(20) collate latin1_general_ci NOT NULL, `pseudo_blog` varchar(20) collate latin1_general_ci NOT NULL, `pseudo_article` varchar(20) collate latin1_general_ci NOT NULL, `question_secrete` varchar(30) collate latin1_general_ci NOT NULL, `reponse_secrete` varchar(30) collate latin1_general_ci NOT NULL, `date_heure_inscription` varchar(255) collate latin1_general_ci NOT NULL, `civilite` varchar(4) collate latin1_general_ci NOT NULL, `nom` varchar(20) collate latin1_general_ci NOT NULL, `prenom` varchar(20) collate latin1_general_ci NOT NULL, `jour` varchar(2) collate latin1_general_ci NOT NULL, `mois` varchar(9) collate latin1_general_ci NOT NULL, `annee` varchar(4) collate latin1_general_ci NOT NULL, `numero_rue_1` varchar(4) collate latin1_general_ci NOT NULL, `rue_1` varchar(90) collate latin1_general_ci NOT NULL, `code_postal_1` varchar(5) collate latin1_general_ci NOT NULL, `ville_1` varchar(90) collate latin1_general_ci NOT NULL, `pays_1` varchar(30) collate latin1_general_ci NOT NULL, `batiment_1` varchar(20) collate latin1_general_ci NOT NULL, `etage_1` varchar(4) collate latin1_general_ci NOT NULL, `porte_1` varchar(6) collate latin1_general_ci NOT NULL, `numero_rue_2` varchar(4) collate latin1_general_ci NOT NULL, `rue_2` varchar(90) collate latin1_general_ci NOT NULL, `code_postal_2` varchar(5) collate latin1_general_ci NOT NULL, `ville_2` varchar(90) collate latin1_general_ci NOT NULL, `pays_2` varchar(30) collate latin1_general_ci NOT NULL, `batiment_2` varchar(20) collate latin1_general_ci NOT NULL, `etage_2` varchar(4) collate latin1_general_ci NOT NULL, `porte_2` varchar(6) collate latin1_general_ci NOT NULL, `numero_rue_3` varchar(4) collate latin1_general_ci NOT NULL, `rue_3` varchar(90) collate latin1_general_ci NOT NULL, `code_postal_3` varchar(5) collate latin1_general_ci NOT NULL, `ville_3` varchar(90) collate latin1_general_ci NOT NULL, `pays_3` varchar(30) collate latin1_general_ci NOT NULL, `batiment_3` varchar(20) collate latin1_general_ci NOT NULL, `etage_3` varchar(4) collate latin1_general_ci NOT NULL, `porte_3` varchar(6) collate latin1_general_ci NOT NULL, `telephone_fixe_1` varchar(10) collate latin1_general_ci NOT NULL, `telephone_fixe_2` varchar(10) collate latin1_general_ci NOT NULL, `telephone_fixe_3` varchar(10) collate latin1_general_ci NOT NULL, `telephone_portable_1` varchar(10) collate latin1_general_ci NOT NULL, `telephone_portable_2` varchar(10) collate latin1_general_ci NOT NULL, `telephone_portable_3` varchar(10) collate latin1_general_ci NOT NULL, `email_1` varchar(90) collate latin1_general_ci NOT NULL, `email_2` varchar(90) collate latin1_general_ci NOT NULL, `email_3` varchar(90) collate latin1_general_ci NOT NULL, `site_1` varchar(100) collate latin1_general_ci NOT NULL, `site_2` varchar(100) collate latin1_general_ci NOT NULL, `site_3` varchar(100) collate latin1_general_ci NOT NULL, `site_4` varchar(100) collate latin1_general_ci NOT NULL, `site_5` varchar(100) collate latin1_general_ci NOT NULL, `loisir` longtext collate latin1_general_ci NOT NULL, `langue` longtext collate latin1_general_ci NOT NULL, `langage` longtext collate latin1_general_ci NOT NULL, `ip` varchar(255) collate latin1_general_ci NOT NULL, `identite` varchar(40) collate latin1_general_ci NOT NULL, `statut` varchar(255) collate latin1_general_ci NOT NULL, `code_membre` varchar(255) collate latin1_general_ci NOT NULL, `code_compte` varchar(255) collate latin1_general_ci NOT NULL, `etat` varchar(255) collate latin1_general_ci NOT NULL, `fin_activation` varchar(10) collate latin1_general_ci NOT NULL, UNIQUE KEY `identifiant` (`identifiant`), UNIQUE KEY `identite` (`identite`), UNIQUE KEY `email_1` (`email_1`), UNIQUE KEY `pseudo_forum` (`pseudo_forum`), UNIQUE KEY `pseudo_chat` (`pseudo_chat`), UNIQUE KEY `pseudo_blog` (`pseudo_blog`), UNIQUE KEY `pseudo_article` (`pseudo_article`), UNIQUE KEY `telephone_portable_1` (`telephone_portable_1`), UNIQUE KEY `telephone_portable_2` (`telephone_portable_2`), UNIQUE KEY `telephone_portable_3` (`telephone_portable_3`), UNIQUE KEY `email_2` (`email_2`), UNIQUE KEY `email_3` (`email_3`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci PACK_KEYS=0;
le champs identifiant affiche toujours une erreur.
Cordialement zaknaou

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

09 févr. 2008, 14:15

Et quelle est cette erreur ?

C'est incroyable que tu n'es toujours pas compris que l'erreur contient la solution pour résoudre cette erreur :evil:
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 88 Messages

09 févr. 2008, 14:31

Non l'erreur sa veut dire duplicate... il y a deux fois la même valeur dans le même champs (MAIS CE N'EST PAS VRAI) car j'ai vérifier dans la base de donnée il n'y a pas d'autres enregistrement ayant la même valeur au même champs.
Cordialement zaknaou

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

09 févr. 2008, 14:35

montre nous la requête et l'erreur ....

La prochaine fois, j'essaye en anglais
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 88 Messages

09 févr. 2008, 14:54

C'est assez difficile à vous présenter les deux car je génère les messages erreur moi même :
$sql_identifiant = "INSERT INTO inscription (identifiant) VALUES ('".$identifiant."')";
mysql_query($sql_identifiant) or die ('Code erreur 5496'.mysql_error());

	if($erreur_identifiant != "ON")
	{
		//-->> IDENTITE
		mysql_query("UPDATE inscription SET identite = '$identite' WHERE identifiant = '$identifiant'") or ($erreur_identite = "ON");
	
		//-->> CODE MEMBRE
		mysql_query("UPDATE inscription SET code_membre = '$code_membre' WHERE identifiant = '$identifiant'") or die ('51'.mysql_error());

		//-->> CODE COMPTE
		mysql_query("UPDATE inscription SET code_compte = '$code_compte' WHERE identifiant = '$identifiant'") or die ('52'.mysql_error());

		if($erreur_identite != "ON")
		{
						
			//-->>  JOUR D'INSCRIPTION
			mysql_query("UPDATE inscription SET  fin_activation = '$code_date_fin' WHERE identifiant = '$identifiant'") or die ('53'.mysql_error());
					
			//-->>  SITE 1
			mysql_query("UPDATE inscription SET site_1 = '$site_1' WHERE identifiant = '$identifiant'") or die ('4'.mysql_error());
		
			//-->>  SITE 2
			mysql_query("UPDATE inscription SET site_2 = '$site_2' WHERE identifiant = '$identifiant'") or die ('5'.mysql_error());
		
			//-->>  SITE 3
			mysql_query("UPDATE inscription SET site_3 = '$site_3' WHERE identifiant = '$identifiant'") or die ('6'.mysql_error());
		
			//-->>  SITE 4
			mysql_query("UPDATE inscription SET site_4 = '$site_4' WHERE identifiant = '$identifiant'") or die ('7'.mysql_error());
		
			//-->>  SITE 5
			mysql_query("UPDATE inscription SET site_5 = '$site_5' WHERE identifiant = '$identifiant'") or die ('8'.mysql_error());
		
			//-->>  TELEPHONE FIXE 3
			mysql_query("UPDATE inscription SET telephone_fixe_3 = '$telephone_fixe_3' WHERE identifiant = '$identifiant'") or die ('9'.mysql_error());
		
			//-->>  TELEPHONE FIXE 2
			mysql_query("UPDATE inscription SET telephone_fixe_2 = '$telephone_fixe_2' WHERE identifiant = '$identifiant'") or die ('10'.mysql_error());
		
			//-->>  TELEPHONE FIXE 1
			mysql_query("UPDATE inscription SET telephone_fixe_1 = '$telephone_fixe_1' WHERE identifiant = '$identifiant'") or die ('11'.mysql_error());
		
			//-->>  NUMERO DE RUE 3
			mysql_query("UPDATE inscription SET numero_rue_3 = '$numero_rue_3' WHERE identifiant = '$identifiant'") or die ('12'.mysql_error());
		
			//-->>  PORTE 3
			mysql_query("UPDATE inscription SET porte_3 = '$porte_3' WHERE identifiant = '$identifiant'") or die ('13'.mysql_error());
		
			//-->>  RUE 3
			mysql_query("UPDATE inscription SET rue_3 = '$rue_3' WHERE identifiant = '$identifiant'") or die ('14'.mysql_error());
		
			//-->>  CODE POSTAL 3
			mysql_query("UPDATE inscription SET code_postal_3 = '$code_postal_3' WHERE identifiant = '$identifiant'") or die ('15'.mysql_error());
		
			//-->>  VILLE 3
			mysql_query("UPDATE inscription SET ville_3 = '$ville_3' WHERE identifiant = '$identifiant'") or die ('16'.mysql_error());
		
			//-->>  ETAGE 3
			mysql_query("UPDATE inscription SET etage_3 = '$etage_3' WHERE identifiant = '$identifiant'") or die ('17'.mysql_error());
		
			//-->>  PAYS 3
			mysql_query("UPDATE inscription SET pays_3 = '$pays_3' WHERE identifiant = '$identifiant'") or die ('18'.mysql_error());
		
			//-->>  BATIMENT 3
			mysql_query("UPDATE inscription SET batiment_3 = '$batiment_3' WHERE identifiant = '$identifiant'") or die ('19'.mysql_error());
		
			//-->>  NUMERO DE RUE 2
			mysql_query("UPDATE inscription SET numero_rue_2 = '$numero_rue_2' WHERE identifiant = '$identifiant'") or die ('20'.mysql_error());
		
			//-->>  PORTE 2
			mysql_query("UPDATE inscription SET porte_2 = '$porte_2' WHERE identifiant = '$identifiant'") or die ('21'.mysql_error());
		
			//-->>  RUE 2
			mysql_query("UPDATE inscription SET rue_2 = '$rue_2' WHERE identifiant = '$identifiant'") or die ('22'.mysql_error());
		
			//-->>  CODE POSTAL 2
			mysql_query("UPDATE inscription SET code_postal_2 = '$code_postal_2' WHERE identifiant = '$identifiant'") or die ('23'.mysql_error());
		
			//-->>  VILLE 2
			mysql_query("UPDATE inscription SET ville_2 = '$ville_2' WHERE identifiant = '$identifiant'") or die ('24'.mysql_error());
		
			//-->>  ETAGE 2
			mysql_query("UPDATE inscription SET etage_2 = '$etage_2' WHERE identifiant = '$identifiant'") or die ('25'.mysql_error());
		
			//-->>  PAYS 2
			mysql_query("UPDATE inscription SET pays_2 = '$pays_2' WHERE identifiant = '$identifiant'") or die ('26'.mysql_error());
		
			//-->>  BATIMENT 2
			mysql_query("UPDATE inscription SET batiment_2 = '$batiment_2' WHERE identifiant = '$identifiant'") or die ('27'.mysql_error());
		
			//-->>  NUMERO DE RUE 1
			mysql_query("UPDATE inscription SET numero_rue_1 = '$numero_rue_1' WHERE identifiant = '$identifiant'") or die ('28'.mysql_error());
		
			//-->>  PORTE 1
			mysql_query("UPDATE inscription SET porte_1 = '$porte_1' WHERE identifiant = '$identifiant'") or die ('29'.mysql_error());
		
			//-->>  RUE 1
			mysql_query("UPDATE inscription SET rue_1 = '$rue_1' WHERE identifiant = '$identifiant'") or die ('30'.mysql_error());
		
			//-->>  CODE POSTAL 1
			mysql_query("UPDATE inscription SET code_postal_1 = '$code_postal_1' WHERE identifiant = '$identifiant'") or die ('31'.mysql_error());
		
			//-->>  VILLE 1
			mysql_query("UPDATE inscription SET ville_1 = '$ville_1' WHERE identifiant = '$identifiant'") or die ('32'.mysql_error());
		
			//-->>  ETAGE 1
			mysql_query("UPDATE inscription SET etage_1 = '$etage_1' WHERE identifiant = '$identifiant'") or die ('33'.mysql_error());
		
			//-->>  PAYS 1
			mysql_query("UPDATE inscription SET pays_1 = '$pays_1' WHERE identifiant = '$identifiant'") or die ('34'.mysql_error());
		
			//-->>  BATIMENT 1
			mysql_query("UPDATE inscription SET batiment_1 = '$batiment_1' WHERE identifiant = '$identifiant'") or die ('35'.mysql_error());
		
			//-->>  CIVILITE
			mysql_query("UPDATE inscription SET civilite = '$civilite' WHERE identifiant = '$identifiant'") or die ('36'.mysql_error());
		
			//-->>  ANNNEE DE NAISSANCE
			mysql_query("UPDATE inscription SET annee = '$annee' WHERE identifiant = '$identifiant'") or die ('37'.mysql_error());
		
			//-->>  MOIS DE NAISSANCE
			mysql_query("UPDATE inscription SET mois = '$mois' WHERE identifiant = '$identifiant'") or die ('38'.mysql_error());
		
			//-->>  JOUR DE NAISSANCE
			mysql_query("UPDATE inscription SET jour = '$jour' WHERE identifiant = '$identifiant'") or die ('39'.mysql_error());
		
			//-->>  PRENOM
			mysql_query("UPDATE inscription SET prenom = '$prenom' WHERE identifiant = '$identifiant'") or die ('40'.mysql_error());
		
			//-->>  NOM
			mysql_query("UPDATE inscription SET nom = '$nom' WHERE identifiant = '$identifiant'") or die ('41'.mysql_error());
		
			//-->>  DATE ET HEURE D'INSCRIPTION
			mysql_query("UPDATE inscription SET date_heure_inscription = '$date_heure_inscription' WHERE identifiant = '$identifiant'") or die ('42'.mysql_error());
		
			//-->>  REPONSE SECRETE
			mysql_query("UPDATE inscription SET reponse_secrete = '$reponse_secrete' WHERE identifiant = '$identifiant'") or die ('43'.mysql_error());
		
			//-->>  QUESTION SECRETE
			mysql_query("UPDATE inscription SET question_secrete = '$question_secrete' WHERE identifiant = '$identifiant'") or die ('44'.mysql_error());
		
			//-->>  MOT DE PASSE
			mysql_query("UPDATE inscription SET mot_de_passe = '$mot_de_passe' WHERE identifiant = '$identifiant'") or die ('45'.mysql_error());
		
Le message d'erreur original :
Code erreur 5496 Duplicate entry '' for key 8
Cordialement zaknaou

ViPHP
ViPHP | 5924 Messages

09 févr. 2008, 15:00

Ca veut dire ce que ca veut dire, il y a déjà un enregistrement qui a la valeur '' dans le champ qui a la clé n°8…

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

09 févr. 2008, 15:02

Est-ce que tu sais que quand tu fait un INSERT en ne mettant qu'une valeur, les autres sont à NULL ou '' ?
Donc, si une autre ligne de ta table contient NULL ou '' dans l'un de ces champs, tu auras une erreur, même si la seule valeur présente dans ta requête n'est pas déjà présente en base.
Visiblement, l'erreur te dit que la valeur du 8ème champ de ta table est déjà présent en base.

Sinon, je pense que ta batterie de UPDATE, c'est pour contrôler les doublons, non ?
Il serait beaucoup plus intéressant de faire un
$requete = "SELECT COUNT(1) FROM table WHERE champ1 = '". $valeur1 ."' OR champ2 = '". $champ2."' ...";

Si cette requête ne retourne aucun résultats, c'est qu'il n'existe aucun doublons pour chaque champ dans ta table.

Du coup, un SELECT et un INSERT au lieu de un INSERT et 20 UPDATE.
De plus, avec ta manière de faire, si un UPDATE échoue, tu fais quoi ? Un DELETE ? Vive l'optimisation :?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 5924 Messages

09 févr. 2008, 15:19

Au passage, il y a pire encore, c'est que ton shéma de table est très très mauvais.
Si jamais tu as champs identiques à stocker (email_1, email_2, email_3), on ne va pas créer les n champs dans ta table, sauf si tu veux pourrir ton serveur, on fait des tables annexes pour stocker ces données.

En l'occurence, ici, tu devrais avoir une table emails :

Code : Tout sélectionner

CREATE TABLE emails ( id_inscription INTEGER PRIMARY KEY, email VARCHAR(90) UNIQUE NOT NULL );
id_inscription étant l'identifiant du membre inscrit. Et tu devrais faire pareil pour tous les champs du même genre (les champs d'adresse, les champs telephone, les champs de site), pour ne garder que le strict nécessaire dans ta table inscription. De même, les champs jour mois année peuvent être regroupés dans un champ date, lequel peut être utilisé par les fonctions date/heure de mysql, et le champ de date d'inscription doit aussi être spécifié en datetime. Enfin, j'ai l'impression que tu vas stocker le mot de passe en clair dans ta base, c'est le meilleur moyen de te faire attaquer les comptes utilisateurs si jamais quelqu'un réussissait à récupérer ces mots de passe, donc règle absolue, on chiffre les mots de passe avant de les mettre en base, par exemple avec la fonction php md5() ou bien son équivalent sous MYSQL MD5(), et du coup, le champ est un char(32) :

Code : Tout sélectionner

CREATE TABLE `inscription` ( `identifiant` integer auto_increment NOT NULL, `mot_de_passe` char(32) collate latin1_general_ci NOT NULL, `pseudo_forum` varchar(20) collate latin1_general_ci NOT NULL, `pseudo_chat` varchar(20) collate latin1_general_ci NOT NULL, `pseudo_blog` varchar(20) collate latin1_general_ci NOT NULL, `pseudo_article` varchar(20) collate latin1_general_ci NOT NULL, `question_secrete` varchar(30) collate latin1_general_ci NOT NULL, `reponse_secrete` varchar(30) collate latin1_general_ci NOT NULL, `date_heure_inscription` datetime collate latin1_general_ci NOT NULL, `civilite` varchar(4) collate latin1_general_ci NOT NULL, `nom` varchar(20) collate latin1_general_ci NOT NULL, `prenom` varchar(20) collate latin1_general_ci NOT NULL, `date‘ datetime collate latin1_general_ci NOT NULL, `loisir` longtext collate latin1_general_ci NOT NULL, `langue` longtext collate latin1_general_ci NOT NULL, `langage` longtext collate latin1_general_ci NOT NULL, `ip` varchar(255) collate latin1_general_ci NOT NULL, `identite` varchar(40) collate latin1_general_ci NOT NULL, `statut` varchar(255) collate latin1_general_ci NOT NULL, `code_membre` varchar(255) collate latin1_general_ci NOT NULL, `code_compte` varchar(255) collate latin1_general_ci NOT NULL, `etat` varchar(255) collate latin1_general_ci NOT NULL, `fin_activation` varchar(10) collate latin1_general_ci NOT NULL, PRIMARY KEY `identifiant` (`identifiant`), UNIQUE KEY `identite` (`identite`), UNIQUE KEY `pseudo_forum` (`pseudo_forum`), UNIQUE KEY `pseudo_chat` (`pseudo_chat`), UNIQUE KEY `pseudo_blog` (`pseudo_blog`), UNIQUE KEY `pseudo_article` (`pseudo_article`) );
J'oubliais : Il vaut mieux avoir un identifiant auto incrémenté, et surtout, il est très important de mettre des index sur les champs les plus utilisés dans ou les clauses WHERE ou ORDER, avec le mot clé INDEX

Eléphant du PHP | 88 Messages

09 févr. 2008, 16:27

Ouai mais zeus comment je fait pour que cette requete :
$requete = "SELECT COUNT(1) FROM table WHERE champ1 = '". $valeur1 ."' OR champ2 = '". $champ2."' ...";
Affiche non pas une erreur globale mais une erreur précise genre :

Erreur, le champs email_1 est déjà utilisé
Erreur, le champs identite est déjà utilisé

Et pour ce qui est de séparer ma table inscription, je pensse que ce sera trés dificile car i y a au moins une centaine scripts voir même le double qui sont relier à cette table.

Est-ce un problème de sécurite ou de vitesse d'opération sur la base si je laisse la table comme ça ?
Cordialement zaknaou