Gå til innhold

Gjestebok uten MySQL får ikke til


Anbefalte innlegg

Hei jeg fulgte Beethovens guide fra FAQen her

Gjestebok uten MySQL

 

I denne artikkelen vil jeg vise deg hvordan du skal kunne lage en gjestebok i PHP. Den skal ikke bruke MySQL, men den skal bruke èn fil hvor alle innleggene har hver sin linje i fila. Det er raskt og ganske fleksibelt.

 

Dette får jeg ikke til å virke, jeg kan skrive innlegg, får opp at det gikk bra, men når jeg skal sjekke gjesteboka så ligger det ikke noe der... Har spurt Beethoven om dette han kunne ikke hjelpe. Har CHMODDA fila der innleggene skulle lagres til 777.

 

Kan det ha noe med at PHP hosten min har Safe Mode på?

 

Takk for svar :)

Endret av Zappza
Lenke til kommentar
Videoannonse
Annonse
Gjest Slettet+6132
Hei jeg fulgte Beethovens guide fra FAQen her
Gjestebok uten MySQL

 

I denne artikkelen vil jeg vise deg hvordan du skal kunne lage en gjestebok i PHP. Den skal ikke bruke MySQL, men den skal bruke èn fil hvor alle innleggene har hver sin linje i fila. Det er raskt og ganske fleksibelt.

 

Dette får jeg ikke til å virke, jeg kan skrive innlegg, får opp at det gikk bra, men når jeg skal sjekke gjesteboka så ligger det ikke noe der... Har spurt Beethoven om dette han kunne ikke hjelpe. Har CHMODDA fila der innleggene skulle lagres til 777.

 

Kan det ha noe med at PHP hosten min har Safe Mode på?

 

Takk for svar :)

5398724[/snapback]

 

Safemode skal ikke hindre deg i å åpne filer og lese/skrive til dem. Hvis vi får se scriptet du bruker er det lettere å hjelpe :)

Lenke til kommentar
Gjestebok uten MySQL

 

I denne artikkelen vil jeg vise deg hvordan du skal kunne lage en gjestebok i PHP. Den skal ikke bruke MySQL, men den skal bruke èn fil hvor alle innleggene har hver sin linje i fila. Det er raskt og ganske fleksibelt.

 

Litt informasjon før scripting

 

Når vi skal lagre innleggene så skal vi ikke bruke MySQL, men èn fil. Vi skal lagre alle innleggene i en fil istedenfor en fil per innlegg. Det vil gå mye tregere hvis vi gjør det på den måten. Det er ikke så komplisert som noen tenker i starten.

 

Hvert innlegg skal få sin egen linje i fila, hvor vi skiller forskjellig informasjon med en rekke spesielle tegn. Det høres komplisert ut for noen, for andre ikke. Her et eksempel:

 

8756754[{**--||--**}]navn [{**--||--**}]e-post [{**--||--**}]hjemmeside [{**--||--**}]melding [{**--||--**}]dato[{**--||--**}]ip [{**--||--**}]

 

Det første du ser er tallene: 8756754. Vi skal ordne slike tall på hvert innlegg fordi det er litt enklere å arbeide med innleggene hvis de har en ID.

 

Som du kanskje legger merke til har ID-en, navnet, e-posten og hjemmesiden etc. fått følgende bit liggende bak seg: «[{**--||--**}]». Det er en måte å skille innholdet på. Jeg kommer til å vise deg hvordan vi gjør det i PHP senere.

 

Begynne å scripte

 

Det jeg skal vise deg nå er ikke akkurat en funksjon, men en kontroll struktur. En løkke: «foreach». Det er en løkke som er spesielt brukt for matriser (arrays). Fordi, hele fila vår skal bli omgjort til en matrise, hvor da vært element er en linje i fila.

 

Først må du lage en fil, kall filen entries.db.php. Dette blir filen hvor alle innleggene skal bli lagret, nesten som en database. Du må huske å chmodde filen til 777. I øverste linje må du legge inn følgende kode:

 

<?php die (’’); ?>

 

Den vil sørge for at hvis folk prøver å åpne filen så blir de umiddelbart stoppet. Det vil vise en blank side. Det gjør at ingen skal kunne åpne fila og lese det som står der, og finne ut hvordan vi skiller innholdet. Litt dumt hvis noen vet det og skriver skilletegnet vårt inn i gjesteboka. Vedkommende vil kunne rote til hele gjesteboken.

 

Nå skal vi begynne på formen til gjesteboka, innputtene, eller kanskje du kaller det felter. Lag en fil kalt gb.php og fyll den inn med dette:

 

<h2>Gjestebok</h2>

<p><a href="gb_read.php">Les innlegg</a></p>

<form method="post" action="gb_act.php">

<p><label for="name">Navn</label><br />
<input type="text" name="name" id="name" />
</p>

<p><label for="email">E-post</label><br />
<input type="text" name="email" id="email" />
</p>

<p><label for="message">Melding</label><br />
<textarea name="message" id="message" style="width: 400px; height: 150px;"></textarea>
</p>
 
<p> 
<input type="submit" name="submit" value="Lagre innlegget" />
</p>

</form>

 

Dette blir filen hvor brukeren får skrive selve innlegget sitt, eller han kan trykke for å lese andres innlegg.

 

Nå skal vi lage filen som lagrer innlegget. Den må du kalle gb_act.php og den skal vi legge følgende inn i:

 

<?php

// Definerer en konstant. Det er det samme som en variabel bare at vi kan
// ikke endre verdien.
define ('ENTRIES_DB', 'entries.db.php');

// Setter maksimum hvor mange tegn navn og melding kan ha.
define ('MAX_INPUT_NAME', 75);
define ('MAX_INPUT_MESSAGE', 5000);

// Fjerner all form for HTML og whitespaces.
$name = strip_tags(htmlspecialchars(trim($_POST['name'])));
$email = strip_tags(htmlspecialchars(trim($_POST['email'])));
$message = strip_tags(htmlspecialchars(trim($_POST['message'])));

// Hvis Magic Quotes er på så vil det automatisk settes på \, slash altså
// på alle appostrofer. Koden under vil sørge for at det ikke skjer.
if(get_magic_quotes_gpc) {
       $name = stripslashes($name);

       $email = stripslashes($email);
       $message = stripslashes($message);
}

// Fikser slik at det ikke blir noen linjeskift i fila.
$replace = array("\r\n" => '<br />', "\t" => '');

$name = strtr($name, $replace);
$email = strtr($email, $replace);
$message = strtr($message, $replace);

// Fjerner [{**--||--**}] fra alle felter hvis noen har prøvd det. Det kan være svært skadelig for
// gjesteboka hvis noen gjør det.
$replace = array('[{**--||--**}]' => '');

$name = strtr($name, $replace);
$email = strtr($email, $replace);
$message = strtr($message, $replace);

// Sjekker om fila er skrivbar. Er den ikke det så blir det feilmelding.
if (!is_writable(ENTRIES_DB)) {
       echo '<h2>Feil!</h2><p>Vi kan ikke skrive til entries.db.php.</p>';
}

// Sjekker om navn og en melding er fylt ut. Hvis ikke blir det feilmelding.
elseif (empty($name) || empty($message)) {
       echo '<h2>Feil!</h2><p>Navn og en melding må fylles inn!</p>';
}

// Sjekker om navnet er for langt.
elseif (strlen($name) > MAX_INPUT_NAME) {

       $rest = strlen($name)-MAX_INPUT_NAME;
       echo '<h2>Feil!</h2><p>Navnet er for langt. Maks. '.MAX_INPUT_NAME.' tegn. Du må fjerne '.$rest.' tegn.</p>';

}

// Sjekker om meldingen er for stor.
elseif (strlen($message) > MAX_INPUT_MESSAGE) {

       $rest = strlen($message)-MAX_INPUT_MESSAGE;
       echo '<h2>Feil!</h2><p>Meldingen er for langt. Maks. '.MAX_INPUT_MESSAGE.' tegn. Du må fjerne '.$rest.' tegn.</p>';

}

// Hvis det er skrevet en e-post og den ikke er systematisk rett - feilmelding!
elseif (!empty($email) && !eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)) {
       echo '<h2>Feil!</h2><p>E-posten er ikke rett, den er systematisk feil.</p>';
       exit();
}

// Det virker som om det meste gikk bra, da begynner vi å titte på å lagre meldinga.
else {

       // Henter IP-en til vedkommende.
       $ip = $_SERVER['REMOTE_ADDR'];
       // Får PHP til å velge ut noen tall mellom 1000 og 9999.
       $id = rand(1000, 9999);
       // time() er en lur funksjon. Utifra den kan vi skrive forskjellige datoer.
       $date = time();

       // Samler alt sammen i ett.
       $content = $id . '[{**--||--**}]' . $name . '[{**--||--**}]' . $email . '[{**--||--**}]' . $message . '[{**--||--**}]' . $ip . '[{**--||--**}]' . $date . '[{**--||--**}]' . "\n";

       // Åpner filen
       if (!$fp = fopen(ENTRIES_DB, 'a')) {
               echo '<h2>Feil!</h2><p>Kan ikke åpne filen.</p>';
               exit();
       }

       // Skriver innholdet.
       if (fwrite($fp, $content) === FALSE) {
               echo '<h2>Feil!</h2><p>Kan ikke skrive til filen.</p>';
               exit();
       }

       // Beskjed om at det ble velykket.
       echo '<h2>Sukksess!</h2><p>Ditt innlegg er lagret, du kan lese det <a href="gb_read.php">her</a></p>';

       // Lukker filen.
       fclose($fp);

}

?>

 

Da er vi ferdig med action-fila. Vi har sjekket og gjort følgende:


  •  
  • Fjernet all form for HTML og andre farlige tegn.
     
  • Sørget for at ingen kan skrive en blank melding.
     
  • Sjekket om e-posten er systematisk rett.
     
  • Gjort slik at man ikke kan skrive veldig store meldinger. I tilfelle det er en som har lyst å ødelegge.
     
  • Lagret IP-en til vedkommende som skriver.
     
  • Laget en ID til hvert innlegg.
     

Når vi har lagret innlegget så vil vi gjerne se innlegget. Da må du lage filen gb_read.php og fylle den inn med:

 

<?php

define ('ENTRIES_DB', 'entries.db.php');

// Velger hvordan vi vil ha dato formen.
define ('DATE_FORMAT', 'd.m.Y');

// Gjør hele fila om til en matrise, hvor da hvert element er lik
// ei linje. I tillegg reverserer vi arrayen for å få det nyeste
// innlegget først.
$entries_array = array_reverse(file(ENTRIES_DB));

echo '<h2>Gjestebok innlegg</h2>';
echo '<p><a href="form.php">Skriv innlegg</a></p>';

foreach ($entries_array AS $lines) {

       // Sørger for å ikke ta med <?php die ('') etc.
       if (strpos($lines, "<?php") === FALSE) {

               // Hver linje er en matrise, hvor elementet er splittet med [{**--||--**}]
               $entry = explode('[{**--||--**}]', $lines);
       
               // Lager enklere variabel navn.
               $name = $entry[1];
               $email = $entry[2];
               $message = '<p>'.$entry[3].'</p>';
               $date = $entry[5];
       
               // Lager valid XHTML.
               $replace = array('<br /><br />' => '</p><p>');
               $message = strtr($message, $replace);
       
               // Lager navnet om til en lenk hvis det er en e-post som er skrevet.
               if (!empty($email)) {
                       $name = '<a href="mailto:'.$email.'">'.$name.'</a>';
               }
       
               // Skriver ut hele innlegget:
               echo '<p><strong>'.$name.' - '.date(DATE_FORMAT, $date).'</strong></p>';
               echo $message;
               echo '<hr />';
               
       }

}

?>

 

«Er det mer man kan gjøre for å bedre/sikre gjesteboken?»

 

Ja, det er noe mer du kan gjøre, noe man kan prøver å ordne selv. Flood sperre! Det vil si at vedkommende ikke kan skrive et innlegg rett etter han nettopp har skrevet et. Han må f. eks. vente i fem minutter. Nyttig i tilfelle noen ønsker å ødelegge gjesteboken din.

 

«Paging» er fullt mulig å ordne på gjesteboken. Du kan kanskje ordne et administratorsystem hvor du kan endre, slette og kommenterer innlegg.

 

Lykke til!

5047368[/snapback]

 

Der har du det, posta det ikke i stad, var så langt :ohmy:

Lenke til kommentar
Gjest Slettet+6132
Der har du det, posta det ikke i stad, var så langt :ohmy:

5400150[/snapback]

 

Slik jeg ser det skal det funke om du har gjort det helt likt det som er der.

Endret av Slettet+6132
Lenke til kommentar
Det gjør vel ikke noe om jeg legger den koden der inn i et .htm dokument? Vil nemlig helst ha designet til siden min

5400390[/snapback]

Jo, filer med php-kode må være .php (eller tilsvarende som f.eks .php3). Derimot kan du legge designet ditt "rundt" php-koden. Dvs. før og etter. Endret av Ernie
Lenke til kommentar
Gjest Slettet+6132
Har nå laget alle filene i php. Nå får jeg lagret i "entries.db.php" men det vises ikke i "gb_read.php"... Hvis jeg åpner "entries.db.php" så ser jeg innleggene.

 

Var vist ikke løst alike vel :(

5400644[/snapback]

 

For det første; ikke post dobbelposter, det er en redigeringsknapp.

For det andre; ser ut til at du ikke har php innstallert på webserveren, <?php die (’’); ?> ville gjort at du ikke så noe om php hadde vært satt opp.

Lenke til kommentar
Gjest Slettet+6132
Ser det når jeg åpner fila via ftpen ^^

Åpner jeg den via en nettleser ser jeg ingenting.

 

PHP er det, har både forum og bildegalleri som trenger dette.

5401199[/snapback]

 

Si det da, ikke gi meg falske inntrykk :!:

 

Men er litt vanskelig å vite hva som er galt, kan du poste din php-fil som skriver innleggene?

 

EDIT: Som henter innleggene mener jeg. Du fikk jo skrevet dem :p

Endret av Slettet+6132
Lenke til kommentar
  • 4 uker senere...

Ettersom det er ett innlegg pr linje, så kan du bruke linje for paging. F.eks første side går til og med 10, neste side går til og med 20 osv...

 

her er framgangmåten for å lese ut en spesiell linje fra en fil:

$readfile = file("filnavn.txt");
$linje_aa_lese = 12;
$linje = $readfile[$linje_aa_lese];

Her legges da linje 12 inn i variabelen $linje.

For å skrive ut alle innlegg fra linje 1 til linje 10 legger du bare inn en for løkke som går fra start (hentes fra url) til start + ant_innlegg_pr_side(F.eks 10)

 

/K

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...