Avatar billede johnwies Nybegynder
20. januar 2002 - 08:02 Der er 15 kommentarer og
1 løsning

Undgå indsætning af samme data flere gange i MySQL ved opdatering af side i Browser.

Hej med jer.
Når jeg i php indsætter data via en form med
<form METHOD= POST ACTION=\"indsaetnybesked.php?titel=<? echo \"$titel\";?>&id=<? echo \"$id\";?>\">
Så includerer jeg i indsaetnybesked.php den fil der skal vise resultatet med de sidst opdaterede data fra MySQL, og det virker fint.
Problemet er bare, at hvis man så opdaterer siden med F5 eller opdaterknappen så indsættes de samme data igen i databasen.
Er der nogen der ved hvordan dette forhindres??
Avatar billede skwat Praktikant
20. januar 2002 - 08:25 #1
lave det som en ekstre php fil, dvs
action.php og det sidste der gøres her at at sende brugeren over til en anden side
Avatar billede rzj Nybegynder
20. januar 2002 - 10:28 #2
det er vel i database designet at du har problemet. Hvis du ikke ønsker redundans (samme tupler/rækker) flere gange, ja så skal du konstruere et db-design som tager højde for dette. Du kan jo evt. tjekke på det id du indsætter!!
Avatar billede htx98i17 Professor
20. januar 2002 - 10:32 #3
Avatar billede Noone Nybegynder
20. januar 2002 - 11:46 #4
Man kunne sætte en cookie, som man checker på, det vil tage det værste af problemet (Der er ikke ret mange der har cookies slået fra)
Avatar billede novellenet.dk Nybegynder
20. januar 2002 - 12:50 #5
chanoa >> Den går ikke, der skal et reload til før cookien bliver aktiv og så vil det alligevel blive submittet til db...

Det her er efter min mening den bedste måde at gøre det på.

### action.php ###

<?
ob_start(); // Output-buffering startes.

... Din HTML-form her ...

if(submit_knappen_er_trykket){
  if(input_er_ok){
    ... Alt som skal gøres hvis input er ok ...
    header(\"Location: $PHP_SELF?action=9&return=1\");
    exit;
  }
  else {
    header(\"Location: $PHP_SELF?action=9&return=0\");
    exit;
  }
}

if($action==9){
  switch($return){
    case 0:
      echo \"Input er ugyldigt...<br>Prøv igen.\";
    case 1:
      echo \"Input er sendt.<br>Tadaa!\";
    case DEFAULT:
      echo \"Gå væk...<br>Eller brug formen til submit.\";
  }
}

ob_end_flush(); // Output-bufferen tømmes.
?>
Avatar billede Noone Nybegynder
20. januar 2002 - 13:07 #6
Hmm.. Hvad med at slå op i databasen, og se om en post der ligner findes, INDEN nye data tilføjes? Der må da være et unikt felt i brugerdataene man kan slå op på eller?

Hvad er forresten forskellen på at loade samme side, med nye parametre, og så at loade en anden side?
Avatar billede novellenet.dk Nybegynder
20. januar 2002 - 13:14 #7
chanoa >> Det tager alt for lang tid at slå op i db hver gang der skal tilføjes nyt...

> Hvad er forresten forskellen på at loade samme side, med nye parametre, og så at loade en anden side?

Ikke stor, men man har det hele samlet på eet sted...
De ekstra parametre fortæller hvilken handling der er blevet udført, og om den blev udført korrekt...
Man kunne lige så godt loade en anden side med de nye parametre.

I det her tilfælde tjekkes input, hvis det er ok tilføjes det i db og man sendes videre til siden selv med beskeden om hvilken handling der blev udført og at den blev udført korrekt.
Hvis input ikke er ok, sendes man videre til siden selv, med besked om hvilken handling der blev udført, men at den ikke blev udført korrekt...

Så kan man lave en lille notits til sine brugere om udfaldet af handlingen...
Avatar billede novellenet.dk Nybegynder
20. januar 2002 - 13:19 #8
Avatar billede johnwies Nybegynder
20. januar 2002 - 14:15 #9
Er det sådan her?
<?
ob_start(); // Output-buffering startes.

if ((($id)&&($besked)&&($titel))){

    $db = mysql_connect(\"localhost\", \"root\", \"\");
            mysql_select_db(\"skok\", $db);
    $query = mysql_query(\"INSERT INTO opkald (Kundeid, medarbid, besked)VALUES (\'$titel\',\'$id\',\'$besked\')\");
    mysql_close($db);
    $kundeid = $titel;
    unset ($id, $besked, $titel);
    include (\"result.php\");
    echo $besked;
  header(\"Location: $PHP_SELF?action=9&return=1\");
} // end if ($besked)
ob_end_flush(); // Output-bufferen tømmes.
?>
Avatar billede novellenet.dk Nybegynder
20. januar 2002 - 15:44 #10
Ja, det vil jeg mene skulle virke...
Hvis du så indsætter følgende i samme script:
<?
if($action==9 && return=1){
  echo \"Operation fuldført...\";
}
?>
Så vil den skrive \"Operation fuldført...\" når den har reloadet, bare for at bekræfte at handlingen blev udført.

Hvis bekræftelsen er ligegyldig så kan du godt fjerne \'action=9&return=1\' fra \'header(\"Location: ... );\'.

Der er ikke meget andet at gøre end at prøve sig frem...
Ellers spørg igen.
Avatar billede johnwies Nybegynder
20. januar 2002 - 16:07 #11
Jeg forsøger, så vender jeg tilbage.
Avatar billede johnwies Nybegynder
20. januar 2002 - 16:44 #12
Jeg gjorde det sådan:
<?
ob_start(); // Output-buffering startes.
if ((($id)&&($besked)&&($titel))){
    $db = mysql_connect(\"localhost\", \"root\", \"\");
            mysql_select_db(\"skok\", $db);
    $query = mysql_query(\"INSERT INTO opkald (Kundeid, medarbid, besked)VALUES (\'$titel\',\'$id\',\'$besked\')\");
    mysql_close($db);
header (\"Location: result.php?titel= $titel\");
} // end if ($besked)
ob_end_flush(); // Output-bufferen tømmes.
?>

Det var åbenbart bare headeren der skule bruges:-).
novellenet kom lige med en kommentar til det med headeren, så får du dine velfortjente point :-)
Avatar billede novellenet.dk Nybegynder
20. januar 2002 - 20:57 #13
Hvad er det du vil have mig til at sige om headeren?
Avatar billede johnwies Nybegynder
20. januar 2002 - 20:59 #14
Den der header, er det en der modtages af et ny browservindue med eft. variabler og andet??
Avatar billede novellenet.dk Nybegynder
20. januar 2002 - 21:11 #15
Well, header(\"Location: result.php?titel=$titel\");

Den sender en HTTP-header (302 - redirect) til klienten, så bliver browseren sendt til siden result.php med et GET-request, d.v.s. at variablen \'$titel\' overføres via URL\'en...
Urlen \'result.php?titel=laks\' sender variablen $titel med værdien \"laks\" til siden result.php...
Så du i result.php kan skrive f.eks.
<?
if(isset($titel)){
    echo $titel.\"<br>\";
}
?>

Var det nok?
:)
Avatar billede johnwies Nybegynder
20. januar 2002 - 21:13 #16
Ja tak, nu forstår jeg det bedre, og du har jo fået pointene.
Mange tak for hjælpen
:o)
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