Avatar billede NielsErikP Mester
29. september 2011 - 21:42 Der er 39 kommentarer og
3 løsninger

PHP/MySQL... Indlægget findes allerede, når browser opdateres på F5!!!

Hej...
Har et problem jeg ikke lige kan se, hvad skyldes...
Når jeg kalder min gæstebog, filen gb3.php og skriver navn website og besked og trykker "submit" - knappen, sætter den indlægget ind i en MySql database og rydder mine <input> felter.
Hvis jeg op daterer på adresselinjens runde pil(http:// localhost/gb3php), skriver den denne besked :


  echo "<p style='margin-top:0;margin-left:50px;color:red;' >Indlægget findes allerede, og blev ikke gemt igen.</p>";



Men vælger jeg mit menu punkt "Gæstebog" som også refererer til "/gb3.php" skriver den ikke ovenstående linje om at indlægget allerede findes..!!






/* Der spam-tjekkes og navn og besked hentes i html formularen.  */   
    if(isset($_POST["skriv"]) &&  strtolower($_POST["spamtjek"]) == "grøn"){
        $navn = htmlspecialchars($_POST["navn"]); 
        $besked  = htmlspecialchars($_POST["besked"]);
        $website  = htmlspecialchars($_POST["website"]);
       
/*Tjekker om begge felter er udfyldt*/       
        if($navn != "" || $besked != ""){
               
/* Sikkerheds script mod SQL injektions*/
            $navn = mysql_real_escape_string($navn);
            $besked = mysql_real_escape_string($besked);
           
           
            if($website != "") {   
/* Der tester på om navn og besked er postet før. For at undgå ens indlæg, når man  opdaterer  siden */
                $website = mysql_real_escape_string($website);
                $sql = "SELECT * FROM bog ";
                $sql .= "WHERE navn = '" . $navn . "' ";
                $sql .= "AND  besked = '" . $besked ."' ";
                $sql .= "AND  website ='" . $website ."' ";
                $result= mysql_query($sql);
            }else{
                $sql = "SELECT * FROM bog ";
                $sql .= "WHERE navn = '" . $navn . "' ";
                $sql .= "AND  besked = '" . $besked ."' ";
                $result= mysql_query($sql);
            }
           
           
            if($row = mysql_fetch_row($result)){
                echo "<p style='margin-top:0;margin-left:50px;color:red;' >Indlægget findes allerede, og blev ikke gemt igen.</p>";
            }else{
                $dato_array=getdate();            //php datofunktion
                $dato = $dato_array["mday"] . "/" . $dato_array["mon"] . " - " . $dato_array["year"];
                $hours = ($dato_array["hours"] < 10)  ? '0'. $dato_array["hours"] : $dato_array["hours"];
                $minut = ($dato_array["minutes"] < 10)  ? '0'. $dato_array["minutes"] : $dato_array["minutes"];
                $sec  =  ($dato_array["seconds"] < 10)  ? '0'. $dato_array["seconds"] : $dato_array["seconds"];     
                $tid = $hours . ":" .$minut . ":" .$sec;
                mysql_query("INSERT INTO bog(navn, dato, besked, tid, website) VALUES('$navn','$dato','$besked','$tid','$website')") or die(mysql_error());  //data skrives til tabellen bog
            }
        }   
    }



Håber der er nogen der kan hjælpe mig med at lokalisere fejlen..!!


På forhånd tak!!!
Avatar billede kjeldsted Novice
29. september 2011 - 21:44 #1
Der er fordi når du opdatere siden via. browseren opdatering sender den også POST info til serveren igen. Så der er ikke tale om en fejl, men blot en måde man altid har bygget browsere på. Om hvorvidt den funktion er smart kan jo så altid diskuteres.
Avatar billede kjeldsted Novice
29. september 2011 - 21:50 #2
Man kan godt skrive et stykke kode til at undgå at man forespørger serveren igen (ligesom der fx. er hér på eksperten), men det er faktisk lang tid siden jeg selv fandt på en sådan funktion, så kan faktisk ikke lige huske hvordan jeg gjorde dét.
Avatar billede majbom Novice
29. september 2011 - 21:55 #3
når jeg laver sådanne funktioner, laver jeg det i en anden fil, som så redirecter til den side man nu vil have vist efter indlægget er postet. på den måde opdaterer du siden der vises efter indlægget er postet, og ikke siden der poster indlægget...
Avatar billede hansepeter2 Praktikant
29. september 2011 - 21:55 #4
form > php > form

er sådan man plejer at gøre det. header("Location: xxx") bruges til at gå fra php > form.

Så er problemet ude af verden.
Avatar billede kjeldsted Novice
29. september 2011 - 22:02 #5
Ah, ja hansepeter2. Det er jo da det jeg plejer at gøre, ja. Simpelt, men effektivt.
Avatar billede majbom Novice
29. september 2011 - 22:02 #6
-> #4 - præcis! en kortere forklaring af #3 :)
Avatar billede kjeldsted Novice
29. september 2011 - 22:07 #7
#3 (/#6): Man kan jo teoretisk set også bare henvise til den side man er på hvis man gerne vil holde det hele i en fil.

Hvis altså formen peger på "sig selv".
Avatar billede hansepeter2 Praktikant
29. september 2011 - 22:10 #8
Ja, bare den bygges korrekt op. F.eks.:

<?php

if($_SERVER['REQUEST_METHOD'] == 'POST'){

    // indsæt i database

    header("Location: ".$_SERVER['PHP_SELF']);
    exit();
}

?>

<form method="post" action="<?php echo $_SERVER['PHP_SELF'] ?>">
<input type="submit">
</form>
Avatar billede NielsErikP Mester
29. september 2011 - 22:49 #9
Hej..
Tak for jeres hurtige svar :-)

#3: Ja..Det lyder fornuftigt, er lidt ny i php, så må se om jeg ved, hvad der skal til for at redirecte siden.

#4:
Det du siger, er det at det er i min html form problemet ligget???

#8:
Ja..Tak for dette..en del for en newbie at kigge og forstå...
En hel del fordefineret php Konstanter!!!
Avatar billede coderdk Praktikant
30. september 2011 - 01:54 #10
Efter indsæt:

header( "303 See Other HTTP/1.1", true, 303 );
header( "Location: " . $_SERVER['REQUEST_URI'] );
exit;

"303 See Other" tvinger GET request uden cache :-)
Avatar billede majbom Novice
30. september 2011 - 07:58 #11
det kan også være praktisk at holde det hele i en fil, alt efter hvordan man håndtere evt. form-validering...
Avatar billede NielsErikP Mester
30. september 2011 - 11:33 #12
Hej...
#10:
Efter indsæt???? Mener du efter min INSERT query til Databasen.

#11:
Tror nok jeg er rimelig ny i PHP og MySql :-) , så jeg vil da prøve at smide lidt mere kode, hvis det er det du menr med form validering, ellers er der kode i #0 til dem der vil hjælpe...
Resten af koden i gæstebog:


    <form  method="post" id="gaestbog" action="/gb3.php">
            <p>
                <input type="hidden" name="skriv" value="1">
                <span class="input_label_str">Navn:</span><br>
                <input type="text" name="navn" size="35"> <br>
                <span class="input_label_str">WebSite:</span><br>
                <input type="text" name="website" size="35"> <br>
                <span class="input_label_str">Besked:</span> <br>
                <textarea name="besked" cols="50" rows="10"></textarea>
                <br> <br>
                <span style="color:green; font-size:16px;">Gengiv koden : </span> <br>
                <?php echo "<img src='SkabBG1.php?R=$R&G=$G&B=$B'>" ?> <br> <br>
                <input style="text-align:center; font-size:15px; font-weight:bold; height:27px; <?php echo "color: rgb($R,$G,$B)"?>;" type="text" name="spamtjek" size="18">
                <br><br>
                <button name="submit" type="submit" style="margin-left:19px; background:transparent; border:0;" value="Send">
                        <img src="billeder/send1.png" onmouseover="this.src='billeder/send1MO.png';" onmouseout="this.src='billeder/send1.png';" ></button>       
               
            </p>
    </form>

<?php
   
    $foresp = mysql_query("SELECT navn, dato, besked, tid, website FROM bog ORDER BY nr DESC") or die(mysql_error()); //Data hentes i tabellen bog
    echo "<table id=\"table_brief\">";
   
    while($data = mysql_fetch_array($foresp)){
        echo "<tr><td id=\"td1_stil\" >";
        echo "<b>" . $data["navn"];
        echo "</b><br />";
        echo "<b>" . $data["website"];
        echo "</b><br>";
        echo "<span class=\"span2_farve\">Dato:</span><span class=\"span1_farve\">
            " .$data["dato"] ."</span><br />";
        echo "<span class=\"span2_farve\">Kl: </span><span class=\"span1_farve\">
            " .$data["tid"] ."</span>";
        echo "</td><td id=\"td2_stil\" >";
        echo nl2br($data["besked"]);  //nl2br = newline oversættes til html breaktag.
        echo "</td></tr>";
    }
    echo "</table>";

Avatar billede coderdk Praktikant
30. september 2011 - 11:40 #13
Ja, efter din INSERT-statement :)
Avatar billede NielsErikP Mester
30. september 2011 - 12:00 #14
Hej..
Okay..Så mener du dit svar i #10 skulle være nok og man evt. ikke behøver gå ud i #8????
Avatar billede coderdk Praktikant
30. september 2011 - 12:07 #15
Det burde være nok ja :)
Avatar billede NielsErikP Mester
30. september 2011 - 12:19 #16
Hej...
Hvordan mht. til ingen <html> tags, echo, print før en header statement???
Avatar billede majbom Novice
30. september 2011 - 12:24 #17
-> #16 - du kan jo bare gøre det inden der bliver skrevet noget til browseren...
Avatar billede NielsErikP Mester
30. september 2011 - 12:30 #18
Hej..
#17: Jamen Denne gb3.php starter med en Doctype, html, head, title, body--- tags, som du kan se kommer INSERT statementen først et godt stykke nede i filen... Er jeg helt forkert på den, ville det være forrygende, hvis i lige retter mig....Inden jeg får tillært mig noget forkert :-)
Avatar billede majbom Novice
30. september 2011 - 12:46 #19
kan du ikke bare flytte din insert op i toppen af filen?
Avatar billede NielsErikP Mester
30. september 2011 - 23:24 #20
Hej..
#19:
Nej..splazz, det er ikke så hensigtsmæssigt for layoutet på min side, det var noget med at placere meddelsen "Indlægget findes allerede, og blev ikke gemt igen." korrekt uden brug af position:absolute, så derfor denne placeringen i mit script.

Men helt nøjagtigt, hvad starter jeg med at kigge på for at få skrevet den stump kode, anden fil eller ej ????
Avatar billede kjeldsted Novice
30. september 2011 - 23:28 #21
#20:

Derfor kan du da godt flytte PHP delen af inserten op i toppen??? Meddelsen "Indlægget findes bla bla...." kan jo bare gemmes i en variabel i toppen og udskrives senere?
Avatar billede NielsErikP Mester
30. september 2011 - 23:41 #22
Hej..
#21:
Kjeldsted har du kigget min kode??? Det der er med det er at jeg tjekker med den php del og indlægget, hvis det gør udskriver den "indlægget findes bla bla bla", der hvor den står html mæssigt, og hvis ikke gemmer den med INSERT i databasen. I starten havde jeg den php del i toppen af dokumentet, men den udskrev sætningen som det første i dokumentet og skubbede min hjemmeside ned. Så eneste løsning uden brug af position:absolute var at flytte php delen til, hvor den står nu.

Er der noget jeg misforstår, så forklar venligst!!!
Avatar billede kjeldsted Novice
30. september 2011 - 23:49 #23
Du kan jo i stedet for i toppen at have en echo "fejl" kan du jo skrive $error = "fejl" og så det sted på siden hvor fejlmeddelsen skal vises kan du jo så skrive echo $error. Så vil meddelsen ikke blive vist i toppen med lige hvor du ønsker, og du slipper for at skulle ud i noget rod med ob_start() for at få header() til at virke.
Avatar billede NielsErikP Mester
01. oktober 2011 - 00:35 #24
Hej...
Puha..Du misforstår mig, Kjeldsted!!!
Se lige denne lidt reduceret IF sætning, hvor både min "Fejlmelding" og min"INSERT" sætning er en del af :


if($row = mysql_fetch_row($result)){
                echo "<p style='margin-top:0;margin-left:50px;color:red;' >Indlægget findes allerede, og blev ikke gemt igen.</p>";
            }else{

                mysql_query("INSERT INTO bog(navn, dato, besked, tid, website) VALUES('$navn','$dato','$besked','$tid','$website')") or die(mysql_error());  //data skrives til tabellen bog
            }
        }   




Det er Denne IF sætning der står rigtigt for udskrivning eller gem...Og om min ECHO sætning ser sådan ud :


echo "<p style='margin-top:0;margin-left:50px;color:red;' >Indlægget findes allerede, og blev ikke gemt igen.</p>";



Eller den ser sådan ud i IF sætningen:


  echo Variable;



ER sådan set "Et Fedt", der giver det samme!!!
Avatar billede kjeldsted Novice
01. oktober 2011 - 00:50 #25
Enten er jeg fuldstændig 100% overhovedet ikke med her, eller også misforstår du mig ;)

Det jeg tænkte var at du i toppen af siden laver din insert i PHP altså:

if($row = mysql_fetch_row($result)){
                $error = "<p style='margin-top:0;margin-left:50px;color:red;' >Indlægget findes allerede, og blev ikke gemt igen.</p>";
            }else{

                mysql_query("INSERT INTO bog(navn, dato, besked, tid, website) VALUES('$navn','$dato','$besked','$tid','$website')") or die(mysql_error());  //data skrives til tabellen bog
            }
        }


Og at du så der hvor du nu ønsker at fejlmeddelsen skal stå skriver:

echo $error;


Eller snakker vi om at det er lavet i to forskellige filer eller hvad er det jeg ikke har forstået.
Avatar billede NielsErikP Mester
01. oktober 2011 - 01:31 #26
Hej..
Nej.. Jeg forstår dig godt!!! Men det er jo, hvis denne er TRUE


      ($row = mysql_fetch_row($result))



At $error skal udskrives, hvis den er FALSE :


  mysql_query("INSERT INTO bog(navn, dato, besked, tid, website) VALUES('$navn','$dato','$besked','$tid','$website')") or die(mysql_error());  //data skrives til tabellen bog



Nåååeh... Nu tror jeg der er gået noget op for mig, så vil du der hvor indlægget skal stå HTML mæssigt på siden igen spørge :


    if($row = mysql_fetch_row($result)){
                echo $error ;
            }



Forstår jeg dig rigtigt????
Avatar billede NielsErikP Mester
01. oktober 2011 - 01:41 #27
Hej..
Har vist nævnt jeg er ny indenfor PHP/MySQL...
Så vil samtidig lige høre med PHP kode, har du en php fil med følgende php dele :
A
B
C

Er det så lige meget om du putter det sådan i filen :
C
B
A

Vil den stadig fungere???
Avatar billede kjeldsted Novice
01. oktober 2011 - 01:43 #28
Jeg kan simpelthen ikke forstå hvordan det kan være det samme. Og nej. Jeg vil ikke lave den if sætningen hvor du vil have udskrevet fejlmeddelsen.

Der hvor fejlen skal udskrives skriver du blot
echo $error;


I toppen af siden, hvor du indsætter data i databasen skriver du
if($row = mysql_fetch_row($result)){
                $error = "<p style='margin-top:0;margin-left:50px;color:red;' >Indlægget findes allerede, og blev ikke gemt igen.</p>";
            }else{

                mysql_query("INSERT INTO bog(navn, dato, besked, tid, website) VALUES('$navn','$dato','$besked','$tid','$website')") or die(mysql_error());  //data skrives til tabellen bog
            }
        }


Hvis alt er som det skal være vil den indsætte data i databasen og ikke gøre andet ved det. Hvis så indlægget allerede har været gemt, så vil den ikke indsætte indlægget endnu engang, men derimod lave en variabel med en fejlmeddelse. Denne fejlmeddelse vil så blive udskrevet længere nede i dokumentet.

Hvis der har været en fejl vil fejlmeddelsen være:
<p style='margin-top:0;margin-left:50px;color:red;' >Indlægget findes allerede, og blev ikke gemt igen.</p>


Hvis IKKE der er sket en fejl, vil den ganske vist stadig udskrive $error, men eftersom $error intet indeholder vil den kun udskrive.
Avatar billede kjeldsted Novice
01. oktober 2011 - 01:46 #29
Og #27:

Slet ikke forstået!

Altså hvis du sætter en variabel skal den jo sættes før den kan læses, hvis det er det du tænker på?

Hvis du tænker på funktioner kan de teoretisk set godt sætte efter den linje hvor de skal bruges. Dog god skik at lave sine funktioner øverst og i logisk rækkefølge.

Er det, dét du mener?
Avatar billede NielsErikP Mester
01. oktober 2011 - 11:09 #30
Hej...
Ja, Selvfølgelig $error er tom, men udskrives alligevel!!

#27:
Mener om rækkefølgen af php dele i en fil er ligegyldig???
Avatar billede majbom Novice
01. oktober 2011 - 12:38 #31
if($error != "")
{
  echo $error;
}


?

jeg kan kun være enig med kjeldsted her
Avatar billede kjeldsted Novice
01. oktober 2011 - 12:56 #32
#30:

Hvis du er bange for i PHP at udskrive en tom variabel så gør som #31. Det gør absolut ingen forskel da PHP ikke stoppe eksekveringen af scriptet hvis en variabel ikke er initialiseret og er sat til en værdi, modsat andre programmeringssprog.

Og jeg er stadig ikke helt med.

Altså fx.
$var = 4;
$var++;
echo $var;

Er jo sjovt nok ikke det samme som
$var = 4;
echo $var;
$var++;


Det første vil jo retunere 5 mens den anden vil retunere 4.

Om du skriver
function writeHello()
{
    return "Hello World!";
}

writeHello();


Eller
writeHello();
function writeHello()
{
    return "Hello World!";
}


Burde teoretisk set være ligegyldigt. Men der er ikke ret god skik at skrive sine funktioner hulter til bulter. De skal, om muligt, ligge i toppen af siden.

Hvis du skriver
if($row = mysql_fetch_row($result)){
                $error = "<p style='margin-top:0;margin-left:50px;color:red;' >Indlægget findes allerede, og blev ikke gemt igen.</p>";
            }else{

                mysql_query("INSERT INTO bog(navn, dato, besked, tid, website) VALUES('$navn','$dato','$besked','$tid','$website')") or die(mysql_error());  //data skrives til tabellen bog
            }
        }
...
echo $error;


Vil du også få et andet resultat end


echo $error;
...
if($row = mysql_fetch_row($result)){
                $error = "<p style='margin-top:0;margin-left:50px;color:red;' >Indlægget findes allerede, og blev ikke gemt igen.</p>";
            }else{

                mysql_query("INSERT INTO bog(navn, dato, besked, tid, website) VALUES('$navn','$dato','$besked','$tid','$website')") or die(mysql_error());  //data skrives til tabellen bog
            }
        }


Men et kort svar på spørgsmålet er selvfølgelig NEJ! Det er jo ikke ligegyldigt. Det er heller ikke ligegyldigt i hvilken rækkefølge man tager en opskrift på at bage brød. Men nogle af trinene kan teoretisk set godt byttes om på uden det får betydning.
Avatar billede NielsErikP Mester
01. oktober 2011 - 12:56 #33
Hej..
Ja..Det er jeg også blevet, enig med kjeldsted :-) Men skulle lige have den vendt oppe i hovedet..Håber det er ok ;-)
Avatar billede NielsErikP Mester
01. oktober 2011 - 13:37 #34
Hej..
#33:
OKAY!! Tak.

Nu har jeg prøvet at flytte scriptet op i starten efter min DOCTYPE og lavet ECHO sætningen i min IF statement om til $error!! Når jeg kalder siden gb3.php får jeg følgende meddelse :
FEJL 1:


    Notice: Undefined variable: error in C:\xampp\htdocs\gb3.php on line 144



Indtil jeg udfylder mine input felter og trykker submit, får jeg ovenstående FEJL. Så prøvede jeg at sætte #31 ind, der hvor $error skal udskrives. Når siden kaldes stadig FEJL 1. Indtil input felterne har været udfyldt!!!
Avatar billede kjeldsted Novice
01. oktober 2011 - 13:49 #35
Det er ikke en fejl. Det er en NOTICE. Det eneste der står er at $error ikke indeholder noget. Som regel er der slet ikke grund til at have NOTICE beskeder slået til, da det er de mest overflødige ting man får at vide dér. Errors og Warnings bør være slået til under debug og når man går fra debug til udgivelse bør det helt være slået fra.

Men ellers kan du da også bare rette det til

$error='';
if($row = mysql_fetch_row($result)){
                $error = "<p style='margin-top:0;margin-left:50px;color:red;' >Indlægget findes allerede, og blev ikke gemt igen.</p>";
            }else{

                mysql_query("INSERT INTO bog(navn, dato, besked, tid, website) VALUES('$navn','$dato','$besked','$tid','$website')") or die(mysql_error());  //data skrives til tabellen bog
            }
        }


Og desuden skal insert kode ikke ligge efter DOCTYPE men før.
Avatar billede NielsErikP Mester
02. oktober 2011 - 00:00 #36
Hej..
@coderdk:
Dit indlæg i #10 fungerer tildels, lad os nu sige jeg poster samme indlæg 2 gange og så vil opdatere på F5 eller browserens runde pil... Så bliver "Indlægget findes allerede og blev ikke gemt igen" stående, så først hvis der postes noget nyt eller jeg trykker på mit menu punkt "Gæstebog" som indeholder linket "/gb3.php", startes der "From Scratch".

Nuværende kode omkring min INSERT statement :


if($row = mysql_fetch_row($result)){
                    $error = "<p style='margin-top:0;margin-left:50px;color:red;' >Indlægget findes allerede, og blev ikke gemt igen.</p>";
                }else{
                    $dato_array=getdate();            //php datofunktion
                    $dato = $dato_array["mday"] . "/" . $dato_array["mon"] . " - " . $dato_array["year"];
                    $hours = ($dato_array["hours"] < 10)  ? '0'. $dato_array["hours"] : $dato_array["hours"];
                    $minut = ($dato_array["minutes"] < 10)  ? '0'. $dato_array["minutes"] : $dato_array["minutes"];
                    $sec  =  ($dato_array["seconds"] < 10)  ? '0'. $dato_array["seconds"] : $dato_array["seconds"];     
                    $tid = $hours . ":" .$minut . ":" .$sec;
                    mysql_query("INSERT INTO bog(navn, dato, besked, tid, website) VALUES('$navn','$dato','$besked','$tid','$website')") or die(mysql_error());  //data skrives til tabellen bog
               
                    header( "303 See Other HTTP/1.1", true, 303 );
                    header( "Location: " . $_SERVER['REQUEST_URI'] );
                    exit;
               
                }

Avatar billede NielsErikP Mester
04. oktober 2011 - 14:55 #37
Hej...
CODERDK...læg venligst et svar...
Og til kjeldsted og de andre der syntes de vil modtage af uddelingen, læg også et svar!!!
Avatar billede kjeldsted Novice
04. oktober 2011 - 15:07 #38
Svar her fra.
Avatar billede majbom Novice
04. oktober 2011 - 19:05 #39
svar...
Avatar billede majbom Novice
04. oktober 2011 - 19:05 #40
svar... *
Avatar billede coderdk Praktikant
04. oktober 2011 - 21:37 #41
:)
Avatar billede majbom Novice
05. oktober 2011 - 06:23 #42
tfp :)
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