duplicate key

jayjay
Invité n'ayant pas de compte PHPfrance

02 août 2005, 19:32

salut, j'ai un probleme de clé qui est dupliquée, voici mes tables

Code : Tout sélectionner

-- -- Structure de la table `commande` -- CREATE TABLE `commande` ( `numcom` int(5) NOT NULL default '0', `datecom` date NOT NULL default '0000-00-00', `nbrpro` int(3) NOT NULL default '0', `codepro` int(4) NOT NULL default '0', `typecom` int(1) NOT NULL default '0', `acom` float NOT NULL default '0', `numcli` int(4) NOT NULL default '0', PRIMARY KEY (`numcom`), KEY `numcli` (`numcli`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- -- Contenu de la table `commande` -- -- -------------------------------------------------------- -- -- Structure de la table `détailcommande` -- CREATE TABLE `détailcommande` ( `numcom` int(5) NOT NULL default '0', `nbrpro` int(3) NOT NULL default '0', `codepro` int(4) NOT NULL default '0', PRIMARY KEY (`numcom`), KEY `codepro` (`codepro`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- -- Contenu de la table `détailcommande` -- INSERT INTO `détailcommande` VALUES (1, 4, 1011); -- -------------------------------------------------------- -- -- Structure de la table `produit` -- CREATE TABLE `produit` ( `codepro` int(4) NOT NULL default '0', `nompro` varchar(20) NOT NULL default '', `descrippro` varchar(30) NOT NULL default '', `prixpro` float NOT NULL default '0', `nbrartstock` int(4) NOT NULL default '0', `numf` int(4) NOT NULL default '0', PRIMARY KEY (`codepro`), KEY `numf` (`numf`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- -- Contenu de la table `produit` -- INSERT INTO `produit` VALUES (1001, 'pain', 'pain blanc', 1.65, 8, 1); INSERT INTO `produit` VALUES (1011, 'CHOUTETE', 'CHOUTETE A AL MOUTARDE', 8.43, 3, 1); INSERT INTO `produit` VALUES (1231, 'TARTE', 'TARTEDE MAMAN', 2.34, 3, 1); -- -- Contraintes pour la table `commande` -- ALTER TABLE `commande` ADD CONSTRAINT `commande_ibfk_1` FOREIGN KEY (`numcli`) REFERENCES `client` (`numcli`); -- -- Contraintes pour la table `détailcommande` -- ALTER TABLE `détailcommande` ADD CONSTRAINT `détailcommande_ibfk_1` FOREIGN KEY (`codepro`) REFERENCES `produit` (`codepro`); -- -- Contraintes pour la table `produit` -- ALTER TABLE `produit` ADD CONSTRAINT `produit_ibfk_1` FOREIGN KEY (`numf`) REFERENCES `fournisseur` (`numf`);
voici mon script
 
<html>
<body>
<head>

<LINK REL =stylesheet TYPE =text/css HREF =fichier.css/>

</head>


<?
if (isset($_POST['submit']))
{
//on teste les erreurs
foreach ($_POST as $valeurchamps)
{

echo $valeurchamps;
//on teste si les données saisies sont numériques ou pas

if(is_numeric($valeurchamps))
{$err='pas d\'erreur';
echo $err;
}
else{
if($valeurchamps='envoyer'){
$err='pas d\'erreur';}
else{
$erreur = 'il y a une erreur';
echo $erreur;
}
}
}
if(count($erreur))
{
echo 'on doit réafficher le formulaire';
$test=FALSE;
}
else
{

$test=TRUE;
//ouverture et sélection de la base de donnée
require '.\includes\mysql.php';
$bd=mysql_connect("$host_bd", "$login_bd", "$password_bd");
mysql_select_db("$base_bd", $bd);
$rqr = "SELECT * FROM produit";
$resulta = mysql_query ($rqr);
foreach ($_POST as $valeurchamps)
{

$dbRow = mysql_fetch_assoc($resulta);
$nomchamps = $dbRow['codepro'];
$rq = "INSERT INTO détailcommande (numcom, nbrpro, codepro) VALUES ('0001', '$valeurchamps', '$nomchamps')";
mysql_query($rq);
echo 'l\'enregistrement a réussit';
}
}

}
?>
<? if(!($test)){ ?>

<form method="post">
<table>
<caption>tableau des commandes</caption>
<thead> <!-- En-tête du tableau -->
<tr>
<th>Nbre</th>
<th>Code</th>
<th>Produit</th>
</tr>
</thead>
<tbody> <!-- Corps du tableau -->

<?
require '.\includes\mysql.php';
$bd=mysql_connect("$host_bd", "$login_bd", "$password_bd");
mysql_select_db("$base_bd", $bd);
$rq = "SELECT * FROM produit";
$result = mysql_query ($rq);
while($dbRow = mysql_fetch_assoc($result))
{

print(" <tr>\n");
print(" <td><input type=\"text\" name=\"{$dbRow['codepro']}\" size=\"3\" maxlength=\"3\"></td>\n");
print(" <td> {$dbRow['codepro']} </td>\n");
print(" <td> {$dbRow['nompro']} </td>\n");
print(" </tr>\n");
}
?>
</tr>
<tr>
<td><input type="submit" name="submit" value="envoyer"/>
</td>
</tr>
<tbody>
</table>
</form>
<? } ?>
</body>
</html>
Je n'enregistre que la première ligne de ma commande.......
Apparament, j'ai un soucis au niveau de la clé, elle dupliquée.
mais je ne vois pas comment, dans mon cas, créer une bonne table de façon à enregistrer dans ma Base dd chaque commande journalière....

Mammouth du PHP | 19672 Messages

02 août 2005, 19:43

Dans ta requête, tu enregistres un numéro de clé primaire: la première fois, ça va marcher, mais la fois suivante, ça va bloquer:
dans ta requête, laisse faire MySQL pour la génération de la clé primaire si c'est un champ "auto_increment"
INSERT INTO détailcommande (nbrpro, codepro) VALUES ('". $valeurchamps ."', '". $nomchamps ."')
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

jayjay
Invité n'ayant pas de compte PHPfrance

02 août 2005, 19:59

Ok mais le probleme est que je dois avoir un numéro de commande unique pour chaque ligne de cette commande si je veux par exemple sortir un historique de mes commandes....

ViPHP
ViPHP | 1024 Messages

02 août 2005, 20:26

les champs de type auto_increment ont des valeurs croissantes ( +1 à chaque fois) et toujours différentes. change ce détail dans les structures de tes tables, ça devrait mieux marcher.

A+

Pascal

jayjay
Invité n'ayant pas de compte PHPfrance

02 août 2005, 20:48

oui mais le numcom doit etre unique pour chaque commande. je n'ai pas le choix et le probleme est la...

ViPHP
ViPHP | 1024 Messages

02 août 2005, 21:11

Les champs de type auto_increment sont tous différents, ou si tu préfères, uniques.

tu passes le champs numcom en auto_increment, lors des créations de commande, tu ne précises pas de valeur de numcom, ça sera rempli automatiquement avec une nouvelle valeur unique.

c'est clair j'espère...

A+

Pascal