Plaatsen van berichten in gastenboek omdraaien

Status
Niet open voor verdere reacties.

jesse123

Gebruiker
Lid geworden
29 aug 2012
Berichten
301
Beste,

Ik ben bezig met het maken voor een website waarop berichten worden geplaatst.
Deze worden dan op een andere pagina weergegeven. Mensen schrijven hun bericht en hun naam.

Dit zijn de codes:
Invul form
HTML:
<form action="gastenboek_verwerk.php" method="post">
Bericht:<br />
<textarea cols=40 rows=6 name="bericht">

</textarea><br />
Naam: (Is niet verplicht)<br />
<textarea cols=40 name="naam" style="height: 43px">

</textarea><br />
&nbsp;<br />

<input type="submit" name="submit" value"schrijf!" value="Versturen">

gastenboek_verwerk.php
PHP:
<?php
   
$fp=fopen("gastenboek.php", "a");
fwrite($fp,"$_POST[bericht]<br />");
fwrite($fp,"$_POST[naam]</br></br> ");
fclose($fp); 
header("location:gastenboek.php"); 
 
?>

gastenboek.php
Code:
<body bgcolor=000000>
<font face=verdana size=2 color=white>

In een frame wordt dan de pagina "gastenboek.php" weergegeven.

Nu wil ik dat op deze pagina (gastenboek.php) de nieuwste berichten bovenaan worden geplaatst.
Als ik nu iets plaats, komt het onder aan de pagina. Hij schrijft de nieuwe berichten dus onderaan.

Ik hoop dat jullie me kunnen helpen.

Alvast bedankt! :thumb:
 
2 manieren: je zet het niet in een txtbestand, maar in een mysql database, die je dan uitleest en dan Order by desc.

Of je zet al je txtregels in een array en je leest de array omgekeerd uit.
 
Bedankt voor je snelle reactie!

Hoe doe ik dat tweede precies? Want dat lijkt me iets makkelijker.
Hoe kan ik dit schrijven in een array? En hoe lees ik dit omgekeerd uit?
 
PHP:
$words = fopen ("zijspanteams.txt", "r") or exit("Unable to open file!");
$telzijspanteam=0;

while (!feof ($words))
  {	
$buffer = fgets($words, 4096);
$zijspanteam = explode("|", $buffer);
$zijspanteam1[]=$zijspanteam[0]; // piece1
$zijspanteam2[]=$zijspanteam[1]; // piece2
$telzijspanteam++;  
}
fclose ($words);
in de txtfile gebruik je het pipeteken om gegevens op 1 regel te kunnen splitsen:
Als je per regel 1 informatie hebt, hoeft dat uiteraard niet. Gebruik dan gewoon $zijspanteam[]

$telzijspanteam++; telt het aantal regels

In je website doe je vervolgens
PHP:
for x =  $telzijspanteam to 0; $telzijspanteam--;
{
echo $zijspanteam[x]."<br>";
}

Zo ongeveer dus.
 
Laatst bewerkt door een moderator:
ik snap het niet helemaal denk ik, ik weet nog niet zo veel van php. Moet ik die bovenste code gebruiken in het verwerkingsbestand? En hoe moet ik dat tweede stukje plaatsen? want ik krijg een foutmelding als ik deze in het bestand zet waar alle berichten komen te staan.
En moet ik telzijspanteam enzo veranderen? (de namen)
 
Ik heb nu gevonden dat je verschillende manieren hebt van het schrijven in zo'n bestand.
http://us3.php.net/manual/en/function.fopen.php

Als ik hem bijvoorbeeld met w, w+, x of c instel op de plek waar nu een 'a' staat.
PHP:
<?php
   
$fp=fopen("gastenboek.php", "a");
fwrite($fp,"


 $_POST[bericht]<br />");
fwrite($fp,"Naam: $_POST[naam]</br></br>");
fclose($fp); 
header("location:gastenboek.php"); 
 
?>
Dan start hij aan het begin, maar schrijft hij de rest van het bestand over, dit wordt dan verwijderd. Is er dan nog een manier dat hij dan alleen schrijft, en de rest niet verwijderd?

Misschien kan ik iets met c?
Open the file for writing only. If the file does not exist, it is created. If it exists, it is neither truncated (as opposed to 'w'), nor the call to this function fails (as is the case with 'x'). The file pointer is positioned on the beginning of the file. This may be useful if it's desired to get an advisory lock (see flock()) before attempting to modify the file, as using 'w' could truncate the file before the lock was obtained (if truncation is desired, ftruncate() can be used after the lock is requested).

Moet ik dit dan locken ofzo, dat de rest van het bestand blijft bestaan?
 
Laatst bewerkt:
Ik ben net dit tegengekomen:
http://stackoverflow.com/questions/...ut-overwriting-to-the-beginning-of-a-text-fil

I'm not entirely sure of your question - do you want to write data and not have it over-write the beginning of an existing file, or write new data to the start of an existing file, keeping the existing content after it?

To insert text without over-writing the beginning of the file, you'll have to open it for appending (a+ rather than r+)

Code:
$file=fopen(date("Y-m-d").".txt","a+") or exit("Unable to open file!");

if ($_POST["lastname"] <> "")
{
   fwrite($file,$_POST["lastname"]."\n");
}

fclose($file);
If you're trying to write to the start of the file, you'll have to read in the file contents (see file_get_contents) first, then write your new string followed by file contents to the output file.

Code:
$old_content = file_get_contents($file);
fwrite($file, $new_content."\n".$old_content);
The above approach will work with small files, but you may run into memory limits trying to read a large file in using file_get_conents. In this case, consider using rewind($file), which sets the file position indicator for handle to the beginning of the file stream. Note when using rewind(), not to open the file with the a (or a+) options, as:

If you have opened the file in append ("a" or "a+") mode, any data you write to the file will always be appended, regardless of the file position.

Zou dit tweede niet kunnen werken? Ik heb het uitgeprobeerd, maar het werkt nog niet. Ik doe denk ik iets fout.
 
Het is gelukt! :)
Ik heb nu deze code gebruikt:
PHP:
<?php
$filename = "gastenboek.php";
$fd = fopen ($filename, "r");
$contents = fread ($fd, filesize ($filename));
fclose ($fd);
?>

<?php
$fp = fopen("gastenboek.php","w+");
fwrite($fp,"$_POST[bericht]<br/>");
fwrite($fp,"Naam: $_POST[naam]</br></br>");
fclose ($fp);
?>

<?php
$fp = fopen("gastenboek.php","a");
fwrite ($fp,"$contents");
fclose ($fp);
header("location:gastenboek_schrijf.html"); 
?>

En nu werkt het :D

Toch bedankt voor je hulp :thumb:
 
Hier heb je in ieder geval de array, voor later misschien.
Draai dit eens en kijk naar het resultaat.

index.php
PHP:
<?php
//==============================================
$words = fopen ("lees.txt", "r") or exit("Unable to open file!");
$lees=0;

while (!feof ($words))
  {	
$buffer = fgets($words, 4096);
$lees = explode("|", $buffer);
$leesin[]=$lees[0]; 
$telaantal++;
}
fclose ($words);
echo "----------------------------------VAN BOVEN NAAR BENEDEN";
 for ($index = 0 ; $index < $telaantal; $index++)
{echo $leesin[$index].'<br>';}

echo "----------------------------------VAN BENEDEN NAAR BOVEN";
 for ($index = $telaantal ; $index > 0; $index--)
{echo $leesin[$index].'<br>';}
?>

lees.txt
buienradar
Gelderlander
Fok
Webwereld
subs
Babs
Toos
helpmij
tabletsmagazine
Android market
 
Laatst bewerkt door een moderator:
Dan krijg ik dit:
Code:
Notice: Undefined variable: telaantal in I:\website\root\index.php on line 11
----------------------------------VAN BOVEN NAAR BENEDENbuienradar 
Gelderlander 
Fok 
Webwereld 
subs 
Babs 
Toos 
helpmij 
tabletsmagazine 
Android market
En:
Code:
----------------------------------VAN BENEDEN NAAR BOVEN
Notice: Undefined offset: 10 in I:\website\root\index.php on line 20

Android market
tabletsmagazine 
helpmij 
Toos 
Babs 
subs 
Webwereld 
Fok 
Gelderlander
 
Laatst bewerkt:
Dit is en klassiek geval waarin het veel eenvoudiger lijkt om een bestand te gebruiken ipv een database, maar bestanden zijn hier helemaal niet voor bedoeld en het aantal replies dat in dit topic staat is daar een mooi bewijs van.

Ik zou adviseren om gewoon meteen naar een database te gaan, dan kun je wat jij wilt namelijk doen in één regeltje: SELECT tekst FROM tabel ORDER BY invoerdatum DESC LIMIT 3;
En klaar.

Wat je nu hebt gaat bij elke post opnieuw het hele bestand schrijven en dat zal voor een simpele website met een handjevol berichten per dag geen probleem zijn, maar het is naturlijk een enorme verspilling van resources.


PS:

PHP:
<?php
//==============================================
$words = fopen ("lees.txt", "r") or exit("Unable to open file!");
$lees=0;

while (!feof ($words))
{	
$buffer = fgets($words, 4096);
$lees = explode("|", $buffer);
$leesin[]=$lees[0]; 
$telaantal++;
}
fclose ($words);
?>

Als je toch het hele bestand door gaat, gebruik dan serialise() om het bestand te schrijven en unserialise() om het bestand weer om te zetten naar een array (of willekeurige andere variabele).
(en nooit exiten omdat het bestand niet bestond, je website is niet down omdat er één featuretje mist)
 
Laatst bewerkt door een moderator:
Jawel, ik heb sites draaien die z'n gegevens uit tekstfiles haalt.
Zonder tekstfile heb je gewoon een lege pagina ;-)
 
(en nooit exiten omdat het bestand niet bestond, je website is niet down omdat er één featuretje mist)

Ik heb een eigen startpagina met veelgebruikte linken.

Ook heb ik een website met een kalender, die evenementen op datum zet.

Zonder tekstfile zie je dus niks.
 
Ik heb een eigen startpagina met veelgebruikte linken.

Ook heb ik een website met een kalender, die evenementen op datum zet.

Zonder tekstfile zie je dus niks.

En met jouw die() zie je een halve pagina met een onbruikbare melding "cannot open file"...


Wat jij nodig hebt (en met jou de halve PHP community) is foutafhandeling.
En dat is ontiegelijk simpel:
PHP:
<?php

ob_start();
try{

  // Doe hier al je werk
    if (!fopen(...))
    {
        // Er ging iets fout, werp een exception die door het buitenste catch block wordt opgevangen.
        throw new \Exception("Could not open file");
    }
    // Stuur alle geprinte data naar de browser.
    ob_flush();
}
catch (\Exception $e)
{
    // Gooi alle geprinte data weg zodat alleen de foutmelding naar de browser wordt gestuurd.
    ob_end_clean();
    header('HTTP/1.1 503 Service Temporarily Unavailable');
    header('Status: 503 Service Temporarily Unavailable');
    echo "Sorry, de site is tijdelijk niet beschikbaar.";
}
?>
en op de plek van de echo plak je en standaard stuk HTML dat in de stijl van je site de melding op een klantvriendelijke manier toont.

De header() is bijzonder belangrijk want die vertelt Google dat de content die hij nu ziet geen onderdeel van je site meer is, en dat hij dat dus niet moet indexeren (en daarmee dus je ranking in tact laat).

En zie: nergens een exit() of die() te bekennen.
 
Laatst bewerkt door een moderator:
Ik heb het ooit eens ergens van over genomen, vandaar.

Ik zorg er gewoon voor dat de textfile er staat. Klaar. :D :thumb:
 
Ik zorg er gewoon voor dat de textfile er staat. Klaar.


Mij best, het is jouw site, maar raad anderen niet aan om dezelfde fout te maken, voor hen is het waarschijnlijk wel belangrijk dat hun site in de google ranking blijft.
 
Ja en wat denk je waar mijn site staat dan ?
Typ maar eens in: rikketik.
Gelijk de eerste. :D
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan