Avatar billede mpj_86 Nybegynder
09. januar 2003 - 23:24 Der er 14 kommentarer og
1 løsning

Nok nogle neme ting :)

Hej
Jeg er begyndt at lære php men jeg har et problem mit problem er at når man skriver så kommer det nederst og det første der er blevet skrevet er altid øverst hvordan laver jeg det om så det nyeste er øverst?

hvis nu at jeg har skrevet noget og trykker på F5 kommer der en box frem hvor man kan trykke på retry eller cancel hvis nu man trykker på retry så skriver den det man lige har skrevet igen og det bliver den hvad med alt efter hvor mange gange man trykker på F5.

hvorfor kommer der en ny <hr> frem vær gang man går ind på linket?

Det jeg har lavet:  http://www.mpchat.frip.dk/Test/PHP/Test.php

Og så skal i jo lige havde det jeg har lavet :)

<?php
$file = fopen("./Text.txt","a");
$Kommentar = ereg_replace("[:]+[)]","<img src=\"icon_smile.gif\">",$Kommentar);
$Kommentar = ereg_replace("[:]+[D]","<img src=\"icon_biggrin.gif\">",$Kommentar);
$Kommentar = ereg_replace("[:]+[(]","<img src=\"icon_sad.gif\">",$Kommentar);
$Kommentar = ereg_replace("[8]+[)]","<img src=\"icon_cool.gif\">",$Kommentar);
$Kommentar = ereg_replace("[:]+[p]","<img src=\"icon_razz.gif\">",$Kommentar);
$Kommentar = ereg_replace("[;]+[)]","<img src=\"icon_wink.gif\">",$Kommentar);
fputs($file,"$navn <br> $Kommentar <hr>");
fclose($file);
?>
<html>
<body>
<form action="Test.php" method="post">
<p align="center"><font size="2" face="Verdana"><b>Navn:<br>
<input type="text" name="navn" size="20"></b></font></p>
<p align="center"><font size="2" face="Verdana"><b>Kommentar:</b></font><br>
<textarea rows="10" name="Kommentar" cols="25"></textarea></p>
<p align="center"><input type="submit" value="Skriv"></p>
</form>
</body>
</html>
<?php include("Text.txt"); ?>

//MPJ_86
Avatar billede Chewie Novice
09. januar 2003 - 23:26 #1
Avatar billede mpj_86 Nybegynder
09. januar 2003 - 23:28 #2
Sorry hvordan laver jeg titelen om?
Avatar billede whatever Nybegynder
09. januar 2003 - 23:31 #3
Det kan du ikke. Man skal tænke sig om i tide :-)
Avatar billede jakoba Nybegynder
09. januar 2003 - 23:36 #4
men nu du ved det kan du få det iorden næste gang :)

$file = fopen("./Text.txt","a+");  // + tegn efter a
Avatar billede jakoba Nybegynder
09. januar 2003 - 23:42 #5
sorry det var galt :(

$filen = file("./Text.txt");    // læs hele filen ind i memory
$file = fopen("./Text.txt","w");  // gør klar til at skrive den igen
...
fputs($file,"$navn <br> $Kommentar <hr>");  // skriv det der skal stå forrest
fputs( $file, implode( "", $filen ) );  // genskriv det der stod før.
fclose($file);
Avatar billede olebole Juniormester
10. januar 2003 - 06:34 #6
<ole>

Hvis du skal slippe udenom reload-problematikken, må du checke sidste post (øverste linie i txt-filen) ikke er mage til den linie, du er ved at indsætte.
Det kan du gøre sådan:

if ( isset($Kommentar) && $Kommentar<>"" ) { // hvis der findes en kommentar
    $filen = file("Text.txt");    // læs hele filen ind i memory
    $Kommentar = nl2br( $Kommentar ); // indsætter <br> i kommentaren
    $Kommentar = str_replace( "\r", "", $Kommentar ); // fjerner Carrige-Return
    $Kommentar = str_replace( "\n", "", $Kommentar ); // fjerner New-Line
    # Din replace-kode her
    $ny_linie = "<b>$navn:</b> <br> $Kommentar <hr>\n";
    if ( $ny_linie<>$filen[0] ) { // hvis ny komment. er forsk. fra 1. linie i .txt-fil
        $file = fopen( "Text.txt", "w" );  // gør klar til at skrive den igen
        fputs( $file, $ny_linie );  // skriv det der skal stå forrest
        fputs( $file, implode( "", $filen ) );  // genskriv det der stod før.
        fclose( $file );
    }
}

Du skal nok lige checke stien til txt-filen ... jeg har for at teste lavet den om.

Jeg har endvidere sørget for, du kan lave ny linie i tekst-feltet og få det reflekteret i den udskrevne besked. Nåja ... så har jeg lige bolded navnet  :)

/mvh
</bole>
Avatar billede olebole Juniormester
10. januar 2003 - 06:59 #7
Læg i øvrigt mærke til, jeg ikke bruger ereg(), da det er en meget langsommere funktion end str_replace() ... det gælder for alle RegExp-funktioner. Skal du endelig bruge dem (og det er man jo nødt til ved lidt mere komplcerede 'søg-og-erstat' funktioner), bør du bruge preg-funktionerne i stedet, de er mindre 'cpu-grådige' end ereg'erne.

En anden funktion, du kan bruge, hvis du har mange ting, der skal erstattes, er strtr(). Jeg har lavet en ny version, hvor den bruges:

if ( isset($Kommentar) && $Kommentar<>"" ) {  // hvis der findes en kommentar
    $filen = file("Text.txt");    // læs hele filen ind i memory
    $Kommentar = nl2br( $Kommentar );  // indsætter <br> i kommentaren
   
    $repl_arr = array(
        "\r" => "",
        "\n" => "",
        ":)" => "<img src=\"icon_smile.gif\">",
        ":D" => "<img src=\"icon_biggrin.gif\">",
        ":(" => "<img src=\"icon_sad.gif\">",
        "8)" => "<img src=\"icon_cool.gif\">",
        ":P" => "<img src=\"icon_razz.gif\">",
        ";)" => "<img src=\"icon_wink.gif\">"
    );
   
    $Kommentar = strtr( $Kommentar, $repl_arr );  //  udskift smileys m.m.
    $ny_linie = "<b>$navn:</b> <br> $Kommentar <hr>\n";
    if ( $ny_linie<>$filen[0] ) {  // hvis ny komment. er forsk. fra 1. linie i .txt-fil
        $file = fopen( "Text.txt", "w" );  // gør klar til at skrive den igen
        fputs( $file, $ny_linie );  // skriv det der skal stå forrest
        fputs( $file, implode( "", $filen ) );  // genskriv det der stod før.
        fclose( $file );
    }
}

Den er lidt mere 'sexy'  ;o)
/mvh
Avatar billede olebole Juniormester
10. januar 2003 - 07:00 #8
"Læg i øvrigt mærke til, jeg ikke bruger ereg_replace() ..." skulle der stå  :)
/mvh
Avatar billede olebole Juniormester
10. januar 2003 - 07:17 #9
Du kan også begrænse txt-filen til en vis størrelse ... f.eks. 100 beskeder. Ellers bliver den hurtig enorm og tager en krig at downe hvergang man skriver en besked:

if ( isset($Kommentar) && $Kommentar<>"" ) {  // hvis der findes en kommentar
    $filen = file("Text.txt");    // læs hele filen ind i memory
    $Kommentar = nl2br( $Kommentar );  // indsætter <br> i kommentaren
   
    $repl_arr = array(
        "\r" => "",
        "\n" => "",
        ":)" => "<img src=\"icon_smile.gif\">",
        ":D" => "<img src=\"icon_biggrin.gif\">",
        ":(" => "<img src=\"icon_sad.gif\">",
        "8)" => "<img src=\"icon_cool.gif\">",
        ":P" => "<img src=\"icon_razz.gif\">",
        ";)" => "<img src=\"icon_wink.gif\">"
    );
   
    $Kommentar = strtr( $Kommentar, $repl_arr );  //  udskift smileys m.m.
    $ny_linie = "<b>$navn:</b> <br> $Kommentar <hr>\n";
    if ( $ny_linie<>$filen[0] ) {  // hvis ny komment. er forsk. fra 1. linie i .txt-fil
        $file = fopen( "Text.txt", "w" );  // gør klar til at skrive den igen
        fputs( $file, $ny_linie );  // skriv det der skal stå forrest
        for ( $i=0; $i<99; $i++ ) {  // nap de første 99 linier fra txt-filen
            $str .= $filen[$i];
        }
        fputs( $file, $str );  // genskriv de valgte linier
        fclose( $file );
    }
}

og så får du zq heller ikke mere for den 25-øre  :)
/mvh
Avatar billede olebole Juniormester
10. januar 2003 - 07:33 #10
Jo, forresten - du fik aldrig en forklaring på, hvorfor den samme besked fremkom ved F5 og hvorfor der opstod en <hr>, når man gik ind på chatten  :)

Det sidste først: Da PHP-koden står først, skriver den en besked, når siden bliver loaded - også hvis der ikke er en besked skrevet i feltet. Det har jeg undgået ved at undersøge om $Kommentar er sat og at den ikke er 'en tom streng':
  if ( isset($Kommentar) && $Kommentar<>"" ) {
    // indsæt den besked, der er skrevet
  }

Det første problem: Når siden reloades, så ......... jaaahhhh, så reloades siden jo  :)
Dvs, at den post, du lige har sendt til siden (fra formen), bliver så udført en gang til. Beskedden bliver altså igen skrevet ind i txt-filen. Det undgår jeg ved at sammenligne den besked, der står i første linie i filen med den nye linie, jeg gerne vil skrive. Hvis de er ens, skriver jeg den ikke ... hvis de ikke er, bliver den skrevet ind:
    $ny_linie = "<b>$navn:</b> <br> $Kommentar <hr>\n";
    if ( $ny_linie<>$filen[0] ) {  // hvis ny komment. er forsk. fra 1. linie i .txt-fil

$filen er et array af de linier, der står i txt-filen og kommer fra linien højere oppe. Funktionen file( "en_fil.txt" ), lægger således alle files linier ind i et array:
  $filen = file("Text.txt");    // læs hele filen ind i memory

Slut, prut, finale  :)
/mvh
Avatar billede jakoba Nybegynder
10. januar 2003 - 14:48 #11
ole >> det tror jeg godt du kan kalde et svar :-))
Avatar billede olebole Juniormester
10. januar 2003 - 22:00 #12
*ROTFL* Ja, en af mine første skoleopgaver i scripting var i sin tid en txt-fil-baseret chat. Jeg svedte tran, men havde en lærer, der gjorde meget ud af at forklare og hjælpe ... måske en væsentlig grund til, jeg fortsatte i branchen. Jeg brugte flittigt hans kommentarer i en pæn tid efter.
Jeg blev måske lidt rigelig brebet af spm'et og undskylder tegn-strømmen, men sådan er det jo med nostalgiske, ældre herrer  :D
/mvh
Avatar billede mpj_86 Nybegynder
18. januar 2003 - 17:48 #13
Mange tak for hjælpen olebole :)
Avatar billede miraculix Nybegynder
22. januar 2003 - 01:52 #14
Du kan også bare bruger http-headeren location i det script der gemmer beskeden.

Du skal simpelthen lade det være 2 filer. En der viser chatten og formularen og en der tilføjer nye tekster til chatten.

Chatside -> submit script der gemmer i tekstfil -> Chatside

Brugeren ser aldrig den midterste, for den viderestiller med det samme browseren til chatsiden. Og trykker brugeren F5 er det kun chatsiden der bliver reloadet, ikke det script der tilføjer teksten.

Lad os antage de to filer hedder hhv. chat.php og submit.php

I chat.php har du bl.a.:
<kode der viser chat>
<form action="submit.php">

I submit.php har du:
<Kode der indsætter besked fra formen>
header ("location: chat.php\n\n");

(Bemærk der må ikke være noget html eller andet output, før "header" kaldet)

Personligt synes jeg det er noget nemmere og mere generelt anvendeligt. Det kan også bruges ved indsættelse i databaser og andet, hvor det kan være temmelig bøvlet (læs: umuligt) at sammenligne med tidligere indsat række. Husk også at det er et flerbrugersystem. Hvad hvis der er andre der når at fyre en tekst af til chatten lige før man trykker F5?
Avatar billede learner Praktikant
01. april 2005 - 09:32 #15
Hej, jeg har lige siddet og læst denne tråd for jeg vil sikre mig at jeg ikke dobbeltsender hvis folk bruger refresh eller back

virker header() metoden os mod at folk bruger back-knappen?

Du skriver:
(Bemærk der må ikke være noget html eller andet output, før "header" kaldet)
Det er jeg sådan set klar over, men må scriptet sætte en session[] eller cookie[] før header() ?

Jeg opretter spm hvor jeg giver point for svar :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