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.

    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.

        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); 

            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

                Kommentar

                Lädt...
                X