Was ist zu tun bei "PHP Warning: Invalid argument supplied for foreach()"

  • Ich bekomme in den error-logs immer folgende Fehlermeldungen und weiss nicht was ich machen soll, da bin ich zu sehr Laie . . . auffällig ist, das es immer die Zeile 571 und 612 ist.

    Hier die Zeile 571 (für 612 gilt dasselbe):

    571 foreach( $value['options'] as $key => $option ) {
    572 $i++;
    573 $checked = '';
    574 $key = it_get_slug($key,$key);


    Bitte dringend um Hilfe. Danke.


    12.04.2014 11:24:17 ilovecycling.de [client 90.153.38.0] PHP Warning: Invalid argument supplied for foreach() in /mnt/weba/a3/68/5676668/htdocs/WordPress_01/wp-content/themes/explicit/functions/admin/option-generator.php on line 612, referer: http://ilovecycling.de/wp-admin/edit.…list&action2=-1
    12.04.2014 11:26:06 ilovecycling.de [client 90.153.38.0] PHP Warning: Invalid argument supplied for foreach() in /mnt/weba/a3/68/5676668/htdocs/WordPress_01/wp-content/themes/explicit/functions/admin/option-generator.php on line 571, referer: http://ilovecycling.de/literatur/buch…ng-im-radsport/
    12.04.2014 11:26:06 ilovecycling.de [client 90.153.38.0] , referer: http://ilovecycling.de/literatur/buch…ng-im-radsport/
    12.04.2014 11:26:06 ilovecycling.de [client 90.153.38.0] 1 messages repeated, referer: http://ilovecycling.de/literatur/buch…ng-im-radsport/

    Einmal editiert, zuletzt von joelamann (12. April 2014 um 11:55)

    • Anzeige

    Hallo!

    Wenn du gerade an deiner Website arbeitest oder dein aktuelles Hosting überdenkst: Wir betreiben mit NetzLiving eine Hosting-Plattform, die speziell auf Performance, Sicherheit und einfache Verwaltung ausgelegt ist.

    • ✔️ Schnelle Ladezeiten (optimiert für WordPress & Co.)
    • ✔️ Deutsche Server & DSGVO-konform
    • ✔️ Persönlicher Support (kein 0815-Ticket-System)

    Mehr erfahren

  • auffällig ist, das es immer die Zeile 571 und 612 ist.


    Dabei handelt es sich nur um die Zeilen mit den Funktionen, in denen die Fehler bemerkt werden, zum Beispiel weil ein Schlüssel fehlt oder nicht ins Schlüsselloch passt. Es handelt sich aber nicht um die Zeilen, in denen ein Schlüssel beschädigt wurde oder verloren ging. Allgemein setzt man dazu vorher noch eine Abfrage, die erst einmal überprüft, ob ein Schlüssel vorhanden ist und führt die Funktionen in diesen Zeile nur aus, wenn ein unbeschädigter Schlüssel vorhanden ist.

    Gibt noch eine Alternative mit @, für WP würde ich die nicht empfehlen, desshalb schreibe ich mal lieber nicht wie es geht. Der Entwickler oder Programmierer, der das entwickelt hat, sollte aber schon wissen, was zu tun ist.

    Also einfacher, options gingen vorher verloren oder wurden vorher beschädigt und foreach meckert nun, was für ein Zeug Du ihr andrehen möchtest.

    Einmal editiert, zuletzt von Melewo (12. April 2014 um 12:17)

  • Tendenziell erscheint DIE Fehlermeldung wenn das übergebene kein array ist - vorher mal auf isset und is_array überprüfen, nur wenn beides positiv ist ins foreach gehen.

    Man kann die Realität ignorieren - aber nicht die Folgen der ignorierten Realität.

  • Hallo ihr Beiden, danke für die schnelle Antwort,

    habe mal mittlerweile folgendes probiert und die beiden Zeilen mit folgendem Code ersetzt:
    [COLOR=#555555][FONT=Arial]
    The old line 571 and 612:[/FONT][/COLOR]
    [COLOR=#555555][FONT=Arial]foreach( $value['options'] as $key => $option ) {
    [/FONT][/COLOR]
    [COLOR=#555555][FONT=Arial]The new Line 571 and 612:[/FONT][/COLOR]
    [COLOR=#555555][FONT=Arial]foreach ((array) $value['options'] as $key => $option ) {

    Bisher habe ich keine weitere Fehlermeldung bekommen, oder habe ich jetzt grundsätzlich etwas falsch gemacht?[/FONT][/COLOR]

  • Hi Nevery,

    danke für Deine Antwort, aber ich bin dann doch zu sehr Laie ;-)

    Wie und wo prüfe ich auf isst und is_array?

    [COLOR=#333333]Habe mal mittlerweile folgendes probiert und die beiden Zeilen mit folgendem Code ersetzt:[/COLOR]
    [COLOR=#555555][FONT=Arial]
    The old line 571 and 612:[/FONT][/COLOR]
    [COLOR=#555555][FONT=Arial]foreach( $value['options'] as $key => $option ) {
    [/FONT][/COLOR]
    [COLOR=#555555][FONT=Arial]The new Line 571 and 612:[/FONT][/COLOR]
    [COLOR=#555555][FONT=Arial]foreach ((array) $value['options'] as $key => $option ) {

    Bisher habe ich keine weitere Fehlermeldung bekommen, oder habe ich jetzt grundsätzlich etwas falsch gemacht?[/FONT][/COLOR]

  • Tendenziell erscheint DIE Fehlermeldung wenn das übergebene kein array ist - vorher mal auf isset und is_array überprüfen, nur wenn beides positiv ist ins foreach gehen.

    [COLOR=#333333]Hi Nevery,[/COLOR]

    [COLOR=#333333]danke für Deine Antwort, aber ich bin dann doch zu sehr Laie [/COLOR]:wink:

    [COLOR=#333333]Wie und wo prüfe ich auf isset und is_array?[/COLOR]

    [COLOR=#333333][COLOR=#333333]Habe mal mittlerweile folgendes probiert und die beiden Zeilen mit folgendem Code ersetzt:[/COLOR][/COLOR]
    [COLOR=#555555][FONT=Arial]
    The old line 571 and 612:[/FONT][/COLOR]
    [COLOR=#555555][FONT=Arial]foreach( $value['options'] as $key => $option ) {
    [/FONT][/COLOR]
    [COLOR=#555555][FONT=Arial]The new Line 571 and 612:[/FONT][/COLOR]
    [COLOR=#555555][FONT=Arial]foreach ((array) $value['options'] as $key => $option ) {

    Bisher habe ich keine weitere Fehlermeldung bekommen, oder habe ich jetzt grundsätzlich etwas falsch gemacht?[/FONT][/COLOR]

  • [COLOR=#555555][FONT=Arial]foreach ((array) $value['options'] as $key => $option ) [/FONT][/COLOR]


    Würde ich vorher prüfen, wie Nevery schrieb, alles eine Frage der Sicherheit bei WP, sonst könntest Du ja gleich

    Code
    @foreach( $value['options'] as $key => $option ) {


    schreiben, um keine Fehlermeldungen mehr zu erhalten. Beides würde nicht die Frage beantworten, warum etwas nicht richtig übergeben wird und würde im schlimmsten Fall nur das was nicht richtig übergeben wurde, dennoch irgendwie verarbeiten. Nicht so, dass ich noch nie eine Typumwandlung machte, doch dann wusste ich auch warum und weshalb.

    Einmal editiert, zuletzt von Melewo (12. April 2014 um 12:42)

  • Würde ich vorher prüfen, wie Nevery schrieb, alles eine Frage der Sicherheit bei WP, sonst könntest Du ja gleich

    Code
    @foreach( $value['options'] as $key => $option ) {


    schreiben, um keine Fehlermeldungen mehr zu erhalten.

    Hi Melewo,

    danke für deine Rückmeldung . . . aber wie und wo prüfe ich das??? Entschuldige für die Frage, aber ich bin dann doch zu sehr Laie.

  • Na aber irgendwer muss das doch wohl entwickelt haben und der wird auch wissen, was wo zu prüfen ist und zu verbessern ist.

    Die Diskussion mit dem Entwickler ist sehr mühsam . . . laut ihm liegt das am Provider (STRATO).

    Ich habe momentan ja auch noch einen 2ten Beitrag hier im Forum . . . vielleicht sind das zusammengehörige Probleme, ich weiss jetzt einfach nicht mehr weiter und bin für jede Unterstützung dankbar.

  • So vielleicht.

    PHP
    if (is_array($value) and count($value) > 0) {
        
         foreach( $value['options'] as $key => $option ) {
         ...
         ...
         ...
        } // Ende foreach
    } // Ende if

    Einmal editiert, zuletzt von Melewo (12. April 2014 um 13:20)

  • So vielleicht.

    PHP
    if (is_array($value)) {
        
         foreach( $value['options'] as $key => $option ) {
         ...
         ...
         ...
        } // Ende foreach
    } // Ende if

    . . . und jetzt meine laienhafte Frage . . . wohin und/oder in welche Datei schreibe ich diesen Code?

    Hier die Kopie des jetzigen Codes (der die PHP-Fehlermeldungen bei Strato ausgibt):

    . . . als Datei angehängt.

  • Mein Code ist wohl falsch gewesen, ist ja mehrdimensional und somit sollte es wohl sein wie dieses Beispiel, musste ich erst einmal selbst testen (ohne else verwenden, nehme ich an):

  • Na Du wickelst die als Mantel um die foreach.

    Code
    $i = 0;
            if (is_array($value['options']) and count($value['options']) > 0) {
    
    
                foreach( $value['options'] as $key => $option ) {
                ...
                ...
               }
            }
            return $out;

    Wenn auch das nichts wird, dann frage halt den Entwickler, der hatte vor zwei Monaten eine ähnliche Frage gestellt bekommen und wollte das innerhalb von 24 Stunden beheben.

    Einmal editiert, zuletzt von Melewo (12. April 2014 um 13:48)

  • Jetzt habt ihr mich gleich geschafft . . . ;-)))

    Ich habe zuletzt eine Datei mit angehängt (option-generator-php), wie und wo integriere jetzt den Code? . . . oder könnte jemand von Euch die Datei so aufbereiten, dass ich sie gebrauchen kann?

  • . . . tja der Entwickler ist ein Entwickler der für Themeforest arbeitet . . . und immer wieder behauptet, dass es ein Fehler beim Provider ist und nicht ein Fehler im Theme.

  • So etwas lässt sich nicht mit einer einzelnen Datei testen, dazu müsste man sich das ganze Theme installieren, um zu schauen, wie was zusammen spielt, denn immerhin handelt es sich um eine ausgewachsene Datei mit einer ausgewachsenen Klasse itOptionGenerator, in der $value['options'] rund 40mal vorkommt und die foreach so wie in dieser Zeile

    Code
    foreach( $value['options'] as $key => $option ) {


    noch 9 oder 10 mal vorkommt, es aber scheinbar nur in der

    Code
    function awards_meta($value) 
    
    
    und in der 
    
    
    function reactions_meta($value)


    zu Problemen kommt, in den anderen Methoden hingegen nicht. Somit kann eine einfache if möglichweise auch versagen, weil ja irgendetwas in options immer enthalten sein könnte, nur nicht unbedingt das was eigentlich erwartet wurde. Das ist keine kleine Hilfe zur Selbsthilfe mehr, das würde in richtige Arbeit ausarten, die nicht in kurzer Zeit zu bewältigen wäre. Beim Entwickler des Themes ist das etwas anderes, der brauchte nicht erst einmal zwei Wochen, bevor der wüsste, warum was wie geschrieben wurde.
    Und wenn Du es selbst machen möchtest, könnte zuerst print_r Freund und Helfer werden, um immer wieder zu kontrollieren, was da eigentlich wann enthalten ist.


  • Die ersten zwei Zeilen und die letzte beachten - so um den entsprechenden Code herum setzen. Das dazwischen ist der Originalcode - wenn, wie gesagt, das Problem dadurch auftritt dass das foreach etwas durchgehen soll was kein Array ist wird das dadurch vermieden.

    Alternativ andersherum prüfen und wenns nicht passt aus der Funktion herausspringen, dafür müsstest Du diese beiden Zeilen VOR das foreach setzen:

    PHP
    if (!isset($value['options']) || !is_array($value['options']))
                return;

    Man kann die Realität ignorieren - aber nicht die Folgen der ignorierten Realität.

  • Unterschied, falls keine Optionen gespeichert bzw. an die Klasse oder Methode als gefülltes Array übergeben wurden.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!