foreach
jakkie
- php
0 Alexander Brock0 Vinzenz Mai0 Chris
hi, ich habe ein problem mit einer foreach-schleife:
$Content = @file($fn);
foreach ($Content as $currentRow) {
//bla
}
dann zeigt er mir folgendes an:
Warning: Invalid argument supplied for foreach() in [...]
^^Die Zeile mit foreach()
Wo liegt mein Fehler?
mfg
jakkie
Hallo Freunde des gehobenen Forumsgenusses,
$Content = @file($fn);
foreach ($Content as $currentRow) {
//bla
}
> dann zeigt er mir folgendes an:
> Warning: Invalid argument supplied for foreach() in [...]
> ^^Die Zeile mit foreach()
>
> Wo liegt mein Fehler?
Was ergibt `print_r($Content);`{:.language-php}?
Gruß
Alexander Brock
--
![A](http://alexanderbrock.de/img/pavatar.png)
[VLinkchecker - Ein Klasse in PHP, die Websites rekursiv abruft und nach kaputten Links sucht.](http://alexanderbrock.de/vlinkchecker/)
Danke, hab den Fehler grad selbst gefunden.
Da ich das php-file hin und her kopiert habe, hat er das zu öffnende file net gefunden, trotzdem thx.
n'abend,
Danke, hab den Fehler grad selbst gefunden.
Da ich das php-file hin und her kopiert habe, hat er das zu öffnende file net gefunden, trotzdem thx.
vor foreach($variable ...) blöcken solltest du $variable auf gewisse dinge prüfen
if(!is_array($variable) || !count($variable)) die('entweder ist die variable kein array, oder aber das array hat keine elemente');
(nur zur veranschaulichung)
speziell wenn du mit daten aus ner datei / db-query oder sonst was arbeitest, wo du nicht 100% sicher sein kannst was du da eigentlich bekommst... kann ja schliesslich auch sein, dass die datei, die du mit file(...) einliest leer ist... oder eben, dass die datei nicht gefunden werden kann...
weiterhin schönen abend...
echo $begrüßung;
vor foreach($variable ...) blöcken solltest du $variable auf gewisse dinge prüfen
if(!is_array($variable) || !count($variable)) die('entweder ist die variable kein array, oder aber das array hat keine elemente');
Die Prüfung, ob das Array Elemente enthält ist nicht notwendig. foreach kommt sehr gut mit leeren Arrays aus.
Allgemein kann diese Prüfung nur ein Notnagel sein. Wenn $variable kein Array ist, dann ist schon vorher im Programmablauf was schief gelaufen.
Sinnvoller ist es, $variable zunächst als leeres Array zu initialisieren und dann das Arrays mit den gewünschten Werten zu füllen.
Wenn das Array von einer Funktion erzeugt wird - wie im Falle von file() - sollte man unmittelbar danach prüfen, ob dies geklappt hat und im Fehlerfall $variable definiert auf ein leeres Array setzen.
echo "$verabschiedung $name";
Hallo Dedlfix,
Die Prüfung, ob das Array Elemente enthält ist nicht notwendig. foreach kommt sehr gut mit leeren Arrays aus.
Ich habe da auch erst überlegt, ob ich nochmal Senf dazugebe :-)
Hier hängt die Entscheidung, an welcher Stelle man auf Array und auf Anzahl der Elemente prüft, sicher von der funktionalen Abgrenzung der Aufgaben des Scriptes ab.
Wenn man z.B. eine allgemeine Anzeigefunktion für Tabellen baut, die für den Fall, dass keine Daten vorhanden sind, eben nicht eine leere Tabelle erzeugen soll, sondern den Satz "keine Daten da", kann das schon sinnvoll sein, an dieser Stelle (nochmals) zu prüfen.
Generell sollte man Fehler aber immer sofort nach dem (möglichen) Auftreten behandeln. Da ist man dann ganz schnell bei der Aufteilung jeder Detailaufgabe in Funktionen.
An dieser Stelle bedaure ich immer, dass PHP in prozeduraler Verwendung keine Private Functions kennt.
LG
Chris
echo $begrüßung;
Die Prüfung, ob das Array Elemente enthält ist nicht notwendig. foreach kommt sehr gut mit leeren Arrays aus.
Hier hängt die Entscheidung, an welcher Stelle man auf Array und auf Anzahl der Elemente prüft, sicher von der funktionalen Abgrenzung der Aufgaben des Scriptes ab.
Wenn man z.B. eine allgemeine Anzeigefunktion für Tabellen baut, die für den Fall, dass keine Daten vorhanden sind, eben nicht eine leere Tabelle erzeugen soll, sondern den Satz "keine Daten da", kann das schon sinnvoll sein, an dieser Stelle (nochmals) zu prüfen.
Ja natürlich. Da das dann aber im Gegensatz zu globes vorgeschlagener genereller Fehlerbehandlung eine funktionale Anforderung. Da das Funktionale ja sowieso das ist wofür man programmiert, gehe ich nicht davon aus, dass eine Prüfung für diesen Zweck wegen Nichtwissen des Programmieranfängers untergeht.
Ich füge meiner Aussage von oben noch ein "generell" in das "nicht notwendig" ein, dann wird sie hoffentlich wieder etwas eindeutiger.
echo "$verabschiedung $name";
Hallo,
Danke, hab den Fehler grad selbst gefunden.
Da ich das php-file hin und her kopiert habe, hat er das zu öffnende file net gefunden, trotzdem thx.
Das ist nicht der Fehler, sondern nur die Ursache.
Der Fehler ist Dein schlampiger Programmierstil :-)
LG
Chris
Hallo,
$Content = @file($fn);
wenn Du nicht überprüfst, ob dies erfolgreich ist und Fehlermeldungen einfach unterdrückst, wie kannst Du Dir sicher sein, dass in der nächsten Anweisung
foreach ($Content as $currentRow) {
in $Content etwas drinsteht, was foreach verarbeiten könnte.
Wo liegt mein Fehler?
Im Unterdrücken und Ignorieren von Fehlermeldungen bzw. Rückgabewerten, file() gibt im Fehlerfall false zurück. Diesen Fall solltest Du einfach berücksichtigen.
Freundliche Grüße
Vinzenz
Hallo,
$Content = @file($fn);
foreach ($Content as $currentRow) {
//bla
}dann zeigt er mir folgendes an:
Warning: Invalid argument supplied for foreach() in [...]
^^Die Zeile mit foreach()Wo liegt mein Fehler?
Dein Hauptfehler dürfte sein, dass Du nicht alle Fehlermeldungen eingeschaltet hast, wenigstens zum Entwickeln!
Stelle an den Anfang Deines Scriptes erstmal ein
error_reporting(E_ALL);
und vergewissere Dich durch Test, ob nun auch Notices angezeigt werden.
Der zweite Fehler ist sicher, dass Du auch noch die Fehleroption @ einsetzt, um automatische Fehlermeldungen zu unterdrücken, ohne nachher zu prüfen, ob ein fehler aufgetreten ist. Dazu dient die Variable $php_errormsg mit der Einstellung
ini_set('track_errors','1')
am Anfang des Scriptes.
Der dritte Fehler ist, dass Du Foreach-Schleifen benutzt, ohne vorher eine Abfrage auf Gültigkeit des Argumentes durchzuführen. Insbesondere bei automatischer Datenzuführung gehört for jede Foreach-Schleife ein
if(is_array($argument))
{
foreach($argument as $key => $val)
{
# ...
}
}
else
{
# Reaktion auf falsches Argument
}
wobei die Reaktion je nach Anwendungsfall entfallen kann oder aber auch erhebliche Maßnahmen erfordern kann. Das kannst nur Du als ProgrammiererIn wissen.
LG
Chris