Avatar billede mltrfan Nybegynder
09. november 2006 - 12:38 Der er 13 kommentarer og
1 løsning

gentager sidste indlæg i databasen

Hvorfor gentager den mine oplysninger jeg lige har sat i databasen når jeg trykker F5? Jeg kan ikke huske hvordan man for den til kun og sætte det ind 1 gang og kommer frem med det samme unden og gentage hvergang siden refresh.
dette er min kode lige nu
*****************************************************
<?
include("db.inc.php");   
include("style.php");   
?>
<html>
<head>
</head>
<body>
<?

if (isset($_POST[skriv])){
   
$sql= mysql_query("SELECT * FROM weblog") or die(mysql_error());

while ($data=mysql_fetch_array($sql)) {
       
        echo "<b>".$data["navn"];
        echo $data["besked"]."<br>";
}
    }
    $navn=$_POST["navn"];
    $besked=$_POST["besked"];
   
mysql_query("INSERT INTO weblog(navn,besked)VALUES('$navn','$besked')");

?>
<form method="POST" action="<? echo $PHP_SELF;?>">
<table>
<tr>
<td><h2>Skriv besked</h2></td><td></td>
</tr>
<tr>
<td>Navn:</td><td><input type="text" name="navn"></td>
</tr>
<tr>
<td>Besked:</td><td><textarea rows="6" cols="22" name="besked"></textarea></td>
</tr>
<tr>
<td><input type="submit" name="skriv" value="Skriv" class="knap"></td>
<td><input type="reset" value="Slet alt" class="knap"></td><td>&nbsp;</td>
</tr>
</table>
</form>                                                          </body>
</html>
*****************************************************************
Er der nogle der kan hjælpe
Hilsen mltrfan
Avatar billede fixxxer Nybegynder
09. november 2006 - 13:07 #1
Forslag:

<?
include("db.inc.php"); 
include("style.php"); 

if (isset($_POST[skriv])){
        $navn=mysql_real_escape_string($_POST["navn"]);
        $besked=mysql_real_escape_string($_POST["besked"]);

    mysql_query("INSERT INTO weblog(navn,besked)VALUES('$navn','$besked')");
    header('Location: '.$_SERVER['PHP_SELF']);
}
?>
<html>
<head>
</head>
<body>
<?
    $sql= mysql_query("SELECT * FROM weblog") or die(mysql_error());

    while ($data=mysql_fetch_array($sql)) {
            echo "<b>".$data["navn"];
            echo $data["besked"]."<br>";
    }
?>
<form method="POST" action="<? echo $PHP_SELF;?>">
<table>
<tr>
<td><h2>Skriv besked</h2></td><td></td>
</tr>
<tr>
<td>Navn:</td><td><input type="text" name="navn"></td>
</tr>
<tr>
<td>Besked:</td><td><textarea rows="6" cols="22" name="besked"></textarea></td>
</tr>
<tr>
<td><input type="submit" name="skriv" value="Skriv" class="knap"></td>
<td><input type="reset" value="Slet alt" class="knap"></td><td>&nbsp;</td>
</tr>
</table>
</form>
</body>
</html>


Jeg har ændret i strukturen og flyttet den del der foretager INSERT øverst før der bliver sendt headers. På den måde kan der afvikles en header der fortæller den at gå til samme side, og herefter vil der på en refresh af siden ikke indsættes en række i tabellen.
Avatar billede fixxxer Nybegynder
09. november 2006 - 13:08 #2
Bemærk i øvrigt at jeg har benyttet mysql_real_escape_string() på de data der skal skrives til tabellen, for at undgå sql-injections.
Avatar billede mltrfan Nybegynder
09. november 2006 - 13:17 #3
okay nu skriver den

Warning: Cannot modify header information - headers already sent by 
og så siden navn.

og hva betyder mysql_real_escape_string() på dansk
Avatar billede mltrfan Nybegynder
09. november 2006 - 13:27 #4
og hvis man trykker F5 sætter den teksten ind igen og igen. er det mig der  er dum og ikke forstår det her
Avatar billede benson Nybegynder
09. november 2006 - 14:25 #5
Det er vel fordi den POST'er dataene igen.
Er det ikke den sidste ACTION du foretog inden du trykkede F5 ? Og så er det også den action F5 kører igen.
Avatar billede benson Nybegynder
09. november 2006 - 14:26 #6
Jeg ville kalde siden igen efter insert, så den kan starte forfra uden data i POST !
Avatar billede fixxxer Nybegynder
09. november 2006 - 14:51 #7
Hvilket netop er hvad mit eksempel gør !-)

Hvis du har copy/pasted mit eksempel og du får en "headers already sent" så vil jeg tro at en af dine to forgående include() indeholder noget der får serveren til at sende headers (fx noget stylesheet)

Så lad os i stedet prøve:


<?
include("db.inc.php");

if (isset($_POST[skriv])){
        $navn=mysql_real_escape_string($_POST["navn"]);
        $besked=mysql_real_escape_string($_POST["besked"]);

    mysql_query("INSERT INTO weblog(navn,besked)VALUES('$navn','$besked')");
    header('Location: '.$_SERVER['PHP_SELF']);
    exit();
}

include("style.php");
?>
<html>
<head>
</head>
<body>
<?
    $sql= mysql_query("SELECT * FROM weblog") or die(mysql_error());

    while ($data=mysql_fetch_array($sql)) {
            echo "<b>".$data["navn"];
            echo $data["besked"]."<br>";
    }
?>
<form method="POST" action="<? echo $PHP_SELF;?>">
<table>
<tr>
<td><h2>Skriv besked</h2></td><td></td>
</tr>
<tr>
<td>Navn:</td><td><input type="text" name="navn"></td>
</tr>
<tr>
<td>Besked:</td><td><textarea rows="6" cols="22" name="besked"></textarea></td>
</tr>
<tr>
<td><input type="submit" name="skriv" value="Skriv" class="knap"></td>
<td><input type="reset" value="Slet alt" class="knap"></td><td>&nbsp;</td>
</tr>
</table>
</form>
</body>
</html>
Avatar billede fixxxer Nybegynder
09. november 2006 - 14:53 #8
Mht. mysql_real_escape_string()

http://dk2.php.net/manual/da/function.mysql-real-escape-string.php

Kort fortalt handler det om at sikre at en ondsindet person ikke "bryder" ens SQL kald til databasen, og sender egne instrukser afsted mod databasen i et forsøg på at opsnappe data eller destruere data.
Avatar billede fixxxer Nybegynder
09. november 2006 - 14:54 #9
Det hedder som sagt sql-injections (sql-indsprøjtninger om man vil) og der findes masse af læsestof om det, som man bør sætte sig ind i hvis man vil undgå ærgelser på et senere tidspunkt (fx en "hacked" gæstebog og eller slettet blog)
Avatar billede benson Nybegynder
09. november 2006 - 15:10 #10
fixxxer> Det kunne jeg ikke lige se dit eksempel gjorde. Sådan som jeg så det, så tjekkede den POST[skriv], og den vil jo være sand for hver F5.
Men jeg kan se du har fået en exit() kommando ind. Er det den der gør det ? eller er det kombinationen med "header('Location: '.$_SERVER['PHP_SELF']);" ?
Avatar billede fixxxer Nybegynder
09. november 2006 - 15:27 #11
Egenlig var det en forglemmelse at jeg ikke fik exit() med på mit første eksempel.

header() funktionen bruges til at skrive headers til browseren.

header('Location: '.$_SERVER['PHP_SELF']); fortæller browseren at den skal fortsætte til den angivne side og ikke blot "gå i stå" efter en post.

Alternativt kan man POST'e til en anden side der behandler data og insert'er i databasen og derefter bruger header('Location: ...') til at sende tilbage til formularen.

Der findes unægteligt tekster og dokumentation der kan forklare det bedre end jeg kan,  men nu har jeg forsøgt :)
Avatar billede mltrfan Nybegynder
09. november 2006 - 18:08 #12
Mange tak Fixxxer nu virker det.
Liger du et svar så jeg kan give point
Avatar billede fixxxer Nybegynder
10. november 2006 - 07:38 #13
Svar
Avatar billede mltrfan Nybegynder
10. november 2006 - 07:40 #14
point til dig og mange tak for hjælpen
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