Duplicata...

Eléphanteau du PHP | 28 Messages

05 août 2005, 18:25

Bonjour. Je sais que cette question a déjà été posée dans ce forum, mais un problème subsiste.

Voilà, je code depuis un petit moment, et tout se passait bien, la vie est belle, les oiseaux chantent, etc, etc...

J'utilise, pour gérer les personnes inscrites, une BDD (évidemment) MySQL.
Au début, j'ai créé une table de 14 champs, avec le premier nommé id, et auto-incrémenté.
J'ai du virer l'incrémentation, pour un problème simple: je tente d'insérer des ids fixes selon mon goût.
Et c'est à partir de là où tout se met à partir de travers.
Premier message d'erreur "Duplicata du champ '2' pour la clef 1".
Je connaissais cette erreur, qui me fut fatale, et m'avait forcé dans le passé à abandonner l'un des mes codes php les plus longs, n'ayant trouvé strictement aucune solution.
Après un temps de recherche, j'ai décidé de virer le Primairy Key.
Rien de nouveau.
De le remplacer par Index.
Rien de nouveau.
De supprimer la table complétement, d'en refaire une autre, cette fois, sans auto-increment ni Primairy-Key.
Rien n'y fit: le message d'erreur demeure, même en virant le INTO de la requête, et quelque soit la valeur entrée.

Voici le code:
<?php
	include("bdd_connexion.php");

	if(isset($_POST['race'])) /* Si la variable $_POST['race'] existe, c'est que le formulaire a été validé ! */
	{
		if(isset($_POST['login']) AND !empty($_POST['login'])) /* vérif du login */
		{
			if(isset($_POST['password1']) AND !empty($_POST['password1']) AND ($_POST['password1'] == $_POST['password2'])) /* Vérif des passwords */
			{
				if(isset($_POST['mail1']) AND !empty($_POST['mail1']) AND ($_POST['mail1'] == $_POST['mail2'])) /* première vérif du mail */
				{
					if(preg_match("!^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$!", $_POST['mail1'])) /* vérif de la validité du mail */
					{
						$login = htmlentities(addslashes($_POST['login']));
						$password = htmlentities(addslashes($_POST['password2']));
						$mail = htmlentities(addslashes($_POST['mail2']));
						$race = $_POST['race'];
						
						if($race == 'Humain')
						{
							$domaine_value = '1';
						}
						elseif($race == 'Troll')
						{
							$domaine_value = '6';
						}
						elseif($race == 'Orc')
						{
							$domaine_value = '6';
						}
						elseif($race == 'Nain')
						{
							$domaine_value = '3';
						}
						elseif($race == 'Elfe')
						{
							$domaine_value = '4';
						}
						elseif($race == 'Lycan')
						{
							$domaine_value = '5';
						}
						elseif($race == 'Mutant')
						{
							$domaine_value = '7';
						}
						elseif($race == 'Vampire')
						{
							$domaine_value = '2';
						}
						
						$fiche_hrp = 'Fiche HRP';
						$fiche_rp = 'Fiche RP';
						$credits = 2000;
						$droit = 1;
						$special = 0;
						$etat = 'OK';
						$lifepoints = 100;
						$hp_max = 100;
						
						$users_pris = mysql_query("SELECT * FROM utilisateurs WHERE login='$login'") or die(mysql_error());
						$nb_users_pris = mysql_numrows($users_pris);
						
						if($nb_users_pris != 0)
						{
							$infos = 'Ce nom d\'utilisateur est déjà pris.';
						}
						else
						{
							$req_last_user = mysql_query("SELECT * FROM utilisateurs ORDER BY id DESC LIMIT 0,1") or die(mysql_error());
							$array_last_user = mysql_fetch_array($req_last_user);
							$last_id = $array_last_user['id'];
							$nouvel_id = $last_id + 1;
							mysql_query("INSERT INTO utilisateurs VALUES('$nouvel_id', '$login', '$password', '$mail', '$race', '$domaine_value', '$fiche_hrp', '$fiche_rp', '$credits', '$droit', '$special', '$etat', '$lifepoints', '$hp_max')") or die(mysql_error());
							
							$date = date('d/m/Y');
							$type = 'Inscription';
							$action = 'Inscription de '.$login.' le '.$date.', de race '.$race.'. IP inscription: '.$_POST['ip'];
							mysql_query("INSERT INTO log VALUES('', '$type', '$action')") or die(mysql_error());
							
							$time_inscrit = time();
							$time_last_creds = time();
							$time_last_connect = time();
							$time_start_state = time();
							$time_last_delestage = time();
							mysql_query("INSERT INTO timesystem VALUES('$nouvel_id', '$time_inscrit', '$time_last_creds', '$time_last_connect', '$time_start_state', '$time_last_delestage')") or die(mysql_error());
							
							$infos = 'Inscription réussie.<br />Vous pouvez dès à présent vous connecter en utilisant votre login et mot de passe.';
						}
					}
					else
					{
						$infos = 'Adresse Mail invalide.';
					}
				}
				else
				{
					$infos = 'Veuillez saisir les adresses mail correctement.';
				}
			}
			else
			{
				$infos = 'Veuillez saisir les passwords correctement, merci.';
			}
		}
		else
		{
			$infos = 'Veuillez saisir un login correct.';
		}
		
		?>
		<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
				"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
		<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
			<head>
				<title>Unreal</title>
				<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
				<link rel="stylesheet" media="screen" type="text/css" title="inscription" href="unreal_design1.css" />
			</head>
			<body>
				<?php
					include("logo_epure.php");
				?>
				<h3>Inscription</h3>
				<p><?php echo $infos; ?></p>
				<p>
					<a href="index.php">Retour</a>
				</p>
				<?php
					include("pied_de_page.php");
				?>
			</body>
		</html>
		<?php
	}
	else
	{
		?>
		<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
				"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
		<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >
			<head>
				<title>Unreal</title>
				<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
				<link rel="stylesheet" media="screen" type="text/css" title="inscription" href="unreal_design1.css" />
			</head>
			<body>
				<?php
					include("logo.php");
				?>
				<h3>Inscription</h3>
				<p>Veuillez remplir le formulaire suivant pour vous inscrire, merci.</p>
				<form method="post" action="inscription.php">
				<p>
					Nom d'utilisateur : <input type="text" name="login" size="15" maxlength="15" /><em>15 caractères maximum</em><br />
					<br />
					Mot de passe : <input type="password" name="password1" size="15" maxlength="15" /><em>15 carac. Max. Choisissez bien.</em><br />
					<br />
					Adresse Mail : <input type="text" name="mail1" /><em>Veuillez entrer une adresse valide.</em><br />
					<br />
					Confirmation Mail : <input type="text" name="mail2" /><em>Vous devez saisir une adresse identique à la première.</em><br />
					<br />
					Race du personnage : <select name="race">
						<option value="Humain">Humain</option>
						<option value="Nain">Nain</option>
						<option value="Elfe">Elfe</option>
						<option value="Mutant">Mutant</option>
						<option value="Orc">Orc</option>
						<option value="Lycan">Lycan</option>
						<option value="Vampire">Vampire</option>
						<option value="Troll">Troll</option>
					</select><em>Vous ne pourrez changer de race que grâce à certains objets, donc choisissez bien. Votre race déterminera votre domaine de départ</em><br />
					<br />
					Confirmation Mot de Passe : <input type="password" name="password2" size="15" maxlength="15" /><em>Il doit être rigoureusement identique au premier saisi.</em><br />
					<br />
					<br />
					<?php $ip_user = $_SERVER['REMOTE_ADDR']; ?>
					<input type="hidden" name="ip" value="<?php echo $ip_user; ?>" />
					<input type="submit" value="Soumettre l'inscription" />
				</p>
				<?php
					include("pied_de_page.php");
				?>
				</form>
			</body>
		</html>
		<?php
	}
En comptant beaucoup sur votre aide, car je ne trouve aucune solution... Merci d'avance.


Lpu8er

Mammouth du PHP | 19672 Messages

05 août 2005, 18:34

Ça sent le BloodBowl ;) je regarde le code e je te reviens avec une solution si je trouve :)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 28 Messages

05 août 2005, 18:39

BllodBowl ? What's ? Un surplus de requêtes mysql ?

Sinon, voici la partie du code qui semble avoir un problème:
$req_last_user = mysql_query("SELECT * FROM utilisateurs ORDER BY id DESC LIMIT 0,1") or die(mysql_error());
                            $array_last_user = mysql_fetch_array($req_last_user);
                            $last_id = $array_last_user['id'];
                            $nouvel_id = $last_id + 1;
                            mysql_query("INSERT INTO utilisateurs VALUES('$nouvel_id', '$login', '$password', '$mail', '$race', '$domaine_value', '$fiche_hrp', '$fiche_rp', '$credits', '$droit', '$special', '$etat', '$lifepoints', '$hp_max')") or die(mysql_error()); 
Ce que je me demande, c'est pourquoi le mysql_error ne réagit pas...

Mammouth du PHP | 19672 Messages

05 août 2005, 19:21

j'avais isolé ce bout en particulier effectivement: fais donc afficher la requête avant exécution, fais afficher également le retour pour vérfier, en particulier les variables $last_id et $nouvel_id. Ton système devrait fonctionner.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 28 Messages

06 août 2005, 11:34

Euh, l'echo sur $last_id et nouvel_id, j'uis ok, mais un echo sur une requête, j'évite en général, j'ignore donc la tête que ça va avoir... je tente de suite, merci encore.


Lpu8er