hotti: (Ajax) Ferflixte Null

hi,

Script siehe Link, Code s.u.
Kleines Problem: Die Umrechnung von
einer IP  zu Numerisch
0.0.0.0      0
tut.

Für den Fall, dass bei 'ip' oder 'num' selbst eine '0' eingegeben wird, sollte eigentlich die Kontrollstruktur im Perl-Script greifen, was die jedoch nicht macht, weil's gar nicht erst dahinkommt. Da blicke ich noch nicht, was seitens DOM passiert, bitte mal um sachdienliche Hinweise.

Danke und Gruß,
Hotte

Zum Testen

(Wer das Script selbst im Apache testen möchte, es läuft auch ohne Basic.pm, einfach die entsprechenden Zeilen auskommentieren)

  
#!/usr/bin/perl  
###########################################################################  
my $title = "IP-Adresse in Numerischen Wert umrechnen";  
###########################################################################  
use strict;  
use Basic;  
use CGI 'param';  
  
if(param()){  
	print "Content-type: text/plain\n\n";  
	if(my $ip = param('ip')){  
		if(!$ip){  
			print "0.0.0.0:0";  
			exit;  
		}  
		my $num = ipA2N($ip);  
		print "$ip:$num";  
		exit;  
	}  
	if(my $num = param('num')){  
		if(!$num){  
			print "0.0.0.0:0";  
			exit;  
		}  
		my $ip = ipN2A($num);  
		print "$ip:$num";  
		exit;  
	}  
}  
else{  
	print "Content-type: text/html\n\n";  
	print htmlUp($title); # Basic.pm  
	form();  
	print htmlDown();     # Basic.pm  
}  
  
exit;  
###########################################################################  
sub form{  
	print qq(  
		<form action="$ENV{SCRIPT_NAME}">  
		  
		<fieldset style="float:left; padding:10px">  
			<legend><b>IP-Adresse</b></legend>  
				<input size=30 name="ip" id="ip" title="IP-Adresse" value="255.255.255.255">  
				<input type='button' value='&gt;&gt;' title='IP zu Numerisch' onClick="loadIP('$ENV{SCRIPT_NAME}?ip='+document.getElementById('ip').value);">  
		</fieldset>  
  
		<fieldset style="float:left; padding:10px">  
			<legend><b>IP Numerisch</b></legend>  
				<input type='button' value='&lt;&lt;' title='Numerisch zu IP-Adresse' onClick="loadIP('$ENV{SCRIPT_NAME}?num='+document.getElementById('num').value);">  
				<input size=30 name="num" id="num" title="IP Numerisch" value="4294967295">  
		</fieldset>  
  
		</form>  
		<p style="clear:left"></p>  
		  
		<script type="text/javascript">  
			var reqIP;  
			function loadIP(url){  
				if (window.XMLHttpRequest) {  
						reqIP = new XMLHttpRequest();  
						reqIP.onreadystatechange = responseHandler;  
						reqIP.open("GET", url, true);  
						reqIP.send(null);  
				}  
				else if (window.ActiveXObject) {  
					reqIP = new ActiveXObject("Microsoft.XMLHTTP");  
					if (reqIP) {  
						reqIP.onreadystatechange = responseHandler;  
						reqIP.open("GET", url, true);  
						reqIP.send();  
					}  
				}  
			}  
  
			function responseHandler(){  
				if (reqIP.readyState == 4) {  
					if (reqIP.status == 200) {  
						var meta = reqIP.responseText.split(":");  
						document.getElementById('ip').value = meta[0];  
						document.getElementById('num').value = meta[1];  
					}  
					else{  
						document.getElementById('ip').value = "Problem mit Ajax";  
						document.getElementById('num').value = "Problem mit Ajax";  
					}  
				}  
			}  
		</script>  
		  
		<p><b>Hinweis:</b> Eine Überprüfung der Eingaben findet nicht statt!</p>  
	);  
  
	return;  
}  
###########################################################################  
# Oktetten(Dezimal)schreibweise zu Numerisch  
sub ipA2N{  
    my $ipA=shift;  
    return unpack("N", pack("C4", split(/\./, $ipA)));  
}  
###################################################################################################  
# Numerisch zu Oktetten(Dezimal)schreibweise  
sub ipN2A {  
    my $ipN = shift;  
    return join(".", unpack("C4", pack("N", $ipN)));  
}  
###################################################################################################  

--
Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  1. Hi,

    Für den Fall, dass bei 'ip' oder 'num' selbst eine '0' eingegeben wird, sollte eigentlich die Kontrollstruktur im Perl-Script greifen, was die jedoch nicht macht, weil's gar nicht erst dahinkommt. Da blicke ich noch nicht, was seitens DOM passiert, bitte mal um sachdienliche Hinweise.

    "Seitens DOM" passiert gar nichts aussergewöhnliches, http://rolfrost.de/cgi-bin/ipnum.cgi?num=0 wird vom Server angefordert, zeigt bspw. FireBug sehr schön (und einfach).

    if(param()){
    print "Content-type: text/plain\n\n";
    if(my $ip = param('ip')){
    if(!$ip){

    Evaluiert Perl wie diverse andere Sprachen auch 0 zu einem false, wenn es in einem Boole'schen Kontext verwendet wird?
    Dann hättest du hier schon zwei Bedingungen, die problematisch sind.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. hi Chris,

      "Seitens DOM" passiert gar nichts aussergewöhnliches, http://rolfrost.de/cgi-bin/ipnum.cgi?num=0 wird vom Server angefordert, zeigt bspw. FireBug sehr schön (und einfach).

      Du hast Recht, jetzt sehe ich das auch, danke für Deinen Hinweis!

      Das Verhalten liegt hier schon beim Parsen mit CGI::param():

      »» if(my $ip = param('ip')){
      »» if(!$ip){

      D.h., wenn im URI steht: ....cgi?ip=0

      ist der Ausdruck "my $ip = param('ip')" unwahr. Ok, da weiß ich jetzt, was zu machen ist || auch nicht ;-)

      Schönen Feierabend,
      Hotte

      --
      Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  2. if(my $ip = param('ip')){
    if(!$ip){

    Das ist irgendwie doppelt gemoppelt und ich finde auch unleserlich.

    Du willst:

    my $ip = param('ip');  
    unless(defined $ip){  
    
    
      	print "0.0.0.0:0";  
      	exit;  
    

    exit mitten im Programm ist unschön, fast wie goto.

    Zum JS:
    Du belastest den Browser immer noch unnötig. Du erzeugst bei jedem Aufruf ein neues XMLHttpRequest, dass darüber hinaus noch bei schnellen klicken während der Verarbeitung verworfen wird, was im IE zu einer Fehlermeldung führt.

    Struppi.

    1. Moin,

      »» if(my $ip = param('ip')){
      »» if(!$ip){

      Das ist irgendwie doppelt gemoppelt und ich finde auch unleserlich.

      Das zweite if() ist überflüssig. Das wird heute wegoperiert ;-)
      Danke Dir für Deine Hinweise zum JS, wird auch überarbeitet.

      Viele Grüße,
      Hotte

      --
      Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
    2. hi again,

      Zum JS:
      Du belastest den Browser immer noch unnötig. Du erzeugst bei jedem Aufruf ein neues XMLHttpRequest, dass darüber hinaus noch bei schnellen klicken während der Verarbeitung verworfen wird, was im IE zu einer Fehlermeldung führt.

      Ok, ich hab die Objekterstellung mal rausgenommen, so:

        
      		<script type="text/javascript">  
      			var reqIP = nob();  
      			  
      			// XML-Request Object erstellen  
      			function nob(){  
      				var obj = (window.XMLHttpRequest) ? (new XMLHttpRequest()) : (new ActiveXObject("Microsoft.XMLHTTP"));  
      				return(obj);  
      			}  
      			  
      			function loadIP(url){  
      				reqIP.onreadystatechange = responseHandler;  
      				reqIP.open("GET", url, true);  
      				reqIP.send(null);  
      			}  
        
      ....  
      
      

      Mit dem Erfolg, dass im IE nach dem Neuladen nur ein Ajax-Request/Response möglich ist. Nehme ich die Funktion nob() wieder rein in die Requestfunktion funktioniert alles im IE, auch im Moz.

      Was gehtn da schon wieder nicht?

      Hotte

      --
      Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.