CruellaDeVille Skrevet 10. september 2006 Del Skrevet 10. september 2006 (endret) Jeg står helt fast med et kjempe-enkelt problem, men har sett meg blind på det og trenger en uthvilt hjerne for å komme videre. Holder på å lage en prototype på en gjestebok til noen studenter jeg har. Gjesteboken består av et gjestebok-objekt og en masse Entry-objekter. Selve entry-data skal skrives til en fil og leses ut igjen. Essensen i problemet mitt: når jeg skriver til fil får jeg noen entryobjekter som kun består av delimiters, og antall innlegg i gjesteboka mi øker eksponensielt. Hvor er logikken min bristende? Allgoritme for lesing fra fil: if filen finnes les innholdet inn i en array del hver linje ved skilletegn(|) Opprett nytt Entryobjekt vha innhold i enkeltlinje legg entryobjekt til i gjestebokens entries-array endif public function readEntries(){ if(file_exists($this->filename)){ if(!$filecontent = file($this->filename)){ print "I/O Error, please try later. Unable to open file for reading"; exit; } foreach($filecontent as $lines){ $e = explode("|", $lines); $entry = new Entry($e[0], $e[1], $e[2], $e[3]); $this->add($entry); } } } Allgoritme for skriving: Åpne filen for skriving for hvert element i arrayet skriv entrydata lukk filen public function writeEnties(){ if(!$fp = fopen($this->filename, 'w')){ print "I/O Error, please try later. Unable to open file for writing"; exit; } //print "<h1>".count($this->entries)."</h1>"; foreach($this->entries as $entry){ fwrite($fp, $entry->writeEntry()); } fclose($fp); } Kode for writeEntry fra Entry-objekter: public function writeEntry(){ return "$this->name | $this->email | $this->url | $this->message\n"; } Jeg tror jeg skal ha fått med det som er viktig for å avdekke feilen min.. men mangler noe blir jeg veldig glad hvis du sier fra Endret 10. september 2006 av CruellaDeVille Lenke til kommentar
xqus Skrevet 10. september 2006 Del Skrevet 10. september 2006 Jeg tipper: Siste linjen i databasefilen din er tom. Og det er ikke tatt høyde for når du leser den. Bedrer seg dersom du sjekker om $lines != '' før du kjører $e = explode("|", $lines); ? Lenke til kommentar
CruellaDeVille Skrevet 10. september 2006 Forfatter Del Skrevet 10. september 2006 Jeg tipper: Siste linjen i databasefilen din er tom. Og det er ikke tatt høyde for når du leser den. Bedrer seg dersom du sjekker om $lines != '' før du kjører $e = explode("|", $lines); ? 6838121[/snapback] Men hvis jeg skriver linjen slik: "dette er linje 1\n" og skal lese denne inn igjen... hvordan tar jeg høyde for new line da? Jeg kan ikke si at $lines !="\n", siden $lines inneholder "dette er linje1\n" også Lenke til kommentar
Svish Skrevet 10. september 2006 Del Skrevet 10. september 2006 litt usikker på hva dette her går ut på, men i en ekstreemt enkel gjestebok jeg laget en gang, så brukte jeg delimiter mellom navn og dato og melding. og melding var resten ut linja liksom, så selv om det var delimiter i meldingen så gikk det greit. ny linje fiksa jeg med nl2br() funksjonen som konverterer \n og slikt til <br> ingen skuddsikker gjestebok, men den funka for det meste Lenke til kommentar
CruellaDeVille Skrevet 10. september 2006 Forfatter Del Skrevet 10. september 2006 litt usikker på hva dette her går ut på, men i en ekstreemt enkel gjestebok jeg laget en gang, så brukte jeg delimiter mellom navn og dato og melding. og melding var resten ut linja liksom, så selv om det var delimiter i meldingen så gikk det greit. ny linje fiksa jeg med nl2br() funksjonen som konverterer \n og slikt til <br> ingen skuddsikker gjestebok, men den funka for det meste 6838824[/snapback] dET ER vel nesten det jeg gjør også, men jeg leser ikke bare inn innholdet i filen og skriver det ut til skjermen, jeg plukker ut de enkelte delene av linjen (den er forøvrig på formen Siv Renate | [email protected] | http://somesite.no | Dette er meldinge min\n ) og putter dette i et Entryobjekt. sukk og dobbeltsukk... php kunne likegjerne vært arabisk. Noen ganger skjønner jeg overhode ingenting Lenke til kommentar
Svish Skrevet 10. september 2006 Del Skrevet 10. september 2006 poenget med nl2br er at at "meldingen min med\nNylinje i seg" blir til "meldingen min med<br>Nylinje i seg" og da kan du så vidt jeg vet være sikkert på at en linje er kun en entry som da vil si at du kan gå igjennom fila linje for linje og explode() Lenke til kommentar
xqus Skrevet 10. september 2006 Del Skrevet 10. september 2006 Jeg tipper: Siste linjen i databasefilen din er tom. Og det er ikke tatt høyde for når du leser den. Bedrer seg dersom du sjekker om $lines != '' før du kjører $e = explode("|", $lines); ? 6838121[/snapback] Men hvis jeg skriver linjen slik: "dette er linje 1\n" og skal lese denne inn igjen... hvordan tar jeg høyde for new line da? Jeg kan ikke si at $lines !="\n", siden $lines inneholder "dette er linje1\n" også 6838667[/snapback] Poenget er at når du bruker file() på en fil med en tom linje på slutten, vil du få en verdi i arrayet som er tom. foreach($filecontent as $lines){ if($lines != '') { $e = explode("|", $lines); $entry = new Entry($e[0], $e[1], $e[2], $e[3]); $this->add($entry); } } Skal nok gjøre susen, slik som jeg forstod problemet ditt. Lenke til kommentar
CruellaDeVille Skrevet 10. september 2006 Forfatter Del Skrevet 10. september 2006 Jeg tipper: Siste linjen i databasefilen din er tom. Og det er ikke tatt høyde for når du leser den. Bedrer seg dersom du sjekker om $lines != '' før du kjører $e = explode("|", $lines); ? 6838121[/snapback] Men hvis jeg skriver linjen slik: "dette er linje 1\n" og skal lese denne inn igjen... hvordan tar jeg høyde for new line da? Jeg kan ikke si at $lines !="\n", siden $lines inneholder "dette er linje1\n" også 6838667[/snapback] Poenget er at når du bruker file() på en fil med en tom linje på slutten, vil du få en verdi i arrayet som er tom. foreach($filecontent as $lines){ if($lines != '') { $e = explode("|", $lines); $entry = new Entry($e[0], $e[1], $e[2], $e[3]); $this->add($entry); } } Skal nok gjøre susen, slik som jeg forstod problemet ditt. 6839871[/snapback] Det høres veldig logisk ut og ser veldig bra ut. Jeg løste det med å serialisere objektet entries og skrive dette til fil. Skal prøve ut din versjon også. Sikker på at den vil fungere! tusen takk! 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å