PHP Invalid argument supplied for foreach

Blackbenji

Lieutenant
Registriert
Nov. 2009
Beiträge
563
Hallo,

ich rätsel gerade rum, warum mir in meinen Logfiles folgende Meldung auftaucht:

HTML:
[15.11.2012 - 15:10:45] - Warning: Invalid argument supplied for foreach() in /Applications/XAMPP/xamppfiles/htdocs/DevListBlog/class/Content.php on line 65

Die Stelle im Code:

PHP:
            while($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
                $content = $this->getContent('','',$row['content_id']);
                foreach($content as $c) {
                    $contentByCategory[] = array(
                        'headline' => $c['headline'],
                        'date' => $c['date'],
                    );
                }
            }

Findet jemand den Fehler ?
 
Poste mal die "getContent" Funktion bitte.

Naja ich behaupte mal dreist der Fehler wird dort liegen und das so ziemlich der ganze Schritt unnötig ist. Sicher kann ich es aber erst sagen wenn ich weiß was die Funktion getContent wirklich macht :)

PS: Funktionen gehören ausgelagert in eine extra Datei ;)
 
Zuletzt bearbeitet:
$this->getContent() gibt nicht zwingend ein Array zurück. Du gibst unter gewissen Umständen n String oder NULL oder sowas zurück, anstatt z.B. array(String) oder eben array();
 
PHP:
    public function getContent($site = '', $state = '', $id = '') {
        $content_array = '';
        $result = $this->database->query("
            SELECT *,
            DATE_FORMAT(date, '%d.%m.%Y') AS date_format,
            DATE_FORMAT(date, '%H:%i:%s') AS time_format FROM ".GLOBAL_CONTENT_DB."
            ".($id !== '' ? ' WHERE id = ' . $id : '')."
            ".($state !== '' ? ' WHERE state = ' . $state : '')."
            ORDER by date DESC
            ".($site !== '' ? ' LIMIT '.$site.','.ITEM_PRO_SITE : '')."
        ");
        while($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
            $comments_count = $this->comments->countComments($row['id'],'1');
            $state_name = $this->state->getState($row['state']);
            $author_name = $this->user->getUserData($row['id_author']);
            $category = $this->category->getCategoryByNode($row['id']);
            $content_array[] = array(
                'id' => $row['id'],
                'author_name' => htmlentities($author_name['username'], ENT_QUOTES, "UTF-8"),
                'headline' => htmlentities($row['headline'], ENT_QUOTES, "UTF-8"),
                'date' => $row['date_format'],
                'time' => $row['time_format'],
                'content' => htmlentities($row['content'], ENT_QUOTES, "UTF-8"),
                'state' => $row['state'],
                'state_name' => $state_name,
                'comments' => $comments_count,
                'category' => $category
            );
        }
        return $content_array;
    }

bitteschön

edit: ok ... wenn getContent mit einer id aufgerufen wird, die es nicht gibt, ist $content kein array ...

danke ich such mal in der datenbank nach dem defekten eintrag.
 
Initiiere $content_array mit $content_array=array(), nicht als leeren String.
Problem gelöst.
 
Ja die gesamte getContent Funktion ist ziemlich unnötig und auf den ersten Blick fehlerhaft da deine Variablen immer verwendest ohne zu prüfen ob die überhaupt gesetzt sind. Zudem machst du die gesamte Abfrage die du ja schon haben musst da du ja das array vom $result erzeugst.
Wenn du da noch weitere Infos brauchst, dann frage diese doch gesondert ab.

Das mit dem als array initiieren wird übrigens nicht helfen da php das automatisch korrigiert :)
 
Hi,

kann Daaron (wie so oft :) ) nur zustimmen: Typänderung der Variable als Array und nicht als Leerstring sollte schon helfen.

VG,
Mad
 
IC3HANDS schrieb:
Das mit dem als array initiieren wird übrigens nicht helfen da php das automatisch korrigiert :)
In dem Falle eben nicht.
Die Funktion gibt die Variable zurück. WENN die SQL-Abfrage einen Wert zurück gibt und somit die while-Schleife wenigstens 1x läuft, dann ändert PHP den Typ von (leerem) String auf gefüllten Array. Wenn die Schleife aber nie triggert, dann gibt die Funktion einen leeren String statt eines leeren Arrays zurück. Das nächste was dann kommt ist ein foreach auf n String... sowas muss schief gehen.
 
Ja aber sein Array hat keinen sinnvollen Wert wodurch es trotzdem wieder schief gehen würde, daher ist das egal ;)

Also ja, der Fehler wäre weg, aber er hätte auch nicht die Funktion welcher er sich erhofft..
 
Das Problem hat sich gelöst durch das korrigieren des Datenbankeintrags.
Danke für den Hinweiß mit dem Array, habe ich korrigiert.
 
Okay, trotzdem solltest du mal an eine Fehlerbehandlung im PHP Code nachdenken und mehr auslagern das du nicht alles doppelt programmieren musst :)
 

Ähnliche Themen

Zurück
Oben