用于检查域可用性不起作用的PHP函数

时间:2009-06-05 08:02:20

标签: php dns

我无法让此脚本正常运行。当我尝试将域名传递给它时,它总是返回AVAILABLE,即使对于cnn.com! $ message是我正在检查其可用性的域的名称。

这是函数调用;

include("domain.class.php");

// Initializing class
$domain=new domain("$message");

// Checking if domain is available
if($domain->is_available()){
$status = "$message is available";
}else{
$status = "$message is unavailable";
echo = $status;
}

这是domain.class.php;

<?
class domain{
var $domain="";
var $servers=array(
array("com","whois.geektools.com","No match"),
    array("net","whois.geektools.com","No match"),
        array("org","whois.geektools.com","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");

function domain($str_domainname){
    $this->domain=$str_domainname;
}

function info(){
    if($this->is_valid()){

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

        if($whois_server!=""){
            $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 "No whois server for this tld in list!";
        }
    }else{
        return "Domainname isn't valid!";
    }
}

/**
* 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 full domain
* @return string $fulldomain
* @desc Returns the full domain
*/
function get_fulldomain(){
    return $this->domain;
}

/**
* 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;
    }
}
}
?>

我一直在研究这个并尝试不同的东西一段时间。有人能指出我正确的方向吗?我喜欢在这里学到什么。

1 个答案:

答案 0 :(得分:2)

我已经将问题隔离到了domain.class.php中的至少两个方法,这两个方法都被破坏了。这是一个快速解决方案。

取消域名验证:

function is_valid(){ //because this always returns false
    return true;

另外,get_whois_server()总是不返回任何内容。所以我们从get_whois_server()返回一个文字字符串,即:

function get_whois_server(){
    return "whois.geektools.com"; //the whois server declared in the class does work

最后,whois.geektools.com将其“无匹配”字符串更改为“无信息”,这就是我们知道域 何时可用的方式。将类开头的数组更改为:

array("com","whois.geektools.com","no information"), //No match to "no information"
        array("net","whois.geektools.com","No match"),
                array("org","whois.geektools.com","No match"),
);

然后如预期的那样:

 $domain = new domain("google.com"); //make sure to leave out http:// and www
 if(....
    ....
 //Returns "is unavailable";

 $domain = new domain("jsdhfsdfkljsadhjds.com"); //make sure to leave out http:// and www
 if(....
    ....
 //Returns "is available";