Zappza Skrevet 7. januar 2006 Del Skrevet 7. januar 2006 (endret) 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 7. januar 2006 av Zappza Lenke til kommentar
Gjest Slettet+6132 Skrevet 7. januar 2006 Del Skrevet 7. januar 2006 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
Zappza Skrevet 7. januar 2006 Forfatter Del Skrevet 7. januar 2006 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 Lenke til kommentar
Gjest Slettet+6132 Skrevet 7. januar 2006 Del Skrevet 7. januar 2006 (endret) Der har du det, posta det ikke i stad, var så langt 5400150[/snapback] Slik jeg ser det skal det funke om du har gjort det helt likt det som er der. Endret 7. januar 2006 av Slettet+6132 Lenke til kommentar
Zappza Skrevet 7. januar 2006 Forfatter Del Skrevet 7. januar 2006 hmm, får prøve på nytt da Lenke til kommentar
Zappza Skrevet 7. januar 2006 Forfatter Del Skrevet 7. januar 2006 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 Lenke til kommentar
Ernie Skrevet 7. januar 2006 Del Skrevet 7. januar 2006 (endret) 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 7. januar 2006 av Ernie Lenke til kommentar
Zappza Skrevet 7. januar 2006 Forfatter Del Skrevet 7. januar 2006 Ok, var det som var feilen da... Takk for hjelpa! Lenke til kommentar
Zappza Skrevet 7. januar 2006 Forfatter Del Skrevet 7. januar 2006 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 Lenke til kommentar
Gjest Slettet+6132 Skrevet 7. januar 2006 Del Skrevet 7. januar 2006 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
Zappza Skrevet 7. januar 2006 Forfatter Del Skrevet 7. januar 2006 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. Lenke til kommentar
Gjest Slettet+6132 Skrevet 7. januar 2006 Del Skrevet 7. januar 2006 (endret) 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 Endret 7. januar 2006 av Slettet+6132 Lenke til kommentar
Zappza Skrevet 8. januar 2006 Forfatter Del Skrevet 8. januar 2006 Her har du den Lenke til kommentar
kakkle Skrevet 8. januar 2006 Del Skrevet 8. januar 2006 Hei. Virker som om du har fått løst problemet ? Dóg så er linken til "Skriv innlegg" feil. Denne må linke til gb.php og ikke gb_act.php Ihvertfall så vises det innlegget jeg la inn. Lenke til kommentar
Zappza Skrevet 8. januar 2006 Forfatter Del Skrevet 8. januar 2006 funker jo! Har du sett ^^ Takk for hjelp! Lenke til kommentar
Sjark Skrevet 5. februar 2006 Del Skrevet 5. februar 2006 Hey, jeg har moddet samme gjestebok scriptet litt, bare designmessig osv, bare lurer på hvordan kan jeg får neste 10, siste 10 linker? Tenke jeg kunne gjøre det ut fra IDen, men den er jo random så da går ikke det Lenke til kommentar
kakkle Skrevet 5. februar 2006 Del Skrevet 5. februar 2006 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå