Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP Funktion: "Unsupported operand types"

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHP Funktion: "Unsupported operand types"

    Hallo,

    Ich arbeite bei einem größeren ISP in der Umgebung, und damit wir unsere IP-Zonen und Adressbereiche verwalten können, bin ich zur zeit dabei ein Script zu entwickeln, indem wir unsere Zonen anlegen können und jede IP speziell einem Kunden zuweisen inklusive Beschreibung können.

    Vielleicht ist einigen von euch das Netzwerkthema CIDR bekannt. Damit lassen sich IP-Netze berechnen (IP Range, Subnetzmaske, Anzahl der Hosts, etc).

    auf php.net habe ich dazu folgendes Snippet gefunden:
    PHP-Code:
    $ip_addr_cidr "192.168.37.215/27"
    $ip_arr explode('/'$ip_addr_cidr); 

    $bin ''
    for(
    $i=1;$i<=32;$i++) { 
        
    $bin .= $ip_arr[1] >= $i '1' '0'

    $ip_arr[1] = bindec($bin); 

    $ip ip2long($ip_arr[0]); 
    $nm ip2long($ip_arr[1]); 
    $nw = ($ip $nm); 
    $bc $nw | (~$nm); 

    echo 
    "Number of Hosts:    " . ($bc $nw 1) . "n"
    echo 
    "Host Range:         " long2ip($nw 1) . " -> " long2ip($bc 1)  . "n"
    Wenn ich nun dieses Code auf meinem MAMP Apache laufen lasse, bekomme ich folgende Fehlermeldung ausgespuckt:
    Fatal error: Unsupported operand types in /Applications/MAMP/htdocs/log.php on line 15
    Sobald ich aber das Snippet online ausführe, beispielsweise auf "http://writecodeonline.com/php/", funktioniert es ohne Probleme.

    Auf dem MAMP läuft 5.3.2.

    Liegt es an veralteten Funktionen? wenn ja, wie behebe ich diese Problem?

    Danke,
    Jonas

  • #2
    Wo ist denn Zeile 15?

    Zitat von frdmn Beitrag anzeigen
    PHP-Code:
    $nm ip2long($ip_arr[1]); 
    Das scheint mir bei CIDR nicht ganz koscher zu sein, führt aber nicht zu dem genannten Fehler.
    Meinungen, die ich geäußert habe, sind nicht notwendigerweise meine eigenen. Abweichungen von der deutschen Rechtschreibung unterliegen dem Urheberrecht, dürfen aber unter den Bedingungen von verwendet werden

    Kommentar


    • #3
      sorry, Zeile 15 entspricht "$bc = $nw | (~$nm);"

      Kommentar


      • #4
        Debugge den Code mal... var_dump auf ip_arr, nach dem bindec

        bindec() konvertiert eine binäre Zahl in einen integer oder, falls aus Größengründen benötigt, in einen float.
        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

        Kommentar


        • #5
          tut mir leid, aber ich bin recht neu im php-geschaeft.

          wie gehe ich beim debuggen vor?
          mich interessiert einfach nur warum der code online funktioniert. und auf meinem mamp oder webserver nicht.

          vielen dank,
          jonas

          Kommentar


          • #6
            2 potentielle Fehlerquellen:

            Die Bit-Operatoren arbeiten (nur) mit Integern zusammen, die Fehlermeldung
            Fatal error: Unsupported operand types in /Applications/MAMP/htdocs/log.php on line 15
            deutet darauf hin, das einer der Operanden kein Integer ist.

            bindec() kann u.U. anstatt eines Integer einen Float ausspucken (siehe Manual). Float wäre ein unsupported operand type.

            ip2long() erwartet einen String als Eingabe, du jubelst ihm aber das Ergebnis von bindec() unter - das ist entweder ein Integer oder ein Float.
            PHP-Code:
            $ip_arr[1] = bindec($bin); // hier kommt ein Integer oder Float raus

            $ip ip2long($ip_arr[0]); 
            $nm ip2long($ip_arr[1]); // ip2long erwartet einen String.. 
            Der zweite "Fehler" ist eigentlich keiner, aber ip2long() liefert im Fehlerfall -1, was zwar ein Integer ist, aber nicht das, was du willst.

            Debugging heisst: Schau dir die Variableninhalte vor und nach den angesprochenen Programmzeilen an, verwende dazu var_dump().
            Schalte am Anfang des Scripts die Fehlerbehandlung ein:
            PHP-Code:
            error_reporting(-1);
            ini_set('display_errors'1); 
            Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

            Kommentar


            • #7
              vielen dank @lstegelitz,

              nach einem bisschen rumprobieren liegt der fehler wohl in der "(~$nm)" variable. diese kann ich nichtmehr mit var_dump auslesen. Die Variable $nm kann konnte ich noch ausgeben und ergab: "bool(false)"

              was bedeutet denn überhaupt das unendlichzeichen vor der variable?

              vielen dank,
              jonas

              Kommentar


              • #8
                Zitat von frdmn Beitrag anzeigen
                was bedeutet denn überhaupt das unendlichzeichen vor der variable?
                Unendlich-Zeichen? Du meinst die Tilde ~ oder?

                PHP: Bit-Operatoren - Manual
                Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                Kommentar

                Lädt...
                X