Domaincheck: Domain mal frei und mal belegt

MC-René

Erfahrenes Mitglied
Hallo!

Ich wollte das Domain-Check-Script von Sven Wagener nutzen.

Meine domaincheck2.php:

PHP:
<?
/**
* This class checks the availability of a domain and gets the whois data
*
* @author    Sven Wagener <sven.wagener@intertribe.de>
* @copyright inDot media
* @include  Funktion:_include_
*/

class domain{
var $domain="";

/*******************************
* Initializing server variables
* array(top level domain,whois_Server,not_found_string or MAX number of CHARS: MAXCHARS:n)
**/
var $servers=array(
array("biz","whois.biz","Not found"),
array("com","whois.crsnic.net","No match"),
array("de","whois.denic.de","not found"),
array("info","whois.afilias.info","Not found"),
array("net","whois.crsnic.net","No match"),
array("org","whois.pir.org","No match"),
);

var $idn=array(224,225,226,227,228,229,230,231,232,233,234,235,240,236,237,238,239,241,242,243,244,245,246,248,254,249,250,251,252,253,255);
//var $idn=array("00E0","00E1","00E2","00E3","00E4","00E5","0101","0103","0105","00E6","00E7","0107","0109","010B","010D","010F","0111","00E8","00E9","00EA","00EB","0113","0115","0117","0119","011B","014B","00F0","011D","011F","0121","0123","0125","0127","00EC","00ED","00EE","00EF","0129","012B","012D","012F","0131","0135","0137","0138","013A","013C","013E","0142","00F1","0144","0146","0148","00F2","00F3","00F4","00F5","00F6","00F8","014D","014F","0151","0153","0155","0157","0159","015B","015D","015F","0161","0163","0165","0167","00FE","00F9","00FA","00FB","00FC","0169","016B","016D","016F","0171","0173","0175","00FD","00FF","0177","017A","017C","017E");

/**
* Constructor of class domain
* @param string$str_domainame    the full name of the domain
* @desc Constructor of class domain
*/
function domain($str_domainname){
$this->domain=$str_domainname;
}

/**
* Returns the whois data of the domain
* @return string $whoisdata Whois data as string
* @desc Returns the whois data of the domain
*/
function info(){
if($this->is_valid()){

$tldname=$this->get_tld();
$domainname=$this->get_domain();
$whois_server=$this->get_whois_server();

// If tldname have been found
if($whois_server!=""){
// Getting whois information
$fp = fsockopen($whois_server,43);

$dom=$domainname.".".$tldname;
//fputs($fp, "$dom\r\n");

// New IDN
if($tldname=="de") {
fputs($fp, "-C ISO-8859-1 -T dn $dom\r\n");
} else {
fputs($fp, "$dom\r\n");
}

// Getting string
$string="";

// Checking whois server for .com and .net
if($tldname=="com" || $tldname=="net" || $tldname=="edu"){
while(!feof($fp)){
$line=trim(fgets($fp,128));

$string.=$line;

$lineArr=split(":",$line);

if(strtolower($lineArr[0])=="whois server"){
$whois_server=trim($lineArr[1]);
}
}
// Getting whois information
$fp = fsockopen($whois_server,43);

$dom=$domainname.".".$tldname;
fputs($fp, "$dom\r\n");

// Getting string
$string="";

while(!feof($fp)){
$string.=fgets($fp,128);
}

// Checking for other tld's
}else{
while(!feof($fp)){
$string.=fgets($fp,128);
}
}
fclose($fp);

return $string;
}else{
return "Kein Whois-Server für diese TLD in der Liste!";
}
}else{
return "Domainname ungültig!";
}
}

/**
* Returns the whois data of the domain in HTML format
* @return string $whoisdata Whois data as string in HTML
* @desc Returns the whois data of the domain  in HTML format
*/
function html_info(){
return nl2br($this->info());
}

/**
* Returns name of the whois server of the tld
* @return string $server the whois servers hostname
* @desc Returns name of the whois server of the tld
*/
function get_whois_server(){
$found=false;
$tldname=$this->get_tld();
for($i=0;$i<count($this->servers);$i++){
if($this->servers[$i][0]==$tldname){
$server=$this->servers[$i][1];
$full_dom=$this->servers[$i][3];
$found=true;
}
}
return $server;
}

/**
* Returns the tld of the domain without domain name
* @return string $tldname the tlds name without domain name
* @desc Returns the tld of the domain without domain name
*/
function get_tld(){
// Splitting domainname
$domain=split("\.",$this->domain);
if(count($domain)>2){
$domainname=$domain[0];
for($i=1;$i<count($domain);$i++){
if($i==1){
$tldname=$domain[$i];
}else{
$tldname.=".".$domain[$i];
}
}
}else{
$domainname=$domain[0];
$tldname=$domain[1];
}
return $tldname;
}


/**
* Returns all tlds which are supported by the class
* @return array $tlds all tlds as array
* @desc Returns all tlds which are supported by the class
*/
function get_tlds(){
$tlds="";
for($i=0;$i<count($this->servers);$i++){
$tlds[$i]=$this->servers[$i][0];
}
return $tlds;
}

/**
* Returns the name of the domain without tld
* @return string $domain the domains name without tld name
* @desc Returns the name of the domain without tld
*/
function get_domain(){
// Splitting domainname
$domain=split("\.",$this->domain);
return $domain[0];
}

/**
* Returns the string which will be returned by the whois server of the tld if a domain is avalable
* @return string $notfound  the string which will be returned by the whois server of the tld if a domain is avalable
* @desc Returns the string which will be returned by the whois server of the tld if a domain is avalable
*/
function get_notfound_string(){
$found=false;
$tldname=$this->get_tld();
for($i=0;$i<count($this->servers);$i++){
if($this->servers[$i][0]==$tldname){
$notfound=$this->servers[$i][2];
}
}
return $notfound;
}

/**
* Returns if the domain is available for registering
* @return boolean $is_available Returns 1 if domain is available and 0 if domain isn't available
* @desc Returns if the domain is available for registering
*/
function is_available(){
$whois_string=$this->info(); // Gets the entire WHOIS query from registrar
$not_found_string=$this->get_notfound_string(); // Gets 3rd item from array
$domain=$this->domain; // Gets current domain being queried

$whois_string2=@ereg_replace("$domain","",$whois_string);

$whois_string =@preg_replace("/\s+/"," ",$whois_string); //Replace whitespace with single space

$array=split(":",$not_found_string);

if($array[0]=="MAXCHARS"){
if(strlen($whois_string2)<=$array[1]){
return true;
}else{
return false;
}
}else{
if(preg_match("/".$not_found_string."/i",$whois_string)){
return true;
}else{
return false;
}
}
}

function get_cn_server($whois_text){

}


/**
* Returns if the domain name is valid
* @return boolean $is_valid Returns 1 if domain is valid and 0 if domain isn't valid
* @desc Returns if the domain name is valid
*/
function is_valid(){

$domainArr=split("\.",$this->domain);

// If it's a tld with two Strings (like co.uk)
if(count($domainArr)==3){

$tld=$domainArr[1].".".$domainArr[2];
$found=false;

for($i=0;$i<count($this->servers) && $found==false;$i++){
if($this->servers[$i][0]==$tld){
$found=true;
}
}
if(!$found){
return false;
}

}else if(count($domainArr)>3){
return false;
}

// Creating regular expression for
if($this->get_tld()=="de"){
for($i=0;$i<count($this->idn);$i++){
$idn.=chr($this->idn[$i]);
// $idn.="\x".$this->idn[$i]."";
}
$pattern="^[a-z".$idn."0-9\-]{3,}$";
}else{
$pattern="^[a-z0-9\-]{3,}$";
}

if(ereg($pattern,strtolower($this->get_domain())) && !ereg("^-|-$",strtolower($this->get_domain())) && !preg_match("/--/",strtolower($this->get_domain()))){
return true;
}else{
return false;
}
}
}
?>

Meine Abfrage: abfrage.php
PHP:
$endung=".de";

     echo "<H1>Domain(s) bestätigen</H1>";

//alle domains prüfen
for ($count=1;$count<=$anzahl_domains; $count++)
{
$domainnr="domain".$count;
$domainname1=$_POST[$domainnr];
$domainname=$_POST[$domainnr].$endung;

require_once('domaincheck2.php');
$domain=new domain($domainname); 
        
if($domain->is_available()){
     echo "Frei!"; //formatiert
}
else {
     echo "Belegt!"; //formatiert
}

Das Problem:
Beim Testen wird der Test-Domainname manchmal als Frei und manchmal als belegt deklariert:
domain.JPG

Auch bei "Einzel-Abfragen" (also, so das die For-Schleife nur 1x durchläuft) ist die Domain mal Frei und mal nicht...!?

Ich raffs echt nicht...! :confused:
 
Hast du mal im Code ein wenig Debugging betrieben?

PS: Tabulatoren machen Code lesbar...
 
Die Klasse habe ich so übernommen...

Klar machen Tab's den Code lesbarer, das habe ich bei dem Drei-Zeiler nicht gemacht:

Also dann jetzt: abfrage.php
PHP:
$endung=".de"; 

     echo "<H1>Domain(s) bestätigen</H1>"; 

//alle domains prüfen 
for ($count=1;$count<=$anzahl_domains; $count++) 
{ 
$domainnr="domain".$count; 
$domainname1=$_POST[$domainnr]; 
$domainname=$_POST[$domainnr].$endung; 

require_once('domaincheck2.php'); 
$domain=new domain($domainname);  
         
if($domain->is_available())
      { 
     echo "Frei!"; //formatiert 
      }  
else 
     { 
     echo "Belegt!"; //formatiert 
     }  
}


Aber das hat ja prinzipiell mal nichts mit dem Problem zu tun...
 
Der Dreizeiler meinte ich auch nicht unbedingt. Ich meinte den Rest. Das grosse Script das man so nciht lesen will.
Und da es nicht direkt mit dem Problem zu tun hatte, schrieb ich auch PS davor......

Aber hast schon mit Debugging versucht eine Lösung zu finden?

PS. Mit tabulatoren meinte ich nicht neue Zeilen bei if() sonderen einrücken bei Schleifen, if etc.
PHP:
$endung=".de"; 
echo "<H1>Domain(s) bestätigen</H1>"; 

//alle domains prüfen 
for ($count=1;$count<=$anzahl_domains; $count++) { 
	$domainnr="domain".$count; 
	$domainname1=$_POST[$domainnr]; 
	$domainname=$_POST[$domainnr].$endung; 
	
	require_once('domaincheck2.php'); 
	$domain=new domain($domainname);  
	         
	if($domain->is_available()){ 
		echo "Frei!"; //formatiert 
	} else { 
		echo "Belegt!"; //formatiert 
	}  
}
 
Und $domainname ist immer dieselbe? Keine Leerzeichen etc?
Am besten mit var_dump($domainname); prüfen. So erkennst du auch führende Leerzeichen etc.

PHP:
    require_once('domaincheck2.php');
    var_dump($domainname);
    $domain=new domain($domainname);
 
Gesagt getan!

Ergebnis:

string(18) "fsdfsdfgdfgdsfg.de"
string(18) "fsdfsdfgdfgdsfg.de"
string(18) "fsdfsdfgdfgdsfg.de"


1x Belegt, 2x Frei...

:confused:
 
Hmmm!? :(

Der Witz dabei ist auch, dass das Ergebnis Frei/Belegt entsprechend variiert.

Den gleichen Domainnamen zur Abfrage genutzt ergibt verschiedene Meldungen, auch innerhalb eines Aufrufs (s.o.)

:confused: :confused: :confused:
 
Schau dir mal die genauen antworten des whois Server an. Warscheinlich wird er nur das erste mal korrekt antworten. im Public Whois bei der Denic stößt man schnell an die grenzen des access Flooding. Und der Server wird wohl eher mit einer antwort alla "zugriff verweigert" geantwortet haben als mit einer echten Whois meldung.

Ich habe auch eine Whoislösung für unser Domainportal geschrieben, und hier sind wir auf ähnliche Probleme gestoßen, nur das wir im Falle von der Denic das glück haben selbst mitglied zu sein und IP Adressen für den fast unlimitierten Zugriff freischalten zu können. Allerdings für viele andere Nics trat es nach wie vor auf. Sodass die aktuelle Lösung Anfragen über alle verfügbaren IP Adressen des Severs verteilt (ca 35 Stück) und so landen wir auf praktisch keinerlei Graylists mehr.

Außerdem solltest du bei den .de Domains nur die verfügbarkeit checken, hier sind die Zugrifflimits erheblich höher:
Code:
 -T st test.de

Das verteilen der anfragen auf mehrere IP`s funtioniert mit socket_bind() und socket_connect()

Des weiteren kann ich dir empfehlen statt die Domains mit Umlauten zu senden sie zu encodieren mit http://pear.php.net/package/Net_IDNA das funktioniert auch international erheblich besser, dann muss für .de allerdings der abfragecode auch auf
Code:
 -T st,ace xn--tst-qla.de
geändert werden.
 
Zuletzt bearbeitet:
PHP:
fputs($fp, "-C ISO-8859-1 -T st $dom\r\n");

Das war schonaml ein guter Ansatz, dank dafür... ;)

Dennoch ist die Fehlermeldung für micht unlogisch:

Bei 3 Domains in der Abfrage (jeweils "alleulluelleillio.de") erscheint die ersten beiden male
% Error: 55000000002 Connection refused; access control limit reached.
not found


und das dritte mal:
Status: free % DB time is 2010-03-10T12:20:01+01:00
not found


Schon merkwürdig, oder!? :(
 
Zurück