Avatar billede anetteogjesper Nybegynder
15. juni 2004 - 15:48 Der er 5 kommentarer og
1 løsning

'Duplicate entry "8" for key 1'?

Hej
Jeg har dennne hjemmeside www.xxxxx.dk og nogle gange når man bestiller en vare får man denne besked "Duplicate entry '8' for key 1", med forskellige tal.
Andre gange når man bestiller går varen fint igennem, hvad er der galt?

Jeg bruger en mySql database!

Php koden ser sådan ud:

<?php
session_start();
//etablerer forbindelse til databasen
$conn = mysql_connect("mydb1.surftown.dk", "XXX", "XXX") or die(mysql_error());
mysql_select_db("michell_varelager",$conn)        or die(mysql_error());

$display_block = "<h1>Bekræftigelse</h1>";

//validering af varen

$select_from_orders = "SELECT efterkrav, overfoersel, ewire, fornavn, efternavn, adresse1, adresse2, city, postnr, telefon, mobil, email, add_type, sendtil, sendtil_adresse1, sendtil_adresse2, sendtil_by, sendtil_postnr, personlig_besked FROM orders WHERE session_id='".$PHPSESSID."'";
extract(mysql_fetch_array(mysql_query($select_from_orders))) or die(mysql_error());

if (!empty($efterkrav)) {
        $salg = "Efterkrav <div style=\"text-align:center\">kr. 78,75</div>";
        $pris = "78.75";
        $betaling = "Efterkrav";
}
if (!empty($overfoersel)) {
        $salg = "Bankoverførsel <div style=\"text-align:center\">kr. 46,50</div>";
        $pris = "46.50";
        $betaling = "Bankoverførsel";
}
if (!empty($ewire)) {
        $salg = "Ewire <div style=\"text-align:center\">kr. 49,50</div>";
        $pris = "49.50";
        $betaling = "Ewire";
}
if (!empty($adresse2)) {
        $adresse3 = "\n".$adresse2;
}

if (!empty($sendtil_adresse2)) {
        $sendtil_adresse3 = "\n".$sendtil_adresse2;
}

if ($add_type == "samme") {
        $levering = "Leveringsadressen er den samme";
} else {
        $levering = "Levering sker til:\n".$sendtil."\n".$sendtil_adresse1."\n".$sendtil_postnr."".$sendtil_b y."\n\nDen personlige besked til modtageren er:\n".$personlig_besked;
}

$display_block .= "Du købte:<br/>";

$select_from_store_shoppertrack = "SELECT sel_item_id, sel_item_qty, sel_item_size, sel_item_price FROM store_shoppertrack WHERE session_id = '".$PHPSESSID."'";

// Hent først data ud
$resultat = mysql_query($select_from_store_shoppertrack);

// Kør så igennem for hver række
while ($raekke = mysql_fetch_array($resultat)) {
  extract($raekke);
 
  $select_from_inventory = "SELECT name, price FROM inventory WHERE id='".$sel_item_id."'";
  extract(mysql_fetch_array(mysql_query($select_from_inventory))) or die(mysql_error());
 
  $select_from_store_size = "SELECT store_item_qty FROM store_item_size WHERE item_id='".$sel_item_id."'";
  extract(mysql_fetch_array(mysql_query($select_from_store_size))) or die(mysql_error());
  $store_item = $store_item_qty - $sel_item_qty;
  mysql_query("UPDATE store_item_size SET store_item_qty='".$store_item."' WHERE item_id='".$sel_item_id."'");
 
  $sql = "INSERT INTO store_orders_itemmap (id, sel_item_id, sel_item_qty, sel_item_size, sel_item_price, efterkrav, overfoersel, ewire, fornavn, efternavn, adresse1, adresse2, city, postnr, telefon, mobil, email, add_type, sendtil, sendtil_adresse1, sendtil_adresse2, sendtil_by, sendtil_postnr, personlig_besked) VALUES ('".$PHPSESSID."', '".$sel_item_id."', '".$sel_item_qty."', '".$sel_item_size."', '".$sel_item_price."', '".$efterkrav."', '".$overfoersel."', '".$ewire."', '".$fornavn."', '".$efternavn."', '".$adresse1."', '".$adresse2."', '".$city."', '".$postnr."', '".$telefon."', '".$mobil."', '".$email."', '".$addtype."', '".$sendtil."', '".$sendtil_adresse1."', '".$sendtil_adresse2."', '".$sendtil_by."', '".$sendtil_postnr."', '".$personlig_besked."')";
  mysql_query($sql) or die (mysql_error());
 
  $price = $price * $sel_item_qty;
  $price = array($price);
  $display_block .= $sel_item_qty." stk. ".$name."<div style=\"text-align:center\">kr. ";
 
  $counting = count($price);
  for ($a=0; $a<$counting; $a++) {
            $display_block .=  str_replace(".", ",", $price[$a])."</div><br/>";
            $prisen1 = $price[$a] + $prisen1;
  }

  $mail_tekst[] = $sel_item_qty." stk. ".$name." størrelse ".$sel_item_size;
}

$prisen2 = "Samlet pris<div style=\"text-align:center\">kr. ".str_replace(".", ",", $prisen1 + $pris)."</div>";

$display_block .= $salg."<br/>".$prisen2;

$emailadressen = "bixen@xxxxx.dk";
$emne = "Der er blevet købt varer på 5xX";
$tekst = "Hej.\n".$fornavn." ".$efternavn." købte noget på siden.\n\n".$fornavn."'s bestilling er\n\n:";

$coutning2 = count($mail_tekst);
for ($c=0; $c<$coutning2; $c++) {
        $tekst .= $mail_tekst[$c]."\n";
}

$tekst .= "\nVedkommendes betalingsform var:\n".$betaling."\n\n".$prisen2."\n\nVedkommendes adresse er:\n".$adresse1."".$adresse3."\n".$postnr." ".$city."\n\n".$levering."\n\nVedkommendes emailadresse er:\n".$email;
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
$headers .= "From: 5 x X biXen <".$emailadressen.">";
mail($emailadressen, $emne, $tekst, $headers);

$bestiller_emne = "Tak for din bestilling!";
$tekst1 = "Tusind tak for din bestilling hos 5 x X biXen!\n\nDu vil snarest modtage ordrebekræftelse pr. e-mail.\n\nMed venlig hilsen\n5 x X biXen";
mail($email, $bestiller_emne, $tekst1, $headers);
?>

<html>
<head>
<title></title>
<link rel="stylesheet" type="text/css" href="rullepanel.css">
<style>
a {text-decoration: none}
</style>

</head>
<body>
<? print $display_block; ?>
TAK FOR DIN BESTILLING

</body>
</html>
Avatar billede dennismp Nybegynder
15. juni 2004 - 15:56 #1
du bruger PHPSESSID som et id. Er feltet langt nok til at kunne indeholde alle karakterne i PHPSESSID ? (mysql brokker sig ikke over den slags, den fjerne bare det der ikke kan være der).. Hvad sker der hvis kunden laver flere bestillinger med samme PHPSESSID ?
Avatar billede whistler Nybegynder
15. juni 2004 - 16:25 #2
I din:

  $sql = "INSERT INTO store_orders_itemmap (id, sel_item_id, sel_item_qty, sel_item_size, sel_item_price, efterkrav, overfoersel, ewire, fornavn, efternavn, adresse1, adresse2, city, postnr, telefon, mobil, email, add_type, sendtil, sendtil_adresse1, sendtil_adresse2, sendtil_by, sendtil_postnr, personlig_besked) VALUES ('".$PHPSESSID."', '".$sel_item_id."', '".$sel_item_qty."', '".$sel_item_size."', '".$sel_item_price."', '".$efterkrav."', '".$overfoersel."', '".$ewire."', '".$fornavn."', '".$efternavn."', '".$adresse1."', '".$adresse2."', '".$city."', '".$postnr."', '".$telefon."', '".$mobil."', '".$email."', '".$addtype."', '".$sendtil."', '".$sendtil_adresse1."', '".$sendtil_adresse2."', '".$sendtil_by."', '".$sendtil_postnr."', '".$personlig_besked."')";

Bør du helt klart ændre dit database design således at dit ID felt ikke indeholder PHPSESSION værdien men i stedet en primærnøgle af typen INTEGER og fx som auto_increament.

Således at du lade MySQL lave en intern tæller der opfylder kriterierne for at være PRIMÆR og UNIQUE.

Når du så skal indsætte med ovenstående INSERT - udelader du blot ID feltet og MySQL opretter selv IDet.

Derudover bør du nok unset()'te de gemte SESSION værdier når først ordren er lagt i din database - således at kunden ikke ved fx reload af browseren lægger ordren i databasen to gange. (Plus evt. lave et par yderligere checks for at forhindre det).

//Geert
Avatar billede anetteogjesper Nybegynder
18. juni 2004 - 15:57 #3
Nu har jeg slettet alle PHPSESSION i både kode og database, men den laver stadig fejl i koden, den skriver: Duplicate entry '5170' for key 1.
Skal jeg helt fjerne id fra ovenstående kode?
Så der står:
$sql = "INSERT INTO store_orders_itemmap (sel_item_id, sel_item_qty, sel_item_size, sel_item_price, efterkrav, overfoersel, ewire, fornavn, efternavn, adresse1, adresse2, city, postnr, telefon, mobil, email, add_type, sendtil, sendtil_adresse1, sendtil_adresse2, sendtil_by, sendtil_postnr, personlig_besked) VALUES ('".$sel_item_id."', '".$sel_item_qty."', '".$sel_item_size."', '".$sel_item_price."', '".$efterkrav."', '".$overfoersel."', '".$ewire."', '".$fornavn."', '".$efternavn."', '".$adresse1."', '".$adresse2."', '".$city."', '".$postnr."', '".$telefon."', '".$mobil."', '".$email."', '".$addtype."', '".$sendtil."', '".$sendtil_adresse1."', '".$sendtil_adresse2."', '".$sendtil_by."', '".$sendtil_postnr."', '".$personlig_besked."')";

Hvordan unset'er jeg?
Avatar billede dennismp Nybegynder
18. juni 2004 - 16:53 #4
hvor har du $sel_item_id fra?
Avatar billede anetteogjesper Nybegynder
20. juni 2004 - 07:36 #5
Ved ikke helt hvad du mener...
"$select_from_inventory = "SELECT name, price FROM inventory WHERE id='".$sel_item_id."'";"
Avatar billede anetteogjesper Nybegynder
23. juni 2005 - 11:49 #6
Fandt ud af det på kandu
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester