Unlogisches PHP-Problem

  • Manchmal glaube ich echt, ich bin im falschen Film oder irgendwer oder was will mich absichtlich ärgern.

    Hier mal ein paar Zeilen Code, die waren nur zum Debuggen, weil der eigentlich Code nicht geht. Die aber auch nicht :cursing:

    var_dump($sysdata['region'][7]);

    // Ist vorhanden und liefert alt Ergebnis: string(19) "region_Schwarzwald/"

    var_dump($sysdata['anzahl_feiertage']['pfingsten']['gesamt']);

    // Ist vorhanden und liefert als Ergebnis: string(1) "1"

    if(isset($sysdata['anzahl_feiertage']['pfingsten']['gesamt']))

    echo 'TEST 1';

    // Funktioniert, Ausgabe "TEST 1"

    if($sysdata['anzahl_feiertage']['pfingsten']['gesamt'] > 0)

    echo 'TEST 2';

    // Funktioniert, Ausgabe "TEST 2"

    if(isset($sysdata['region'][7]))

    echo 'TEST 3';

    // Funktioniert, Ausgabe "TEST 3"

    if(isset($sysdata['region'][7]) AND isset($sysdata['anzahl_feiertage']['pfingsten']['gesamt']) AND $sysdata['anzahl_feiertage']['pfingsten']['gesamt'] > 0)

    {

    echo 'TEST 4';

    }

    ^^ Das sind nun also die drei Bedingungen nur verknüpft, also die drei, die oben funktionierten. Ich bekomme aber ums Verrecken kein "TEST 4".

    Hat einer eine Idee? Ich nicht mehr.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Ganz ehrlich, ich schmeiße so langsam alles hin, mir reicht es. Wegen mir Hartz4, mir auch egal. Ich komme mir vor wie der letzte Depp, der zu doof ist eine if-else-Bedingung aufzubauen. Scheiße, da habe ich welche mit 30 Bedingungen, die gehen. Und den Mist habe ich damals schon mit 11 gelernt.

    Das oben geht immer noch nicht. Und nun, ein anderer Code, viel einfacher, geht auch nicht. Entweder bin ich echt zu doof, oder ich spinne oder keine Ahnung was.


    Code:

    $data_sym = 'Nordsee-Fuck'; // Wert festgelegt

    echo 'data_sym: '.$data_sym; // Ausgabe per Echo -> Nordsee

    echo '<br>';

    var_dump($data_sym); // var_dump -> Nordsee

    echo '<br>';

    if(!isset($data_sym) OR $data_sym == 0) // Nur eine Abfrage, ob die Var nicht da ist und ob sie 0 ist. Beides nicht der Fall, ist da und nicht 0, das muss also ignoriert werden

    {

    $ziel = '/unterkuenfte/region-'.$row->region.'/subregion-'.$row->subregion.'/'._seitenzahl();

    }

    else

    {

    $ziel = '/unterkuenfte/region-'.$data_sym.'/subregion-'.$row->subregion.'/'._seitenzahl();

    }

    echo 'Ziel: '.$ziel; // Das ist das Ergebnis aus "IF", was es nicht sein darf !!!!

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Kann mir trotzdem nochmal jemand ganz langsam erklaeren warum hier "===" das problem loest? Der string "Nordsee" laesst sich doch (anders als "0" oder "false") nicht nach (int)0 oder (bool)false konvertieren, oder was wird hier verglichen?

    PS: PHP Storm + xdebug ist dein freund :)

  • Margin 29. Mai 2020 um 06:46

    Hat den Titel des Themas von „Unlogisches PHP-Prolem“ zu „Unlogisches PHP-Problem“ geändert.
  • Doch Abakus Forumsfossil, genau das passiert hier. Genau der Grund, warum ich da auch drüber gestolpert bin.

    $data_sym kann zwei Werte enthalten: Entweder die Ziffer 0 oder einen String wie Nordsee

    Durch das "$data_sym == 0" geht PHP nun davon aus, dass $data_sym aber ein int sein soll und versucht das zu konvertieren. Kann er nicht aber es kommt der String "0" bei raus. Und "0" == 0 ist dann TRUE. Unterschiedliche Typen, aber dennoch beides irgendwie 0. Mit === werden auch die Typen verglichen, da ist dann "0" == 0 FALSE. Daher rannte der immer, obwohl die Var eben nicht Ziffer 0 war, in das falsche IF.

    Anders würde es auch gehen, mit "if($data_sym == '0')", denn dann versucht er die Ziffer 0 immer in einen String zu wandeln, was wieder "0" ergibt.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Hm; darauf waere ich beim lesen des codes nicht gekommen.

    Imho gehst du das problem (hier im beispiel) aber falsch an. Wenn du pruefen willst ob $data_sym gesetzt ist, wuerde ich is(empty($data_sym)) verwenden. Damit pruefst du, ob die variable gesetzt und nicht leer, 0, null oder "" ist.

    Wenn du sie vorher erst noch kuenstlich mit $data_sym = 0 initialisierst hast du ja potentiell schon 3 zustaende (nicht gesetzt, 0, alles andere) die die variable annehmen kann.

  • Das vorher definieren oben im Code ist nur in dem Code so gewesen. Das ist nicht der Original-Code, nur Testzeilen. Die Daten kommen normalerweise aus Json bzw. JS und die Var ist immer gesetzt. Entweder 0 oder String.

    aber ja, "empty" wäre auch ein Weg, dann wäre das Typenproblem gleich mit weg.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(