PHP skickar in dubbla rader i MySQL databas


#1

Hej,

När jag kör nedan script i Safari skickas det in två identiska rader i MySQL databasen. Kör jag samma skript i Chrome gör den som den ska dvs skickar endast in en rad. Någon som har stött på samma problem och har en bra lösning på detta problem?

<?php


$servername = "localhost";
$username = "root";
$password = "mittlosen";
$dbname = "db";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "INSERT INTO produkter (nummer, benamning, grupp, produkttext, utpris, forsaljningsenhet, popular, lager, placeringsnr, status) values ('DH10006', 'Testprodukt','0101','Lite text om produkter kommer att skrivas här.','19','st','0','550','1','1')";

if ($conn->query($sql) === TRUE) {
	header("Location: index.php");
	exit;
} else {
 	echo "Error: " . $sql . "<br>" . $conn->error;
}

mysqli_close($conn);

?>


Stort tack på förhand!


#2

Låter som att samma request skickas två gånger. Hur testar du, skriva in adressen i adressfältet på browsern? I så fall blir det en GET och det kan mycket väl vara så att browsern skickar två requests. Bland annat kan CORS göra så att webbläsaren skickar en så kallad “preflight request” för att fråga om den får göra den riktiga requesten alls.

Generellt kan sägas också att man bör undvika att göra modifikationer i databaser när man använder GET i sin request, av specifikt den här anledningen. HTTP säger att GET måste vara idempotent, d.v.s. det får inte ändra resursen man hämtar. Det har också betydelse för sådant some cache-hanteringen, och är ganska viktigt att man följer. Använd istället POST för den här typen av requests.

Det kan vara värt att öppna dev tools i respektive browser och kolla nätverkstabben för att se vilka requests som görs.


#3

Det stämmer, för att testa koden så skrev jag in koden i URL fältet och körde skriptet. Chrome fungerar fint men Safari skickar in informationen dubbelt och din förklaring bekräftade det jag misstänkte.

Kanske en dum fråga men är det fortfarande en GET om man skriver in URL adressen till filen på en HREF tag? Isf menar du att man måste nå skriptfilen via ett FORM med POST attr för att undvika detta?


#4

Jepp, en <a href> kommer alltid skickas som GET medan en <form method="post"> skickas som POST. Notera att du måste sätta rätt method, annars kommer även formuläret skickas som GET. Kan rekommendera Mozilla’s dokumentation, tydlig och med lite goda exempel!