Mads-b Skrevet 6. juni 2005 Del Skrevet 6. juni 2005 Jeg har en flatfile med diverse lagret informasjon i. Hvordan kan jeg importere disse opplysningene inn i en array slik at linje 1 heter f.eks $linje[1] ? Lenke til kommentar
Magnus Holm Skrevet 6. juni 2005 Del Skrevet 6. juni 2005 $file = file_get_contents = 'dinfil.txt'; $lines = explode("\n", $file); echo $lines[0] // Linje nr. 1 echo $lines[1] // Linje nr 2 osv... Lenke til kommentar
Mads-b Skrevet 6. juni 2005 Forfatter Del Skrevet 6. juni 2005 (endret) Ah.. så du exploder etter \n? takk! Endret 6. juni 2005 av MBaardsgaard Lenke til kommentar
Magnus Holm Skrevet 6. juni 2005 Del Skrevet 6. juni 2005 (endret) Jupp Endret 6. juni 2005 av Judofyr Lenke til kommentar
Mads-b Skrevet 6. juni 2005 Forfatter Del Skrevet 6. juni 2005 Nytt problem: nå som jeg har linje 1, 2 osv, vil jeg kutte dem opp i mindre deler. Infoilinje[1] etc. Problemet jeg støter på må da være at hvis jeg har flere linjer i flatfilen, så får jeg flere infoilinje[1]. En lur løsning på dette? Lenke til kommentar
muffe Skrevet 6. juni 2005 Del Skrevet 6. juni 2005 (endret) Nei, nei, nei. $lines = file('dinfil.txt); Nå har du et array $lines med $lines[0], $lines[1] osv. file() leser en fil linje for linje og deler opp i array for deg. Skal du dele hver linje opp ienda mindre biter kan du for eksempel gjøre det slik: $lines = file('dinfil.txt); foreach($lines as $num => $value) { $lines[$num] = explode(";", $value); } Dette forutser at du deler linjen ved semikolon ( ; ). Nå vil arrayet bestå av $line[0][0], $line[0][1], $line[1][0] etc. Bare spør hvis du trenger mere hjelp. Husk bare at du godt kan dele opp og behandle de enkelte feltene i hver linje i en og samme operasjon. Endret 6. juni 2005 av muffe Lenke til kommentar
Mads-b Skrevet 6. juni 2005 Forfatter Del Skrevet 6. juni 2005 (endret) Jeg prøvde selv mens jeg ventet på svar: $File = file_get_contents('posts.txt'); //Åpner filen $Linenum = count($File); //Teller antall linjer i dokumentet $Lines = explode("\n", $File); //Deler opp dokumentet i linjer $i = "1"; while($i <= $Linenum) { $Fragments = explode("|", $Lines[$i]); //Deler opp linjene i mindre fragmenter, disse får egne arrays under.. $Wname = $Fragments[1]; $Wemail = $Fragments[2]; if($Fragments[3] != ""){ $WWWW = "<a href\"$Fragments[3]\">nettside</a>"; } //Sjekk om $Fragments[3] er tom $Wmessage = $Fragments[4]; $Wdate = $Fragments[5]; $Wip = $Fragments[6]; $Posts[$i] = "<div class=\"innlegg\">/n <span class=\"gbinfo\">Skrevet av: <a href=\"mailto:£Wemail\">$Wname</a> $Wdate $WWWW</span>/n <p class=\"post\">$Wmessage</p>/n </div>"; //Dette var en post denne øker hver gang While loopen stikker innom og genererer $Posts[1] $Posts[2] etc helt til det ikke er flere linjer. $i++; // Øker i med 1 } Logikken min tilsier at jeg nå vil få posts[1] etc.. ER dette riktig? det er litt stas å lage scriptet selv, selv om det er tungvindt:p EDIT: du må kansje få det inn i en editor med syntax highlighting før du klarer å lese det som står.. EDIT 2:Parse error: parse error, unexpected '=' in gb.php on line 35 det er første linje. Jeg tror ikke den åpne-fil saken fungerer.. EDIT 3: Ny kode. Hvorfor fungerer ikke echo $Posts;?? Endret 6. juni 2005 av MBaardsgaard Lenke til kommentar
muffe Skrevet 6. juni 2005 Del Skrevet 6. juni 2005 Husk at første linje er $posts[0], og ikke $posts[1]... Også brukes veldig ofte bare $i i stede for $Oketall som du har brukt. Og skal du øke $i med en, så skriver du rett og slett bare følgende på en linje for seg selv: $i++; Men sjekk ut PHP-manualen og søk opp file()-funksjonen. Den vil gjøre livet ditt mye enklere. Nå går jeg til køys. God natt. Lenke til kommentar
muffe Skrevet 6. juni 2005 Del Skrevet 6. juni 2005 Første linja skal være: $File = file_get_contents('posts.txt'); Husk at file_get_contents() er en funksjon... Lenke til kommentar
Mads-b Skrevet 6. juni 2005 Forfatter Del Skrevet 6. juni 2005 (endret) <?php if ($_POST['submit'] == TRUE) { $Name = $_POST['name']; $Email = $_POST['email']; $WWW = $_POST['www']; $Message = $_POST['msg']; $ip = $_SERVER['REMOTE_ADDR']; $Date = date("Y-m-d, H:i"); $Fyord = "<styggord,fjernet,bondevik,bush"; if(empty($Name) || empty($Email) || empty($Message)) { $error = "<p class=\"red\">Du har ikke fylt inn alle de nødvendige feltene</p>"; } elseif(!ereg("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $Email)) { $error = "<p class=\"red\">Mailadressen du skrev inn er ikke gyldig</p>"; } else { $Fyord = explode(",", $Fyord); $Message = str_replace($Fyord, "*****", $Message); $Message = nl2br($Message); $Post = "$Name|$Email|$WWW|$Message|$Date|$ip \n"; $fh = fopen('posts.txt', 'w') or die("Kunne ikke åpne postfil"); fwrite($fh, $post); fclose($fh); } } $File = file_get_contents('posts.txt'); //Åpner filen $Linenum = count($File); //Teller antall linjer i dokumentet $Lines = explode("\n", $File); //Deler opp dokumentet i linjer $i = "1"; while($i <= $Linenum) { $Fragments = explode("|", $Lines[$i]); //Deler opp linjene i mindre fragmenter, disse får egne arrays under.. $Wname = $Fragments[1]; $Wemail = $Fragments[2]; if($Fragments[3] != ""){ $WWWW = "<a href\"$Fragments[3]\">nettside</a>"; } //Sjekk om $Fragments[3] er tom $Wmessage = $Fragments[4]; $Wdate = $Fragments[5]; $Wip = $Fragments[6]; $Posts[$i] = "<div class=\"innlegg\">/n <span class=\"gbinfo\">Skrevet av: <a href=\"mailto:£Wemail\">$Wname</a> $Wdate $WWWW</span>/n <p class=\"post\">$Wmessage</p>/n </div>"; //Dette var en post denne øker hver gang While loopen stikker innom og genererer $Posts[1] $Posts[2] etc helt til det ikke er flere linjer. $i++; // Øker i med 1 } ?> <?php echo $error;?> <form method="post" action=""> <p> <label for="name">Navn:</label> <input name="name" /><br /> <label for="email">Mailadresse:</label> <input name="email" /><br /> <label for="www">Webside:</label> <input name="www" /><br /> <label for="message">Melding:</label> <textarea name="msg" cols="50" rows="6"></textarea><br /> <label for="submit"> </label> <input id="submit" class="button" type="submit" name="submit" value="Send" /> </p> </form> <?php echo $Posts; ?> Hele greia. Hva er det som gjør at posts.txt forblir tom? (Ja den har CHMOD 777) Takker forøvrig Muffe og Judofyr for god hjelp. Jeg har lært mer PHP i dag enn noen annen dag. Godnatt. Endret 6. juni 2005 av MBaardsgaard Lenke til kommentar
muffe Skrevet 7. juni 2005 Del Skrevet 7. juni 2005 Skummet raskt igjennom det, og så at du må bruke fopen('posts.txt', 'a') med 'a' og ikke 'w'. Bruker du 'w' slettes hele filen før du åpner. Du kan heller ikke telle antall linjer i filen før den har blitt et array. Skal se nærmere på den når jeg kommer hjem fra skolen. Lykke til! Lenke til kommentar
Mads-b Skrevet 7. juni 2005 Forfatter Del Skrevet 7. juni 2005 (endret) Hvordan gjør jeg filen om til en array? Har jeg ikke gjort det? Nå skriver scriptet korrekt til filen.. Dere kan se scriptet på siden min EDIT: nl2br(); fungerer kun delvis. Den lager taggene, men beholder også linebreakene.. Endret 7. juni 2005 av MBaardsgaard Lenke til kommentar
Me sjøl Skrevet 7. juni 2005 Del Skrevet 7. juni 2005 Du kan vel bare bruke en str_replace på linebreakene etter nl2br? <?php $msg = nl2br($_POST['melding']); $melding = str_replace('\n', '', $msg); ?> Du trenger vel heller ikke å lese filen inn i en array for å telle linjene: <?php $handle = fopen('tekst.txt'); $innhold = file_get_contents($handle, 'tekst.txt'); $i = 1; while (!feof) { $linje = fgets($handle, strlen($innhold)); // gjør prossesser $i++; } ?> Lenke til kommentar
muffe Skrevet 7. juni 2005 Del Skrevet 7. juni 2005 Har fikset litt på den. Nå virker den hos meg. <?php error_reporting(E_ALL ^ E_NOTICE); if ($_POST['submit'] == TRUE) { $Name = $_POST['name']; $Email = $_POST['email']; $WWW = $_POST['www']; $Message = $_POST['msg']; $ip = $_SERVER['REMOTE_ADDR']; $Date = time(); $Fyord = "styggord,fjernet,bondevik,bush"; if (empty($Name) || empty($Email) || empty($Message)) { $error = "<p class=\"red\">Du har ikke fylt inn alle de nødvendige feltene</p>"; } elseif (!ereg("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$", $Email)) { $error = "<p class=\"red\">Mailadressen du skrev inn er ikke gyldig</p>"; } else { $error = "Din post er lagt til i gesteboken"; $Fyord = explode(",", $Fyord); $Message = str_replace($Fyord, "*****", $Message); $Message = nl2br($Message); $Message = str_replace("\r", "", $Message); $Message = str_replace("\n", "", $Message); $Post = "$Name|$Email|$WWW|$Message|$Date|$ip \n"; $fh = fopen('posts.txt', 'a') or die("Kunne ikke åpne postfil"); fwrite($fh, $Post); fclose($fh); } print $error; } $File = file('posts.txt'); //Åpner filen $output = ""; foreach ($File as $num => $line) { if (strlen($line) >= 5) { //Deler opp linjene i mindre fragmenter, disse får egne arrays under.. $Fragments = explode("|", $line); $Wname = $Fragments[0]; $Wemail = $Fragments[1]; //Sjekk om $Fragments[2] er tom if ($Fragments[2] != "") { $WWWW = "<a href\"$Fragments[2]\">nettside</a>"; } $Wmessage = $Fragments[3]; $Wtimestamp = $Fragments[4]; $Wip = $Fragments[5]; $Wdate = date("Y-m-d, H:i", $Wtimestamp); //Lager et array $Posts med alle psotene. $output .= "<div class=\"innlegg\">\n"; $output .= "<span class=\"gbinfo\">Skrevet av: <a href=\"mailto:$Wemail\">"; $output .= "$Wname</a> $Wdate $WWWW</span>\n"; $output .= "<p class=\"post\">$Wmessage</p>\n"; $output .= "</div>\n"; } } ?> <form method="post" action=""> <p> <label for="name">Navn:</label> <input name="name" /><br /> <label for="email">Mailadresse:</label> <input name="email" /><br /> <label for="www">Webside:</label> <input name="www" /><br /> <label for="message">Melding:</label> <textarea name="msg" cols="50" rows="6"></textarea><br /> <label for="submit"> </label> <input id="submit" class="button" type="submit" name="submit" value="Send" /> </p> </form> <?php print $output; ?> Vanligvis er min policy at jeg ikke lager script eller gjør store endringer for ukjente, men i ditt tilfelle har jeg gjort et unntak. Dette er fordi du virker interessert i å lære, og jeg stoler på at du går igjennom endringene mine, og både ser og forstår hva jeg har gjort. Ikke bare overskriv fila di og la det bli med det, men prøv å forstå. Det du må bli flinkere på er å høre på andre. Vær ydmyk, og les hva andre skriver, så lærer du bedre. Mange av de feilene jeg har rettet opp her har jeg kommentert opptil flere ganger. Jeg har bla. to ganger bedt deg om å benytte file() i stede for file_get_contents() til oppgaven. Dette har du bare oversett, og valgt å fortsette på din egne sti. Det er ikke feil det du har gjort, men du har gjort det unødvendig vanskelig for deg selv og de som skal hjelpe deg. Når du ber om hjelp er det fordi du har et problem, og da må man anta at de som svarer har gode forslag til løsninger. Det er også viktig å tilrettelegge for de som skal hjelpe. Her er de viktigste endringene: - Array begynner vanligvis med $foo[0], og ikke $foo[1]. Dette har du trøblet til i output-delen. - Du kan ikke bruke echo på et array. Du kan bruke print_r(), men det vil ikke fungere i ditt tilfelle. Nå har jeg droppet array i output-delen, og heller valgt å lage en eneste stor variabel med poster. Den bruker jeg print til å skrive ut på slutten (bruk print, ikke echo, print er noen nanosekunder raskere enn echo). - Jeg har brukt timestamps til å lagre dato og tid i stede for en string med dato og klokkeslett. Dette vil du være glad for når du lærer litt mere PHP. - Jeg har brukt file() til å lese filen inn i et array. - Endret det til slik at epost-adresser med 4 bokstaver i toppdomenet ikke skal bli avvist. Dette gjelder bla .info domenet. - Fikset problemet med at det fremdeles er linjeskift i filen. - Byttet ut while-loopen med en foreach-loop. Ellers så anbefaler jeg deg at du virkelig leser det jeg skriver, og søker i PHP-manualen på de funksjonene jeg anbefaler deg. Mye av det jeg har rettet her har jeg allerede kommentert, men uten at du har giddet å rette opp i det. PHP-manualen er det desidert beste verktøyet som en PHP-utvikler kan tenke seg, mange ganger bedre enn dette forumet. Det er bare å skrive inn php.net/funksjonsnavn for å få opp info om funksjonen funksjonsnavn. Der finner du også referanser til andre funksjoner med liknende bruksområde. Det du nå må ta tak i for å gjøre dette til et brukbart script er input-validering og sikekrhet. Forestill deg et av følgende scenarier: - En bruker skriver navnet sitt som "O|a Nordmann". Hva vil pipe-tegnet gjøre med databasen? - En bruker vil lage litt gøy og poster en masse HTML-kode inn i boksene. Hva vil dette gjøre med strukturen på siden? - En bruker finner ut at dette: http://www.mbaard1.frac.dk/gue/posts.txt er databasen, og han benytter IP-adressene til onde hensikter. - Siden din inneholder etter hvert mange spost-adresser og blir en kilde hvor spam-roboter samler opp epostadressene til å spamme dine besøkende. - En bruker finner på at han vil lage litt skøy, og lager en automatisert loop som poster 100000 poster pr. minutt og fortsetter med det til serveren booker under. Hva kan du gjøre for å forhindre dette? Tenk litt over det, og så kan du komme med noen forslag. Hvis du sitter fast, så kan du heller spørre etter en stund, men ikke uten at du har brukt både Google og PHP-maualen flittig. Jeg krever ikke at du bruker søkefunksjonen her på forumet, for den er elendig, noe som er trist, fordi mange problemer er løst, og løses gang på gang fordi ikke folk finner frem. Dette tok veldig mye tid, både å kode og å skrive posten, så hvis det har kommet noen poster i mellomtiden så er kanskje ikke det så rart. Lykke til videre. Lenke til kommentar
muffe Skrevet 7. juni 2005 Del Skrevet 7. juni 2005 Me sjøl skrev: Du kan vel bare bruke en str_replace på linebreakene etter nl2br? <?php $msg = nl2br($_POST['melding']); $melding = str_replace('\n', '', $msg); ?> Du trenger vel heller ikke å lese filen inn i en array for å telle linjene: <?php $handle = fopen('tekst.txt'); $innhold = file_get_contents($handle, 'tekst.txt'); $i = 1; while (!feof) { $linje = fgets($handle, strlen($innhold)); // gjør prossesser $i++; } ?> Du har feil syntax på file_get_contents(). Skjekk PHP-manualen for å rette opp i det. Husk også at windows-systemer bruker /r/n til linjeskift, og ikke bare /n. Mac bruker vel /r og Linux, UNIX, BSD etc. bruker /n. Men nå er jeg på tynn is, og dere får bare skyte meg hvis det er feil. Lenke til kommentar
Mads-b Skrevet 7. juni 2005 Forfatter Del Skrevet 7. juni 2005 - "|" filter er lagt inn. - strip_tags fikser HTML som legges inn. - Hvis navnet på databasefilen er komplisert nok, vil ikke noen finne den.. - Ingen trenger å sende hverandre mail. Linken er fjernet - Jeg leter fremdeles etter en funksjon i PHP som husker IPer i 24 timer.. ot: Muffe, utrolig hyggelig at du tok deg tiden til å jobbe så mye helt uten videre. Jeg har slått opp i google på tingene som jeg ikke forsto. Foreach gjenstår å forstå. Lenke til kommentar
muffe Skrevet 7. juni 2005 Del Skrevet 7. juni 2005 Bra. Ang navnet på databasefilen så er det bare å se her: http://www.mbaard1.frac.dk/gue/ så kan du se alle dokumenter som er listst i katalogen. Du bør med andre ord lagre det utenfor webområdets rotstruktur. Foreach er ganske lett. Det er en loop som looper en gang for hver linje i arrayet. Slå opp i PHP-manualen hvis du vil ha full syntax og alt. Ang. det å huske IP-er, så kan du jo bare lage en funksjon som skjekker alle IP-er og timestamps i databasen, og nekter en bruker å poste mer enn en post pr. 30 minutter eller noe. Det er jo sjelden at noen poster i en og samme gjestebok med mindre enn 30 minutters mellomrom, med mindre det er snakk om et gjestebok-chat script. Lenke til kommentar
Mads-b Skrevet 7. juni 2005 Forfatter Del Skrevet 7. juni 2005 Det var funksjoner ja.. Nå har jeg søkt rundt i Google og funnet ut at sessions og cookies kan brukes til formålet? Problemet er bare at jeg vil ha kaken når brukeren poster.. Sessions virket veldig komplisert. Så skjønte jeg ingenting av time(); funksjonen din. Hvordan implementerer jeg den i en slik funksjon? (time() + 30min). Gjesteboken skal selvfølgelig flyttes til root når den er ferdig for å forhindre misbruk av databasen. Lenke til kommentar
muffe Skrevet 7. juni 2005 Del Skrevet 7. juni 2005 Har gjort litt forbedringer: <?php error_reporting(E_ALL ^ E_NOTICE); //Lager en funksjon for å splitte gjestebok-data function gbsplit ($input) { $array = explode("|", $input); $output['name'] = trim($array[0]); $output['mail'] = trim($array[1]); $output['www'] = trim($array[2]); $output['message'] = trim($array[3]); $output['timestamp'] = trim($array[4]); $output['ip'] = trim($array[5]); $output['date'] = date("Y-m-d, H:i", $array[4]); return $output; } if ($_POST['submit'] == TRUE) { $Name = $_POST['name']; $Email = $_POST['email']; $WWW = $_POST['www']; $Message = $_POST['msg']; $ip = $_SERVER['REMOTE_ADDR']; $Date = time(); $Fyord = "styggord,fjernet,bondevik,bush"; if (empty($Name) || empty($Email) || empty($Message)) { $error = "<p class=\"red\">Du har ikke fylt inn alle de nødvendige feltene</p>"; } elseif (!ereg("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$", $Email)) { $error = "<p class=\"red\">Mailadressen du skrev inn er ikke gyldig</p>"; } else { $Fyord = explode(",", $Fyord); $Message = str_replace($Fyord, "*****", $Message); $Message = nl2br($Message); $Message = str_replace("\r", "", $Message); $Message = str_replace("\n", "", $Message); $Post = "$Name|$Email|$WWW|$Message|$Date|$ip \n"; //Sjekker om brukeren har postet mange ganger på rad $File = file('posts.txt'); $allowed = TRUE; $limit = time() - 1800; foreach ($File as $num => $line) { $entry = gbsplit($line); if ($entry['timestamp'] > $limit AND $entry['ip'] == $_SERVER['REMOTE_ADDR']) { $allowed = FALSE; } } if ($allowed === TRUE) { $file_contents = file_get_contents('posts.txt'); $fh = fopen('posts.txt', 'w') or die("Kunne ikke åpne database"); fwrite($fh, $Post); fwrite($fh, $file_contents); fclose($fh); $error = "Din post er lagt til i gesteboken"; } else { $error = "Du må vente minst 30 minutter før du kan poste en ny post!"; } } print $error; } $File = file('posts.txt'); //Åpner filen $output = ""; foreach ($File as $num => $line) { if (strlen($line) >= 5) { $entry = gbsplit($line); //Lager output $output .= "<div class=\"innlegg\">\n"; $output .= "<span class=\"gbinfo\">Skrevet av:"; $output .= "{$entry['name']} {$entry['date']} {$entry['www']}</span>\n"; $output .= "<p class=\"post\">{$entry['message']}</p>\n"; $output .= "</div>\n"; } } ?> <form method="post" action=""> <p> <label for="name">Navn:</label> <input name="name" /><br /> <label for="email">Mailadresse:</label> <input name="email" /><br /> <label for="www">Webside:</label> <input name="www" /><br /> <label for="message">Melding:</label> <textarea name="msg" cols="50" rows="6"></textarea><br /> <label for="submit"> </label> <input id="submit" class="button" type="submit" name="submit" value="Send" /> </p> </form> <?php print $output; ?> Endringene er: - Har definert en funksjon for å dele linjene i fila fra hverandre. Skal du utføre ett og samme sett med handlinger mer enn 1-3 ganger lønner det seg å lage en funksjon for det. - Har lagt inn en sperre slik at det kun kan komme én post fra hver IP pr. 30 minutter (1800 sekunder). - Nye poster kommer nå på toppen av fila, og ikke på bunnen. Se på endringene, og slå opp i PHP-manualen hvis du ikke skjønner hva jeg har gjort. Nå har jeg gitt deg hjelp til "grunnmuren" i gjesteboken din, og heretter kommer jeg bare til å gi deg vage hint om hvordan ting skal gjøres. Hvis det er noe du lurer på, så er det bare å spørre, og så skal jeg tipse deg om funksjoner, struktur etc, men ferdiglagde script får du ikke. Husk bare å legge inn dine egne endringer i forslaget mitt. HTML-tagger strippes ikke, og det ville vært lurt med en lengde-begrensning på alle felter, samt alt det andre som er nevnt tidligere. 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å