Bekijk Volledige Versie : [PHP] waarom werkt file reading niet
----------------------------------------
<?php
$filename = "nieuws.txt"
$fp = fopen("$filename", "r") or die("Kan $filenaam niet openen");
while ( ! feof($fp) )
{ $line = fgets( $fp, 1024 ):
print "<b> $line </b> <br>":
}
?>
----------------------------------------
Deze code staat in nieuws.php, in een directory onder windows xp waar
nieuws.txt ook staat. Ik heb wamp draaien. Het probleem is dat dit script
geen output geeft, wat ie normaal met print dus wel moet doen...Kan iemand
mij helpen?
MvG,
me
John Bokma
02/01/05, 20:55
Poster666 wrote:
> ----------------------------------------
> <?php
> $filename = "nieuws.txt"
> $fp = fopen("$filename", "r") or die("Kan $filenaam niet
> openen"); while ( ! feof($fp) )
> { $line = fgets( $fp, 1024 ):
> print "<b> $line </b> <br>":
> }
> ?>
> ----------------------------------------
>
> Deze code staat in nieuws.php, in een directory onder windows xp waar
> nieuws.txt ook staat. Ik heb wamp draaien. Het probleem is dat dit
> script geen output geeft, wat ie normaal met print dus wel moet
> doen...Kan iemand mij helpen?
Download een tail programma [1] voor Windows, en open daar de error_log van
je webserver in.
http://tailforwin32.sourceforge.net/
--
John Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Website design: http://johnbokma.com/websitedesign/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
Jaap-Andre de Hoop
03/01/05, 13:55
"Poster666" <thadave666@hotmail.com> wrote in
news:1cWBd.17725$F9.1486860@phobos.telenet-ops.be:
> ----------------------------------------
> <?php
> $filename = "nieuws.txt"
> $fp = fopen("$filename", "r") or die("Kan $filenaam niet
> openen"); while ( ! feof($fp) )
> { $line = fgets( $fp, 1024 ):
> print "<b> $line </b> <br>":
> }
> ?>
> ----------------------------------------
>
> Het probleem is dat dit
> script geen output geeft,
ook geen 'Kan nieuws.txt niet openen', geen andere warnings/errors??
staat er wel iets in nieuws.txt?
Jaap-Andre
"Jaap-Andre de Hoop" <doemaarietsanders@data-assist.nl> schreef in bericht
<knip>
> ook geen 'Kan nieuws.txt niet openen', geen andere warnings/errors??
> staat er wel iets in nieuws.txt?
Nee, in het hoofddocument, nieuws.php laat de browser alleen de titel zien
die vlak boven het scriptje stond, en dan direct de lijn die end of page
aanduid. Ertussenin, waar één nieuwsitem zou moeten staan, staat niets. Nu,
ik heb een paar tips gekregen hier, o.a. die van de : naar ; zetten, en die
ga ik even nakijken. Meer nieuws als ik dat heb getest.
Momenteel is dit de niet-werkende code, dat in een bestand nieuws.php staat,
in de body. Dus het begint gewoon met <HTML> en zo, en dan in body dit:
-----------------------------------------
<?php
$filename = "nieuws.txt";
$fp = fopen("$filename", "r") or die("Kan $filenaam niet openen");
while ( ! feof($fp) )
{ $line = fgets( $fp; 1024 );
print "<b> $line </b> <br>";
}
?>
---------------------------------------------
Als ik de pagina in een browser bekijk, dan toont hij ook gewoon de code.
Klopt dit?
MvG,
me
Erick T. Barkhuis
03/01/05, 17:45
Poster666 [on Mon, 03 Jan 2005 16:32:17 GMT] wrote:
> Momenteel is dit de niet-werkende code, dat in een bestand nieuws.php staat,
> in de body. Dus het begint gewoon met <HTML> en zo, en dan in body dit:
> -----------------------------------------
> <?php
> $filename = "nieuws.txt";
> $fp = fopen("$filename", "r") or die("Kan $filenaam niet openen");
> while ( ! feof($fp) )
> { $line = fgets( $fp; 1024 );
> print "<b> $line </b> <br>";
> }
> ?>
> ---------------------------------------------
Je volgorde van lezen en uitvragen op eof is niet erg logisch.
Doe het liever zo:
$fp = fopen("$filename", "r") or die("Kan $filenaam niet openen");
$line = fgets( $fp; 1024 );
while ( ! feof($fp) ) {
print "<b> $line </b> <br>";
$line = fgets( $fp; 1024 );
}
>
> Als ik de pagina in een browser bekijk, dan toont hij ook gewoon de code.
> Klopt dit?
Ongetwijfeld, want je ziet het zelf. Dus dat zal wel kloppen.
Goed is het natuurlijk niet. Gaat je php-code wel door een parser op de
webserver?
--
Erick
"What's on your mind, if you will allow the overstatement?" - Fred Allen
"Erick T. Barkhuis" <spamblok@webwax.nl> schreef in bericht
news:MPG.1c43935cbf27c4499898a4@news.individual.de ...
> Ongetwijfeld, want je ziet het zelf. Dus dat zal wel
> kloppen.Goed is het natuurlijk niet. Gaat je php-code
> wel door een parser op de webserver?
Dat met die parser snap ik eigenlijk niet, maar ik heb wamp geïnstalleerd,
en die draait ook. De bestanden bevinden zich in de documentenmap van wamp.
Bedankt voor de code, ik ga die even testen.
"Poster666" <thadave666@hotmail.com> schreef in bericht
news:DFeCd.18632$zL4.1563786@phobos.telenet-ops.be...
<knip>
Code getest, maar nog altijd geen uitvoer. En in nieuws.txt staat wel
degelijk een nieuwsitem met een enter als end-of-line.
Daniel Tryba
03/01/05, 17:55
Erick T. Barkhuis <spamblok@webwax.nl> wrote:
> Je volgorde van lezen en uitvragen op eof is niet erg logisch.
> Doe het liever zo:
>
> $fp = fopen("$filename", "r") or die("Kan $filenaam niet openen");
> $line = fgets( $fp; 1024 );
> while ( ! feof($fp) ) {
> print "<b> $line </b> <br>";
> $line = fgets( $fp; 1024 );
> }
Wat een onzin. Zo wordt de laatste regel nooit getoont (om maar te
zwijgen over de ';' ipv ',' die gewoon uit het probeersel van de OP
komen).
"Daniel Tryba" <spam@tryba.invalid> schreef in bericht
news:41d97862$0$6215$e4fe514c@news.xs4all.nl...
>
> Wat een onzin. Zo wordt de laatste regel nooit getoont > (om maar te
zwijgen over de ';' ipv ',' die gewoon uit
> het probeersel van de OP komen).
>
Tja, probeersel, het script zou moeten doen wat ie moet doen, en hij doet
het niet, dus ik probeer...Baat het niet, dan schaadt het niet. Maar wat zou
jij dan doen om die nieuws.txt uit te lezen, en de lijntjes tekst die er in
staan in het vet te tonen, tussen een hoop html? En een mysql database met
nieuws-items is momenteel geen oplossing.
Voila, ik heb hem zover gekregen dat ie wel iets laat zien. Blijkbaar moet
bij wamp eerst een aparte directory gemaakt worden in de document-directory
(c:\wamp\www) voor je een project fatsoenlijk kunt runnen. Een zwaar geval
van rtfm dus.
Dit is de code die ik heb gebruikt:
---------------------------------
<?php
$filename = "nieuws.txt";
$fp = fopen("$filename", "r") or die("Kan $filenaam niet openen");
$line = fgets( $fp, 1024 );
while ( ! feof($fp) ) {
print "<b> $line </b> <br>";
$line = fgets( $fp, 1024 );
}
?>
------------------------------------------------------
Bedankt allen voor de hulp. Tips en optimalisaties zijn natuurlijk altijd
welkom.
MvG,
me
Daniel Tryba
03/01/05, 18:35
Poster666 <thadave666@hotmail.com> wrote:
>> Wat een onzin. Zo wordt de laatste regel nooit getoont > (om maar te
> zwijgen over de ';' ipv ',' die gewoon uit
>> het probeersel van de OP komen).
>>
>
> Tja, probeersel, het script zou moeten doen wat ie moet doen, en hij doet
> het niet, dus ik probeer...Baat het niet, dan schaadt het niet. Maar wat zou
> jij dan doen om die nieuws.txt uit te lezen, en de lijntjes tekst die er in
> staan in het vet te tonen, tussen een hoop html? En een mysql database met
> nieuws-items is momenteel geen oplossing.
Stap 1: zeker weten dat php op de webserver werkt.
Ik heb daar zo mijn twijfels over of dat bij jou het geval is. Simpleste
methode om dat te achterhalen:
info.php:
---------------------------------
<?php
phpinfo();
?>
---------------------------------
niet meer en niet minder dan wat tussen de 2 -----. regels staat.
Stap 2: code schrijven
---------------------------------
<html>
<body>
<?php
$file='nieuws.txt';
if(file_exists($file))
{
if(is_readable($file))
{
if($fp=fopen($file,'r'))
{
while(!feof($fp))
{
echo '<b>';
echo fgets($fp,4096);
echo '</b>';
}
}
else
{
echo 'Er ging iets fout met openen van file: '.$file;
}
}
else
{
echo $file.' bestaat maar is niet leesbaar';
}
}
else
{
echo $file.' bestaat niet';
}
?>
</body>
<html>
---------------------------------
Stap 3: zeker weten dat de code syntactisch correct is:
$ php -l nieuws.php
No syntax errors detected in nieuws.php
$
Stap 4: testen
$ php ./nieuws.php
[knip]
Stap 5: deployen
zie http://tmp.tryba.nl/nieuws/
Stap 6: testen
Rene Pijlman
03/01/05, 20:35
Erick T. Barkhuis:
>Poster666:
>> <?php
>> $filename = "nieuws.txt";
>> $fp = fopen("$filename", "r") or die("Kan $filenaam niet openen");
>> while ( ! feof($fp) )
>> { $line = fgets( $fp; 1024 );
>> print "<b> $line </b> <br>";
>> }
>> ?>
>Je volgorde van lezen en uitvragen op eof is niet erg logisch.
>Doe het liever zo:
>
>$fp = fopen("$filename", "r") or die("Kan $filenaam niet openen");
>$line = fgets( $fp; 1024 );
> while ( ! feof($fp) ) {
> print "<b> $line </b> <br>";
> $line = fgets( $fp; 1024 );
> }
Que? Ik vind het origineel eleganter, omdat er maar één keer een fgets()
staat waarvan de return value FALSE genegeerd wordt. En omdat de laatste
$line van de loop niet overboord valt.
Taakstraf: 3 artikelen van wijlen prof. Edsger Dijkstra lezen.
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
Erick T. Barkhuis
03/01/05, 20:55
Rene Pijlman [on Mon, 03 Jan 2005 20:29:46 +0100] wrote:
> Erick T. Barkhuis:
> >$fp = fopen("$filename", "r") or die("Kan $filenaam niet openen");
> >$line = fgets( $fp; 1024 );
> > while ( ! feof($fp) ) {
> > print "<b> $line </b> <br>";
> > $line = fgets( $fp; 1024 );
> > }
>
> Que? Ik vind het origineel eleganter, omdat er maar één keer een fgets()
> staat waarvan de return value FALSE genegeerd wordt. En omdat de laatste
> $line van de loop niet overboord valt.
Ik begrijp dat ik iets fout deed, aan de reacties te zien. Kennelijk heeft
mijn JSP-achtergrond (nee, heeft niks met java te maken) me hier parten
gespeeld.
Lees ik echter de php.net-documentatie, dan wordt me althans daaruit niet
duidelijk wat ik fout doe.
Kan iemand mij het rechte pad wijzen, namelijk de documentatie waaruit
blijkt _wanneer_ exact 'eof' true wordt?
Ik weet uit de mainframe-filesystem-wereld (met COBOL, bijvoorbeeld), dat
een record-leesopdracht OF een gevuld record oplevert, OF een 'eof'. Dat
betekent, dat je dus minstens 1 leesopdracht nodig hebt om vast te stellen
of een bestand leeg is. In die wereld is de constructie zoals ik beschreef
noodzakelijk.
Kennelijk is dat met PHP niet zo...maar waar vind ik dat?
--
Erick
"Make it as simple as possible, but not simpler!" - Albert Einstein
Rene Pijlman
03/01/05, 21:15
Erick T. Barkhuis:
>> >$fp = fopen("$filename", "r") or die("Kan $filenaam niet openen");
>> >$line = fgets( $fp; 1024 );
>> > while ( ! feof($fp) ) {
>> > print "<b> $line </b> <br>";
>> > $line = fgets( $fp; 1024 );
>> > }
>Ik begrijp dat ik iets fout deed, aan de reacties te zien. Kennelijk heeft
>mijn JSP-achtergrond (nee, heeft niks met java te maken) me hier parten
>gespeeld.
Je weet hoe ik over JSP denk. (Ik wist het zelf niet meer, maar gelukkig
had Google het voor me onthouden)
>Lees ik echter de php.net-documentatie, dan wordt me althans daaruit niet
>duidelijk wat ik fout doe.
>Kan iemand mij het rechte pad wijzen, namelijk de documentatie waaruit
>blijkt _wanneer_ exact 'eof' true wordt?
Dat soort exactheid verwacht ik al lang niet meer van de PHP-documentatie.
Ik ging af op http://nl2.php.net/manual/nl/function.fgets.php :
Voorbeeld 1. Een bestand regel voor regel lezen
<?php
$handle = fopen ("/tmp/inputfile.txt", "r");
while (!feof ($handle)) {
En op http://nl3.php.net/feof staat "De bestands pointer moet geldig zijn,
en moet verwijzen naar een bestand dat succesvol geopend is door fopen(),
popen() of fsockopen()". Aan die voorwaarde is voldaan. Er staat nergens
dat er eerst een fgets() zou moeten hebben plaatsgevonden.
Aan een preconditie die er niet is, hoeft niet te worden voldaan. Het is
niet zo dat een preconditie een uitputtende lijst moet bevatten van alle
voorwaarden waaraan niet voldaan hoeft te worden.
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
Erick T. Barkhuis
03/01/05, 21:25
Rene Pijlman [on Mon, 03 Jan 2005 21:05:55 +0100] wrote:
> En op http://nl3.php.net/feof staat "De bestands pointer moet geldig zijn,
> en moet verwijzen naar een bestand dat succesvol geopend is door fopen(),
> popen() of fsockopen()". Aan die voorwaarde is voldaan. Er staat nergens
> dat er eerst een fgets() zou moeten hebben plaatsgevonden.
Dat stukje had ik gelezen, maar je zult met me eens zijn dat daar niet
staat exact WANNEER de eof-status wordt bereikt.
Inderdaad, het bestand is geopend. Maar kan op dat moment feof() reeds de
waarde true krijgen? Ik lees dat er niet uit.
Laat onverlet dat het misschien wel zo is, en de voorbeelden suggereren
dat inderdaad. Aan de andere kant: we zien wel vaker voorbeelden die niet
bijster kloppen op die PHP-site. Hele stapels gebruikerscommentaren zijn
er dan nodig om de juiste voorbeelden boven water te krijgen.
Kortom, ik weet gewoon niet precies hoe het zit, al dacht ik dat, met mijn
mainframe-programmeurs-achtergrond, eventjes wel te weten.
--
Erick
"This newsgroup is so important; we can't let things that are more
important interfere with it."
Rene Pijlman
03/01/05, 21:55
Erick T. Barkhuis:
>Rene Pijlman:
>> En op http://nl3.php.net/feof staat "De bestands pointer moet geldig zijn,
>> en moet verwijzen naar een bestand dat succesvol geopend is door fopen(),
>> popen() of fsockopen()". Aan die voorwaarde is voldaan. Er staat nergens
>> dat er eerst een fgets() zou moeten hebben plaatsgevonden.
>
>Dat stukje had ik gelezen, maar je zult met me eens zijn dat daar niet
>staat exact WANNEER de eof-status wordt bereikt.
Ik lees aldaar: "Geeft TRUE terug als de bestands pointer op EOF
(einde-van-bestand) is of als er een fout optreed. Anders geeft hij FALSE
terug."
Dat is toch duidelijk? De EOF wordt bereikt als de bestandspointer op
einde-van-bestand staat. Het bestand heeft N bytes, en er is EOF als de
bestandspointer op N staat.
>Inderdaad, het bestand is geopend. Maar kan op dat moment feof() reeds de
>waarde true krijgen?
Ik zou denken dat het antwoord "ja" is (bestand met 0 bytes), maar dat is
toch niet relevant? Roep de functie aan en je ziet vanzelf of je true of
false krijgt.
Laat ik het eens omdraaien. Het is toch bizar om fgets() aan te roepen,
als je niet eerst gechecked hebt of je niet al aan het einde van het
bestand bent en er dus niets meer te fgetsen is?
Ik betrek de stelling dat fgets($handle) in een fatsoenlijke taal als
preconditie zou moeten hebben:
not feof($handle)
En dan komt de programmeur in deze casus, ongeacht niveau en competentie,
noodgedwongen op het elegantere algoritme.
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
Erick T. Barkhuis
03/01/05, 22:15
Rene Pijlman [on Mon, 03 Jan 2005 21:51:57 +0100] wrote:
> Laat ik het eens omdraaien. Het is toch bizar om fgets() aan te roepen,
> als je niet eerst gechecked hebt of je niet al aan het einde van het
> bestand bent en er dus niets meer te fgetsen is?
Niet als het juist fgets() is dat de pointer op eof doet belanden.
--
Erick
"Onderschat niets! Het lot van de mensheid hing eens van een appel af" - Loepold Koch
Rene Pijlman
03/01/05, 22:45
Erick T. Barkhuis:
>Rene Pijlman:
>> Laat ik het eens omdraaien. Het is toch bizar om fgets() aan te roepen,
>> als je niet eerst gechecked hebt of je niet al aan het einde van het
>> bestand bent en er dus niets meer te fgetsen is?
>
>Niet als het juist fgets() is dat de pointer op eof doet belanden.
Tsja, de mores van de Object Oriëntatie zijn kennelijk niet aan de
COBOL-generatie besteed ;-)
--
René Pijlman
Wat wil jij leren? http://www.leren.nl
Daniel Tryba
03/01/05, 22:55
Erick T. Barkhuis <spamblok@webwax.nl> wrote:
>> Laat ik het eens omdraaien. Het is toch bizar om fgets() aan te roepen,
>> als je niet eerst gechecked hebt of je niet al aan het einde van het
>> bestand bent en er dus niets meer te fgetsen is?
>
> Niet als het juist fgets() is dat de pointer op eof doet belanden.
>
Stel je maar voor dat fopen() aan buffered file I/O doet. Waar de echte
filepointer zich bevindt doet niet terzake. Bij een feof() kan er of nog
van de filestream worden gelezen of er zitten nog ongelezen bytes in een
buffer om te lezen met bv fgets().
Erick T. Barkhuis
04/01/05, 09:05
Rene Pijlman [on Mon, 03 Jan 2005 22:44:11 +0100] wrote:
> Erick T. Barkhuis:
> >Rene Pijlman:
> >> Laat ik het eens omdraaien. Het is toch bizar om fgets() aan te roepen,
> >> als je niet eerst gechecked hebt of je niet al aan het einde van het
> >> bestand bent en er dus niets meer te fgetsen is?
> >
> >Niet als het juist fgets() is dat de pointer op eof doet belanden.
>
> Tsja, de mores van de Object Oriëntatie zijn kennelijk niet aan de
> COBOL-generatie besteed ;-)
De wereld gaat naar de verdoemenis, dat blijkt maar telkens weer. :-(
--
Erick
"Je ben of te vroeg of te laat of op tijd; de eerste twee hep je niks an."
- Johan Cruijff, TV commentaar na Nederland-Joegoslavie op EK2000