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

  • frdmn
    hat ein Thema erstellt PHP Funktion: "Unsupported operand types".

    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

  • lstegelitz
    antwortet
    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

    Einen Kommentar schreiben:


  • frdmn
    antwortet
    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

    Einen Kommentar schreiben:


  • lstegelitz
    antwortet
    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); 

    Einen Kommentar schreiben:


  • frdmn
    antwortet
    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

    Einen Kommentar schreiben:


  • lstegelitz
    antwortet
    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.

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • mimomamu
    antwortet
    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.

    Einen Kommentar schreiben:

Lädt...
X