INTEGER UNSIGNED AUTOINCREMEN

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : INTEGER UNSIGNED AUTOINCREMEN

par zeus » 10 févr. 2008, 23:49

Modération : sujet nettoyé.

par Genova » 10 févr. 2008, 21:08

Bonsoir,
c'est pourtant pas compliqué de comprendre pourquoi tu n'arrives pas à te connecter avec ta requête. Tu as :
$mot_de_passe = md5($mot_de_passe);
tu hash donc ton mot de passe ici.

Et dans ta requête tu n'utilises même pas cette variable $mot_de_passe (donc tu n'utilises pas le mot de passe que tu as hashé) :
$selection = sprintf("SELECT COUNT(*) as compte FROM inscription WHERE mot_de_passe ='%s' AND identifiant ='%s'",
mysql_real_escape_string(stripgpc($_POST['mot_de_passe'])),
mysql_real_escape_string(stripgpc($_POST['identifiant'])));
Forcément ça peut pas marcher.

Donc la solution :
$selection = sprintf("SELECT COUNT(*) as compte FROM inscription WHERE mot_de_passe ='%s' AND identifiant ='%s'",
mysql_real_escape_string(stripgpc($mot_de_passe)),
mysql_real_escape_string(stripgpc($identifiant)));
tout simplement ... tu as pas du chercher car je n'ai jamais vu de personne pratiquant le PHP butter sur un problème aussi simple aussi longtemps.


D'autant plus que tu aurais pu comprendre tout de suite ton problème si tu avais fait
echo $selection;
en dessous de ta requête, ça t'aurait affiché ta requête SQL avec le mot de passe non hash et tu en aurais déduis en même pas 1 microseconde que tu utilisais les mauvaises variables.

A mon avis :
  1. soit ce code n'est pas de toi (et dans ce cas à mon avis ça recoupe le 3ème choix)
  2. soit tu n'as tout simplement pas cherché à résoudre ton problème
  3. soit tu n'as absolument aucune logique (et donc je te conseil de te réorienté définitivement vers autre chose que le développement).
Il est difficile de répondre agréablement à une personne qui ne cherche même pas à essayer de comprendre ses problèmes.

par zaknaou » 10 févr. 2008, 20:15

J'ai affiché ma requête... En Page 2

Le code :
<?php

//-->> RECEPTION DES CHAMPS
$identifiant = $_POST['identifiant'];
$mot_de_passe = $_POST['mot_de_passe'];

//-->> MISE EN MINUSCULE DE L'IDENTIFIANT
$identifiant = strtolower($identifiant);

//-->> CRYPTAGE DU MOT DE PASSE
$mot_de_passe = md5($mot_de_passe);

//-->> PREPARATION
function stripgpc($value)
{
	if(get_magic_quotes_gpc()) $value = stripslashes($value);
	return $value;
}

//-->> SELECTION DU COMPTE
$selection = sprintf("SELECT COUNT(*) as compte FROM inscription WHERE mot_de_passe ='%s' AND identifiant ='%s'",
mysql_real_escape_string(stripgpc($_POST['mot_de_passe'])),
mysql_real_escape_string(stripgpc($_POST['identifiant']))); 

$query = mysql_query($selection) or die(mysql_error());
$totalReponse = mysql_fetch_assoc($query);

if ($totalReponse['compte'] == 1 )
{
	echo"CONNEXION REUSSI";
}
else 
{
	echo"CONNEXION ECHOUEE";
}

?>
Et je sais maintenant pourquoi sa ne marchais pas, c'est parce que J'ai l'or de ma requête travailler à partir de $POST au lieu de $mot_de_passe qui au contraire des £POST est passé par MD5...

Si sa à afficher CONNEXION ÉCHOUÉE c'est parce que j'ai comparé un mot de passe passé par md5 avec une autre qui n'est pas passé par md5...
mysql_real_escape_string(stripgpc($_POST['mot_de_passe'])),
mysql_real_escape_string(stripgpc($_POST['identifiant']))); 
Merci, quand même

Bonne soirée... :evil: :evil: :evil: :evil: :!:

par zaknaou » 09 févr. 2008, 20:30

En fait quand je retape mon code dans le champs mot de passe de la CONNEXION et que je valide mon code n'est pas trouvée dans la base pourtant il existe !!

Je tape 54896585 que je réception dans le code ci-dessous et qui devient avec md5 : 875eh5tdcc81da7a423fde85352f435e et pourtant un enregistrement avec pour mot de passe 875eh5tdcc81da7a423fde85352f435e existe bien dans la base de donnée...

Et je certifie que le code ci-dessous fonctionne avec un mot de passe en clair (testé)

Le code :
<?php

//-->> RECEPTION DES CHAMPS
$identifiant = $_POST['identifiant'];
$mot_de_passe = $_POST['mot_de_passe'];

//-->> MISE EN MINUSCULE DE L'IDENTIFIANT
$identifiant = strtolower($identifiant);

//-->> CRYPTAGE DU MOT DE PASSE
$mot_de_passe = md5($mot_de_passe);

//-->> PREPARATION
function stripgpc($value)
{
	if(get_magic_quotes_gpc()) $value = stripslashes($value);
	return $value;
}

//-->> SELECTION DU COMPTE
$selection = sprintf("SELECT COUNT(*) as compte FROM inscription WHERE mot_de_passe ='%s' AND identifiant ='%s'",
mysql_real_escape_string(stripgpc($_POST['mot_de_passe'])),
mysql_real_escape_string(stripgpc($_POST['identifiant']))); 

$query = mysql_query($selection) or die(mysql_error());
$totalReponse = mysql_fetch_assoc($query);

if ($totalReponse['compte'] == 1 )
{
	echo"CONNEXION REUSSI";
}
else 
{
	echo"CONNEXION ECHOUEE";
}

?>
D'où vient l'erreur ?

Merci

par Sékiltoyai » 09 févr. 2008, 18:24

Alors les raisons pour lesquelles ton shéma est mauvais sont multiples :
- Sécurité : Pour le mot de passe, cela pose un problème s'il est en clair
- Performances : S'il y a des champs inutiles, ou des index mal placés ou inexistants, ou des colonnes mal typées, les perfomances seront amoindries. De même, le calcul de l'identifiant par le moteur est de loin plus rapide et plus fiable que par l'application.
- Fonctionnalités : Si tu n'utilises pas les bons types de champ, tu te prives de certaines fonctionnalités (gestion des dates, auto incrémentation). Et avec ton schéma actuel, tu ne peux pas vérifier que 2 personnes ont inscrit le même email, ou le même numéro de téléphone, car, quoi que tu fasses, si quelqu'un remplit le champ email_1 avec le même email qu'un champ email_2 d'un autre enregistrement, je ne vois pas comment tu veux le vérifier de manière fiable et efficace avec ta solution actuelle, l'avantage d'une structure divisée en plusieures tables serait alors de pouvoir poser des contraintes d'unicité fiables sur l'email ou les autres champs de ce style.

Ensuite, pour le md5, sachant que la même chaine donnera toujours le même md5, si dans ta base tu as un mot de passe chiffré, il suffira de chiffrer le mot de mot que tu auras reçu de l'utilisateur, et de vérifier qu'il est bien égal au hash que tu as en base.

par zaknaou » 09 févr. 2008, 16:55

De plus avec md5()

par exemple un mot de passe ressemble à 875eh5tdcc81da7a423fde85352f435e

comment je fait pour que le membre puisse taper 54896585 au lieu de 875eh5tdcc81da7a423fde85352f435e dans le script de connexion ?

J'ai essayé de mettre en md5() sont mot de passe lors de la connexion mais sa marche pas...

par zeus » 09 févr. 2008, 16:40

Eh bien, au lieu de faire un COUNT(1), tu récupères tout les champs en doublons et tu les testes en PHP si la requête a retourné un enregistrement.
Est-ce un problème de sécurite ou de vitesse d'opération sur la base si je laisse la table comme ça ?
Les deux ... :?
Pour les raisons exprimées par Sekiltoyai, c'est à dire les mots de passes en clair et la place qu'occupe ta base de données avec les champs en trop

par zaknaou » 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 ?

par Sékiltoyai » 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

par zeus » 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 :?

par Sékiltoyai » 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…

par zaknaou » 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

par zeus » 09 févr. 2008, 14:35

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

La prochaine fois, j'essaye en anglais

par zaknaou » 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.

par zeus » 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: