Probleme mit der Funktion file()
bearbeitet von
Hallo
**[edit]** eine Fußnote eingefügt und an zwei Stellen die Wortwahl korrigiert **[/edit]**
> Ich habe mein Script /temp/test.php nochmal erweitert:
>
> ~~~php
> <?php
> accessFile("foo.txt");
> accessFile("test.php");
> accessFile("/temp/foo.txt");
> accessFile("/temp/test.php");
> accessFile("temp/foo.txt");
> accessFile("temp/test.php");
>
> function accessFile($name) {
> echo "\naccess $name\n\n";
>
> if (false === ($cont = file($name, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)))
> echo "\nDat war nix";
> else
> echo "\nHabe ".count($cont)." Zeilen gefunden";
> }
> ~~~
>
> /temp/foo.txt gibt es nicht. Ich bekomme konsequent für foo.txt die Warnung und die Ausgabe "Dat war nix".
Und jetzt muss ich wohl einen langhalsigen Wasservogel ververben. In anderen Worten: Mir schwant etwas.
Error spricht (mit eingeschaltetem Error-Reporting) von folgender Ausgabe.
~~~
Warning: file(var/log/apache2/example.com/access.log): failed to open stream: No such file or directory in /var/www/example.com/htdocs/log/index.php on line 65
Notice: Array to string conversion in /var/www/example.com/htdocs/log/index.php on line 67 Array
~~~
Ich versuche das mal auseinanderzudröseln.
Die Datei existiert nicht, woraus die offensichtliche Warnung resultiert.
~~~
Warning: file(var/log/apache2/example.com/access.log): failed to open stream: No such file or directory in /var/www/example.com/htdocs/log/index.php on line 65
~~~
Ich war fälschlicherweise davon ausgegangen, dass die Warnung alles ist, aber `file` generiert ~~sowohl~~ die Warnung, gibt aber zusätzlich auch `false` zurück. Momit wir bei der mutmaßlichen Ursache für die Ausgabe von „Array“ sind.
~~~
Notice: Array to string conversion in /var/www/example.com/htdocs/log/index.php on line 67 Array
~~~
Die Ausgabe stammt, so vermute ich, ***nicht*** von `file`, sondern aus der Fehlerbehandlung von Error[^1], die laut dem Eröffnungsposting folgendermaßen aussieht.
[^1]: Dazu passt auch, dass der zweite Fehler zwei Zeilen nach dem ersten auftritt.
~~~
if (false === ($loglines = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)))
{
exit (error_get_last());
}
~~~
Der Code springt also sehr wohl in den Fehlerblock und beendet das Skript, wobei mit `error_get_last` eine Ausgabe der ~~Ausgabe~~ *Fehlermeldungen* erzeugt werden soll. Für [die Funktion `error_get_last`](https://www.php.net/manual/en/function.error-get-last.php) ist als Rückgabewert ein assoziatives Array angegeben. Dieses Array wird mit `exit (error_get_last());` aber in einen String umgewandelt, der schlicht „Array“ lautet.
Kein Bug in `file`, sondern, *wenn ich richtig liege*, nur eine falsche Benutzung von `error_get_last`.
Tschö, Auge
--
„Habe ich mir das nur eingebildet, oder kann der kleine Hund wirklich sprechen?“ fragte Schnapper.
„Er behauptet, nicht dazu imstande zu sein“ erwiderte Victor.
Schnapper zögerte (…) „Nun …“ sagte er schließlich, „ich schätze, er muss es am besten wissen.“
Terry Prattchett, Voll im Bilde
Probleme mit der Funktion file()
bearbeitet von
Hallo
> Ich habe mein Script /temp/test.php nochmal erweitert:
>
> ~~~php
> <?php
> accessFile("foo.txt");
> accessFile("test.php");
> accessFile("/temp/foo.txt");
> accessFile("/temp/test.php");
> accessFile("temp/foo.txt");
> accessFile("temp/test.php");
>
> function accessFile($name) {
> echo "\naccess $name\n\n";
>
> if (false === ($cont = file($name, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)))
> echo "\nDat war nix";
> else
> echo "\nHabe ".count($cont)." Zeilen gefunden";
> }
> ~~~
>
> /temp/foo.txt gibt es nicht. Ich bekomme konsequent für foo.txt die Warnung und die Ausgabe "Dat war nix".
Und jetzt muss ich wohl einen langhalsigen Wasservogel ververben. In anderen Worten: Mir schwant etwas.
Error spricht (mit eingeschaltetem Error-Reporting) von folgender Ausgabe.
~~~
Warning: file(var/log/apache2/example.com/access.log): failed to open stream: No such file or directory in /var/www/example.com/htdocs/log/index.php on line 65
Notice: Array to string conversion in /var/www/example.com/htdocs/log/index.php on line 67 Array
~~~
Ich versuche das mal auseinanderzudröseln.
Die Datei existiert nicht, woraus die offensichtliche Warnung resultiert.
~~~
Warning: file(var/log/apache2/example.com/access.log): failed to open stream: No such file or directory in /var/www/example.com/htdocs/log/index.php on line 65
~~~
Ich war fälschlicherweise davon ausgegangen, dass die Warnung alles ist, aber `file` generiert sowohl die Warnung, gibt aber zusätzlich auch `false` zurück. Momit wir bei der mutmaßlichen Ursache für die Ausgabe von „Array“ sind.
~~~
Notice: Array to string conversion in /var/www/example.com/htdocs/log/index.php on line 67 Array
~~~
Die Ausgabe stammt, so vermute ich, ***nicht*** von `file`, sondern aus der Fehlerbehandlung von Error, die laut dem Eröffnungsposting folgendermaßen aussieht.
~~~
if (false === ($loglines = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES)))
{
exit (error_get_last());
}
~~~
Der Code springt also sehr wohl in den Fehlerblock und beendet das Skript, wobei mit `error_get_last` eine Ausgabe der Ausgabe erzeugt werden soll. Für [die Funktion `error_get_last`](https://www.php.net/manual/en/function.error-get-last.php) ist als Rückgabewert ein assoziatives Array angegeben. Dieses Array wird mit `exit (error_get_last());` aber in einen String umgewandelt, der schlicht „Array“ lautet.
Kein Bug in `file`, sondern, *wenn ich richtig liege*, nur eine falsche Benutzung von `error_get_last`.
Tschö, Auge
--
„Habe ich mir das nur eingebildet, oder kann der kleine Hund wirklich sprechen?“ fragte Schnapper.
„Er behauptet, nicht dazu imstande zu sein“ erwiderte Victor.
Schnapper zögerte (…) „Nun …“ sagte er schließlich, „ich schätze, er muss es am besten wissen.“
Terry Prattchett, Voll im Bilde