PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP Grundlagen (http://www.selfphp.de/forum/forumdisplay.php?f=12)
-   -   ip2long(), unsigned und intval() (http://www.selfphp.de/forum/showthread.php?t=21707)

mgutt 26.06.2009 18:33:30

ip2long(), unsigned und intval()
 
Hi,

ich bin gerade etwas verwirrt. Warum ergibt das drei verschiedene Ergebnisse:
Code:

$ip      = gethostbyname('www.example.com');
$long    = ip2long($ip);
$sinteger = intval($long);
$unsigned = sprintf('%u', ip2long($ip));
$integer  = intval($unsigned);
if ($long == -1 || $long === FALSE) {
    echo 'Ungültige IP, versuchen Sie es noch einmal';
} else {
    echo $ip      . "<br />\n";                              // 208.77.188.166
    echo $long    . " > " . long2ip($long)    . "<br />\n"; // -800211802 IP korrekt
    echo $sinteger . " > " . long2ip($sinteger) . "<br />\n"; // -800211802 IP korrekt
    echo $unsigned . " > " . long2ip($unsigned) . "<br />\n"; // 3494755494 IP korrekt
    echo $integer  . " > " . long2ip($integer)  . "<br />\n"; // 2147483647 IP falsch
}

Warum sind long, unsigned und integer alle unterschiedlich. unsigned und integer vermutlich weil ich ein 32Bit-System einsetze, aber long und unsigned verstehe ich nicht. Liegt das auch an meinem 32Bit-System?

Ich wollte auf diese Art einen möglichst schnellen Integer-Vergleich in der MySQL-Datenbank realisieren. Soll ich statt unsigned dafür lieber sinteger nehmen und meine Datenbank von INT(10) unsigned auf INT(10) umstellen? Wie halte ich das später kompatibel zu 64 Bit?

EDIT:
Ok hängt mit 32Bit zusammen. Bleibt nur noch mein Datenbankproblem.

mgutt 30.06.2009 19:23:50

AW: ip2long(), unsigned und intval()
 
Also $unsigned resultiert das gleiche Ergebnis wie INET_ATON() in MySQL. Demnach werde ich $unsigned nutzen und in MySQL "INT(10) unsigned" als Spaltenwert hinterlegen.

EDIT:
Dadurch hat sich ein kleines anderes Problem ergeben. Und zwar beim Erstellen der MySQL-Abfragen unterscheide ich aus Sicherheitsgründen zwischen Integer mit intval() oder String mit mysql_real_escape_string(). Durch einen kleinen Test bin ich nun dazu gekommen, dass ich neben intval() auch floatval() einsetze, wenn ich weiß, dass die Zahl größer ist, als es intval() erlaubt:
Code:

$crc32  = sprintf('%u', crc32('example.com')); // 3069857465
$ucrc32 = sprintf('%u', $crc32);              // 2147483647
$dcrc32 = sprintf('%d', $crc32);              // 2147483647
$icrc32 = intval($crc32);                      // 2147483647
$ocrc32 = sprintf('%.0f', $crc32);            // 3069857465
$fcrc32 = floatval($crc32);                    // 3069857465

floatval() gibt den Wert mit Kommastellen zurück. Wer das nicht will, soll die sprintf()-Variante nutzen. Bitte aber nicht vergessen, dass float rundet. Wer das auch nicht will, muss sich mit preg_replace() behelfen.


Alle Zeitangaben in WEZ +2. Es ist jetzt 11:53:52 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.