Insert in MySQL

Status
Niet open voor verdere reacties.

ManuNeko

Gebruiker
Lid geworden
24 jun 2009
Berichten
110
Ik heb een form gemaakt om een melding in een MySQL database te inserten. De insert op zich is geen probleem, maar als ik nadien op de refresh druk, wordt dezelfde melding nogmaals geinsert. Kan iemand mij uitleggen hoe ik dit vermijd?

PHP:
if (isset($_POST['btnEnter']))
  {
    $dbh = mysql_connect($hostname, $domein . $username, $password)  or die("Unable to connect to MySQL");
    $selected = mysql_select_db($domein . $database,$dbh) or die("Could not select " . $domein . $database);
    mysql_query("Insert Into Meldingen (Melding, MeldUser, Afgehandeld) Values ('" . $_POST['melding'] . "', 'elaur', 0)") or die('Error, insert query failed: ' . mysql_error());
	mysql_close($dbh);
	unset($_POST['btnEnter']);
  }


Bijkomende vraag: kan ik de netwerk user ophalen in PHP?
 
Beste ManuNeko,

Als ik allereerst even een kanttekening op je code mag maken:

De manier die je nu hanteert is gevoelig voor SQL injectie. Dit komt omdat je direct de "POST" data in je database stopt.

Wat ik persoonlijk zou doen is de $_GET['POST'] waarde eerst in een variable zetten en hier wat SQL preventie zaken mee uitvoeren. Bijvoorbeeld alle ' escapen met een \.

Google even wat op SQL injection prevention oid en je vindt genoeg suggesties.

Dan even over je probleem:

Je kan het op verschillende manieren oplossen.

A: je kunt na het submitten van een form die succesvol is een redirect doen naar een bevestigingspagina: vb: "Bedankt, uw melding is succesvol toegevoegd.
B: Je kunt na het toevoegen je form "Clearen" -> er van uit gaande dat je het formulier controleert dat de waardes niet leeg zijn.
C: als laatste kun je bijvoorbeeld eerst een check doen of de melding reeds in de database staat.

Ik weet niet of dit de netste manier is maar het geeft je een idee:

$result = mysql_query("SELECT * FROM Meldingen where melding = 'HIER DE INVOER'");
$num_rows = mysql_num_rows($result);

if($num_rows > 0)
{
melding bestaat al --> niet toevoegen dus
}
else{
Melding toevoegen
}
 
Je kan ook de cache leeg maken elke keer als de pagina gerefresh wordt, er is dan dus nog niet op de knop geklikt

gr MouNt
 
Maar waarom werkt die unset() in mijn code dan niet? Dat zou toch ook die button moeten clearen?
 
Je unset wordt na de query op dezelfde pagina gedaan. Maar als iemand op F5 drukt, stuurt hij gewoon alle informatie nog een keer naar de browser, inclusief een nieuwe kopie van de knoppen waar op gedrukt is.

Als je niet wil dat refresh kun moet je een unieke code op de pagina zetten die gecontroleerd wordt bij inzenden om te zien of die pagina al eerder is binnengekomen. Het makkelijkste is om dat in de sessie van de user te zetten. Als je die niet gebruikt, dan kun je het ook in de database plaatsen.

PHP:
session_start();
if ( $_POST['hidden_code'] == $_SESSION['hidden_code'] ) {
  // opnieuw ingezonden; negeren.
}
else {
  // uitvoeren en nieuwe hidden code opslaan.
  $_SESSION['hidden_code'] == $_POST['hidden_code'];
  // rest van je insert code komt hier
}

// hidden code maken en op de pagina plaatsen. Pas op dat je dit wel in de form zet.
echo '<input type="hidden" name="hidden_code" value="' . md5(rand()) . '" />';


Als de gebruiker nu opnieuw op de knop drukt (bewust opnieuw inzenden) werkt het wel. Als de gebruiker op F5 drukt, wordt de inzending genegeerd.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan