tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von MC-René
  • 1 Beitrag von Michael Engel
ERLEDIGT
NEIN
ANTWORTEN
11
ZUGRIFFE
521
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von MC-René
    MC-René MC-René ist offline Mitglied Brokat
    Registriert seit
    Apr 2004
    Ort
    Saarland
    Beiträge
    295
    Hallo!

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

    Meine domaincheck2.php:

    PHP-Code:
    <?
    /**
    * 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-Code:
    $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:
    Domaincheck: Domain mal frei und mal belegt-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...!
    Yaslaw bedankt sich. 
    Greetz, MC!

    Falls Dein Beitrag hilfreich war: Danke dafür :-)

    Falls mein Beitrag hilfreich war: Danke klicken! :-)

  2. #2
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Hast du mal im Code ein wenig Debugging betrieben?

    PS: Tabulatoren machen Code lesbar...
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  3. #3
    Avatar von MC-René
    MC-René MC-René ist offline Mitglied Brokat
    Registriert seit
    Apr 2004
    Ort
    Saarland
    Beiträge
    295
    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-Code:
    $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...
     
    Greetz, MC!

    Falls Dein Beitrag hilfreich war: Danke dafür :-)

    Falls mein Beitrag hilfreich war: Danke klicken! :-)

  4. #4
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    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-Code:
    $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 
        
    }  

     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  5. #5
    Avatar von MC-René
    MC-René MC-René ist offline Mitglied Brokat
    Registriert seit
    Apr 2004
    Ort
    Saarland
    Beiträge
    295
    Aber hast schon mit debugging verscuht eine Lösung zu finden?
    Meinst Du in der domaincheck2.php (also dem "großen" Script)?
    --> Nein


    In der abfrage.php kann ich nix feststellen?!
     
    Greetz, MC!

    Falls Dein Beitrag hilfreich war: Danke dafür :-)

    Falls mein Beitrag hilfreich war: Danke klicken! :-)

  6. #6
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    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-Code:
        require_once('domaincheck2.php');
        
    var_dump($domainname);
        
    $domain=new domain($domainname); 
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  7. #7
    Avatar von MC-René
    MC-René MC-René ist offline Mitglied Brokat
    Registriert seit
    Apr 2004
    Ort
    Saarland
    Beiträge
    295
    Gesagt getan!

    Ergebnis:

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


    1x Belegt, 2x Frei...

     
    Greetz, MC!

    Falls Dein Beitrag hilfreich war: Danke dafür :-)

    Falls mein Beitrag hilfreich war: Danke klicken! :-)

  8. #8
    Avatar von MC-René
    MC-René MC-René ist offline Mitglied Brokat
    Registriert seit
    Apr 2004
    Ort
    Saarland
    Beiträge
    295
    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.)

     
    Greetz, MC!

    Falls Dein Beitrag hilfreich war: Danke dafür :-)

    Falls mein Beitrag hilfreich war: Danke klicken! :-)

  9. #9
    Registriert seit
    May 2007
    Ort
    Köln / Bonn
    Beiträge
    844
    Blog-Einträge
    4
    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 :
    1
    
     -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 :
    1
    
     -T st,ace xn--tst-qla.de
    geändert werden.
    Geändert von Michael Engel (10.03.10 um 11:15 Uhr)
     
    Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral.

  10. #10
    Avatar von MC-René
    MC-René MC-René ist offline Mitglied Brokat
    Registriert seit
    Apr 2004
    Ort
    Saarland
    Beiträge
    295
    PHP-Code:
    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!?
     
    Greetz, MC!

    Falls Dein Beitrag hilfreich war: Danke dafür :-)

    Falls mein Beitrag hilfreich war: Danke klicken! :-)

  11. #11
    Registriert seit
    May 2007
    Ort
    Köln / Bonn
    Beiträge
    844
    Blog-Einträge
    4
    Wie bereits vermutet sperrt die Denic durch zuviele Abfragen deine IP Adresse immer wieder kurzzeitig. Die einzigen abhilfen die du machen kannst sind:

    a) weniger abfragen pro minute, das ganze abfragen künstlich verlangsamen
    b) das ganze über mehrere IP Adressen verteilen
    c) deine IP Adresse von deinem Domain Reseller mit in die Liste aufnehmen lassen, um mehr abfragen machen zu können (werden aber viele Registrare eher nicht machen)

    Als kleine Anmerkung, wenn du meinst das das die Denic wenige anfragen zulässt, schau dir mal nic .AE an. Auf die offizellen Whoisserver darf man 3 abfragen pro Stunde machen! o.O
    MC-René bedankt sich. 
    Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral.

  12. #12
    Avatar von MC-René
    MC-René MC-René ist offline Mitglied Brokat
    Registriert seit
    Apr 2004
    Ort
    Saarland
    Beiträge
    295
    Zitat Zitat von Michael Engel Beitrag anzeigen
    Als kleine Anmerkung, wenn du meinst das das die Denic wenige anfragen zulässt, schau dir mal nic .AE an. Auf die offizellen Whoisserver darf man 3 abfragen pro Stunde machen! o.O
    Danke schonmal....

    Kennst Du die restriktionen der Denic...?
     
    Greetz, MC!

    Falls Dein Beitrag hilfreich war: Danke dafür :-)

    Falls mein Beitrag hilfreich war: Danke klicken! :-)

Ähnliche Themen

  1. Domaincheck umsetzen
    Von MC-René im Forum Stellenangebote (unentgeltlich)
    Antworten: 0
    Letzter Beitrag: 12.03.10, 09:17
  2. Festplatten Kapazität, wieviel Belegt / Frei
    Von liquidbeats im Forum Linux & Unix
    Antworten: 9
    Letzter Beitrag: 18.06.05, 21:00
  3. Domain ist frei aber ist eigentlich nicht frei !
    Von bigtail im Forum Hosting & Webserver
    Antworten: 2
    Letzter Beitrag: 07.04.05, 23:35
  4. Domaincheck
    Von 3Dnavigator im Forum PHP
    Antworten: 4
    Letzter Beitrag: 08.05.03, 05:15
  5. Domaincheck
    Von wagneraxt3 im Forum PHP
    Antworten: 4
    Letzter Beitrag: 15.04.02, 16:23