Avatar billede lesupport Nybegynder
20. juli 2009 - 20:44 Der er 14 kommentarer

Problem med spam på min side.

Hej eksperter!
Når man skriver en besked på min side og derefter "refresher" siden bliver den gamle besked gentaget. Hvad kan jeg gøre?

Min side hedder: www.innomaxx.dk

og php koden er:

      <?php
$query = 'SELECT * FROM comments ORDER BY datetimecreated DESC';
$result = mysql_query($query);
if(!$result)
{
    echo '<p style="color:#C00;">Could not retrieve guestbook entries.</p>';
}
else
{
    while($row = mysql_fetch_array($result))
    {
        echo '<p>';
        echo '<strong>'.$row['name'].'</strong><br />';
        echo date('F j, Y', strtotime($row['datetimecreated'])).' at '.date('g:i a', strtotime($row['datetimecreated'])).'<br />';
        echo $row['comments'];
        echo '</p>';
    }
}
?>

<?php
if(isset($_POST['process']) and $_POST['process']==1)
{
    $name = trim($_POST['name']);
    $comments = trim($_POST['comments']);

    $query = 'INSERT INTO comments SET
        name = "'.$name.'",
        comments = "'.$comments.'",
        datetimecreated = NOW()';

    if(mysql_query($query))
    {
        echo '<p style="color:#00F;">Thank you for signing our guestbook!</p>';
    }
    else
    {
        echo '<p style="color:#C00;">Sorry, your entry could not be submitted.</p>';
    }
}

?>
Avatar billede quiw Nybegynder
20. juli 2009 - 20:58 #1
Uden at vide ret meget om det:
Kunne man ikke lave således, at den tjekker om den første besked i databasen, svarer til den man submitter, og derfor afviser, hvis de er ens?

- Har da set nogle sider, hvor man ikke kan submitte den samme besked 2 gange :)
Avatar billede riversen Nybegynder
20. juli 2009 - 21:29 #2
håndter databaseopdateringen i en seperat fil eller lav en header( 'location: blabla.php' ) efter opdateringen for at få clearet de post variabler du laver tjek på.
Avatar billede lesupport Nybegynder
20. juli 2009 - 21:50 #3
Hej, det virker desværre ikke :s
tror du ikke jeg skal afslutte en session?

Et andet spørgsmål er bare, kan man lave en auto refresh funktion?
Avatar billede _skou_ Nybegynder
20. juli 2009 - 23:25 #4
Som riversen siger brug header('location: ').
Noget i stil med følgende burde virke.

<?php
if($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['process']) && $_POST['process']==1)
{
    $name = trim($_POST['name']);
    $comments = trim($_POST['comments']);

    $query = 'INSERT INTO comments SET
        name = "'.$name.'",
        comments = "'.$comments.'",
        datetimecreated = NOW()';

  header("Location: ".$_SERVER["PHP_SELF"]."?signed=".(mysql_query($query) ? "true" : "false"));
  exit;
}
$query = 'SELECT * FROM comments ORDER BY datetimecreated DESC';
$result = mysql_query($query);
if(!$result)
{
    echo '<p style="color:#C00;">Could not retrieve guestbook entries.</p>';
}
else
{
    while($row = mysql_fetch_array($result))
    {
        echo '<p>';
        echo '<strong>'.$row['name'].'</strong><br />';
        echo date('F j, Y', strtotime($row['datetimecreated'])).' at '.date('g:i a', strtotime($row['datetimecreated'])).'<br />';
        echo $row['comments'];
        echo '</p>';
    }
}

  if (isset($_GET["signed"]) {
    echo ($_GET["signed"] == "true" ?
          '<p style="color:#00F;">Thank you for signing our guestbook</p>' :
          '<p style="color:#C00;">Sorry, your entry could not be submitted.</p>');
  }
?>
Avatar billede repox Seniormester
21. juli 2009 - 09:09 #5
Du kan få noget at arbejde ud fra.

Grunden til at du kan reposte data ved at refreshe, er at du stadig har de aktuelle data i din HTTP request.

Det løses ved at hente siden ind igen med en ny GET request; ikke noget med nogle smarte GET variabler, sessions eller noget andet skidt.

Eksempel

minside.php
----
<?php

    include("filen med alle dine smarte funktioner, databaseforbindelser etc");

    if(isset($_POST["process]))
    {
        //Her indsættes kode der sætter relevante ting fra dine POST data
        //ind i din database.

        //Og her kommer magien:
        header("Location: ".$_SERVER["PHP_SELF"]);
        exit;
    }
?>
<html>
    <head>
        <title>...
----

Ved at bruge Location headeren åbner du den samme side som du er på ($_SERVER["PHP_SELF"]) via en ny GET request og dine POST data er ikke længere tilgængelige. Så vil en refresh af siden også kun være en ny GET request.
Avatar billede lesupport Nybegynder
22. juli 2009 - 18:23 #6
Hej! Jeg har prøvet at smide nogle af jeres koder ind på min side, men som i kan se, virker stadigvæk ikke.
Min kode nu ser således ud:

<?
include "include/db.php";
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html charset=windows-1252">

<title>ThinkPilot - skriv en besked til hele verden!</title>

<link rel="stylesheet" type="text/css" href="thinkpilot.css">

</head>
<body>


<div id="headframe">
</div>
<a href="http://www.innomaxx.dk"><div class="logoframe"></div></a>

<div class="textframe">
      <div class="writecontent">
      <form name="comments" action="index.php" method="POST">
      <table>
      <tr><td><p>Navn:</p></td><td><input type="text" name="name" /></td></tr>
      <tr><td><p>Din besked til verden:</p></td><td><textarea name="comments" rows="10" cols="40" ></textarea></td></tr>
      <input type="hidden" name="process" value="1" />
      <tr><td class="button"><input type="submit" value="GO!" /></td></tr>
      </table>
      </form>
      </div>
     
      <div class="mainframe">
      <?php
     
$query = 'SELECT * FROM comments ORDER BY datetimecreated DESC';
$result = mysql_query($query);
if(!$result)
{
    echo '<p style="color:#C00;">Could not retrieve guestbook entries.</p>';
}
else
{
    while($row = mysql_fetch_array($result))
    {
        echo '<p>';
        echo '<strong>'.$row['name'].'</strong><br />';
        echo date('F j, Y', strtotime($row['datetimecreated'])).' at '.date('g:i a', strtotime($row['datetimecreated'])).'<br />';
        echo $row['comments'];
        echo '</p>';
    }
}

?>

<?php

if(isset($_POST['process']) and $_POST['process']==1)
{
    $name = trim($_POST['name']);
    $comments = trim($_POST['comments']);

    $query = 'INSERT INTO comments SET
        name = "'.$name.'",
        comments = "'.$comments.'",
        datetimecreated = NOW()';
   
    header("Location: ".$_SERVER["PHP_SELF"]);
    exit;

    if(mysql_query($query))
    {
        echo '<p style="color:#00F;">Thank you for signing our guestbook!</p>';
    }
    else
    {
        echo '<p style="color:#C00;">Sorry, your entry could not be submitted.</p>';
    }
}


?>


      </div>
    </div>

</body>
</html>
Avatar billede repox Seniormester
22. juli 2009 - 22:00 #7
Du har jo sådan set heller ikke gjort som du har fået besked på, så det overrasker da ikke at det ikke virker.
Avatar billede lesupport Nybegynder
24. juli 2009 - 01:05 #8
Som i siger, skal jeg scripte en "header" funktion ind. Og det har jeg også gjort. Hvis du kigger rigtigt grundigt på mit script kan du se at jeg har tilføjet en header.

Omkring ved 14ende sidste linje.
Avatar billede repox Seniormester
24. juli 2009 - 08:43 #9
Der er ikke noget at kigge grundigt efter. Jeg har godt set du har smidt en header() ind i din kode. Og grunden til at det ikke virker er fordi du ikke har fulgt manualen omkring funktionen: http://php.net/header

Manualen fortæller dig at header() skal kaldes INDEN output. Output er en hvilken som helst form for tekst (HTML, CSS whatever).
Avatar billede lesupport Nybegynder
24. juli 2009 - 19:12 #10
Nu har jeg gjort det. Koden ser således ud:

<?php
header("Location: ".$_SERVER["PHP_SELF"]);
exit;
?>

<?php
include "include/db.php";
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html charset=windows-1252">


<title>ThinkPilot - skriv en besked til hele verden!</title>

<link rel="stylesheet" type="text/css" href="thinkpilot.css">

</head>
<body>
ovs......

Men når man går ind på min side, innomaxx.dk, vises denne besked:

"Cirkulær omdirrigeringsløkke

Firefox har opdaget at serveren henviser forespørgelsen for denne adresse på en måde så den aldrig vil blive færdig.

Browseren har afbrudt en forbindelse, fordi webstedet omdirrigerer forespørgsler til sig selv på en måde, der forhindrer det i nogensinde at blive færdig"
Avatar billede _skou_ Nybegynder
24. juli 2009 - 20:01 #11
Ja, det er klart. Du burde prøve at sætte dig lidt ind i hvad det er du har gang i.

header funktionen sender en HTTP header til klienten. Ved at angive header("Location: side.php") fortæller du klienten at den skal indlæse siden 'side.php'.

Du kan løse dit problem ved _først_ i PHP-scriptet at tjekke (if) om brugeren har lavet en POST forspørgsel, dvs. når brugeren har udfyldt en HTML form og send den. Inde i if-løkken behandler du så de sendte data, og når du er færdig med at behandle data, stadig inde i if-løkken, fortæller du klienten (browseren) at den gå til samme side (header("Location: ".$_SERVER["PHP_SELF"])).
Når du bruger header funktion vil de data som brugeren har sendt ikke længere være tilgængelig i brugerens browser. Husk at kalde exit efter kaldet til header funktionen.

Håber det kan give dig noget afklaring!
Avatar billede lesupport Nybegynder
25. juli 2009 - 00:53 #12
Okay har forstået det. Altså når man submitter gør php scriptet noget (if), og dér har jeg placeret headeren.


<?php
     
$query = 'SELECT * FROM comments ORDER BY datetimecreated DESC';
$result = mysql_query($query);
if(!$result)
{
    echo '<p style="color:#C00;">Could not retrieve guestbook entries.</p>';
}
else
{
    while($row = mysql_fetch_array($result))
    {   
        echo '<p>';
        echo '<strong>'.$row['name'].'</strong><br />';
        echo date('F j, Y', strtotime($row['datetimecreated'])).' at '.date('g:i a', strtotime($row['datetimecreated'])).'<br />';
        echo '<br>';
        echo $row['comments'];
        echo '</p>';
       
        header("Location: ".$_SERVER["PHP_SELF"]);
        exit;
    }
}

?>

Når man trykket "send" sender browseren variablerne til min database, og derefter bliver variablerne hentet og sat ind på min side. Efter denne proces burde browseren "refresh" sig selv.

Er mit script korrekt?
Avatar billede repox Seniormester
25. juli 2009 - 01:12 #13
Min tålmodighed rækker ikke længere; ikke om jeg begriber hvordan du kan misforstå noget så simpelt og slet og ret intet gøre af det vi fortæller dig!
Du har fået det serveret på et sølvfad adskillige gange nu!

Her: http://php.pastebin.com/m54fe5a63
Så skulle det være løst!
Avatar billede lesupport Nybegynder
25. juli 2009 - 01:24 #14
Haha okay slap helt af. Er rimelig ny indenfor php, såe. Nå nå men i hvert fald er problemet løst og jeg takker for jeres hjælp. :)
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