Hanni: Mehrmaliger Aufruf von whois klappt nicht

Hallo,
ich rufe das whois von "phpwhois-4.2.2 sourceforge" folgendermaßen auf:

<?php  
function mywhois ($IP)  
  {  
   include('whois.main.php');  
   $rc = '';  
   $whois = new Whois();  
   $result = $whois->Lookup($IP,false);  
   $rawdata = $result['rawdata'];  
  
   foreach ($rawdata as $wert)  
     {  
      $rc .= "$wert\n";  
     }  
   return $rc;  
  }  
  
?>

Beim ersten Aufruf von mywhois werden die Daten korrekt geliefert, beim zweiten Aufruf jedoch kommt die Meldung:
Fatal error: Cannot redeclare class Whois in /home/..../htdocs//whois/whois.main.php on line 325

Da ich noch völlig unbedarft bin in objektor. Progr. möchte ich das whois.main.php möglichst als "black box" betrachten. Kann ich den Fehler durch eine Änderung im obigen Programm beheben?

  1. Hi,

    <?php

    function mywhois ($IP)
      {
       include('whois.main.php');
       $rc = '';
       $whois = new Whois();
       $result = $whois->Lookup($IP,false);
       $rawdata = $result['rawdata'];

    foreach ($rawdata as $wert)
         {
          $rc .= "$wert\n";
         }
       return $rc;
      }

    ?>

      
    hier erzeugst du ein Problem, dessen Auswirkung du selbst sofort bemerkt hast: Die Include-Datei whois.main.php wird bei jedem Aufruf der Funktion erneut includiert, die darin definierten Klassen also erneut deklariert:  
      
    
    > Fatal error: Cannot redeclare class Whois in /home/..../htdocs//whois/whois.main.php on line 325  
      
    Das ist so, als wolltest du dich bei jeder Bestellung bei einem Versandhaus als Neukunde anmelden.  
      
    
    > Da ich noch völlig unbedarft bin in objektor. Progr. möchte ich das whois.main.php möglichst als "black box" betrachten. Kann ich den Fehler durch eine Änderung im obigen Programm beheben?  
      
    Ja. Plaziere das include-Statement außerhalb der Funktion an einer Stelle, wo es nur ein einziges Mal ausgeführt wird.  
      
    Ciao,  
     Martin  
    
    -- 
    Kopflosigkeit schützt nicht vor Migräne.  
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    
    1. Hallo Martin,

      Plaziere das include-Statement außerhalb der Funktion an einer Stelle, wo es nur ein einziges Mal ausgeführt wird.

      Ich bin begeistert!
      Danke es funktioniert!

      Wenn ich gerade so einen Profi "an der Strippe habe", kannst Du oder jemand anderes mir auch bei folgendem einen Tipp geben?
      Ich wollte sehen, welche Zeichen in einem String sind, der undruckbare Zeichen wie \n u.a. enthält.
      Mit der Routine

        
      $Text="Hallo" . "\n" . "ich bin hier" ."\n";  
      $hexText='';  
      for ($x=0;$x<strlen($Text);$x++)  
      {  
       $hexText.=dechex(ord(substr($Text,$x,1)));  
      }  
      echo $hexText;  
      
      

      werden alle Zeichen umgewandelt, die Steuerzeichen fehlen aber.
      Was wäre hier noch zu korrigieren?

      1. Tach!

        Ich wollte sehen, welche Zeichen in einem String sind, der undruckbare Zeichen wie \n u.a. enthält.

        Missbrauch doch einfach urlencode() dafür. Ansonsten bin2hex().

        dedlfix.

      2. Tach!

        werden alle Zeichen umgewandelt, die Steuerzeichen fehlen aber.

        Nein, die fehlen nicht. Häng ein Leerzeichen hinter jedes Zeichen, dann siehst du sie deutlicher.

        dedlfix.

        1. Danke Euch!
          Gruß
          Hanni

    2. Ja. Plaziere das include-Statement außerhalb der Funktion an einer Stelle, wo es nur ein einziges Mal ausgeführt wird.

      Oder in der Funktion include_once verwenden.

      1. Oder in der Funktion include_once verwenden.

        Und inwiefern würde das die mehrfache Deklaration der Klasse verhindern?

        Mal abgesehen davon, dass deine "Lösung" unnötig Overhead verursacht und lediglich das Symptom eines Fehlers verdeckt, der Fehler aber bestehen bleibt.

        1. Tach!

          Oder in der Funktion include_once verwenden.

          Und inwiefern würde das die mehrfache Deklaration der Klasse verhindern?

          Die Arbeitsweise von include_once ist dir bekannt? Wenn etwas nur einmal inkludiert wird, dann wird auch nur einmal der darin befindliche Code ausgeführt.

          Mal abgesehen davon, dass deine "Lösung" unnötig Overhead verursacht und lediglich das Symptom eines Fehlers verdeckt, der Fehler aber bestehen bleibt.

          Welchen Overhead konkret? Welcher Fehler?

          dedlfix.

          1. Die Arbeitsweise von include_once ist dir bekannt? Wenn etwas nur einmal inkludiert wird, dann wird auch nur einmal der darin befindliche Code ausgeführt.

            Ja, ist mir.
            Mein Fehler ist, dass ich von Deklaration geschrieben hab, obwohl Instanzieren gemeint hab.

            Die Deklaration wird durch include_once() verhindert, die Instanzierung aber nicht.

            1. Tach!

              Mein Fehler ist, dass ich von Deklaration geschrieben hab, obwohl Instanzieren gemeint hab.

              Und du schriebst so, als ob du nur einen Fehler meintest - den der dann auch zur Meldung führt. Stattdessen meinst du aber einen anderen, der aber vielleicht nur ein potentieller oder gar keiner ist.

              Die Deklaration wird durch include_once() verhindert, die Instanzierung aber nicht.

              OK, dann bleibt also noch, dass das Whois-Objekt mehrfach instantiiert wird. Das kann man sich eventuell sparen, und von dem einen die Lookup-Methode mehrfach aufrufen. Dazu müsste man aber noch eine Menge mehr Overhead hinzufügen, um den jetzt in einer Funktion steckenden Aufruf ordentlich zusammen mit der Instanz und dem Instantiier-Code in eine Klasse stecken. Oder man schleppt übergibt das Whois-Objekt bei jedem Funktionsaufruf aus einer Variable im globalen Scope. Auch nicht wahnsinnig prickelnd.

              Weil mir der Code der Klasse nicht bekannt ist, weiß ich auch nicht, wieviel Overhead das wirklich ist und was da für Fehler auftreten können. Vermutlich ist das bisschen überflüssige Instantiieren im praktischen Betrieb vernachlässigbar. So viele Whois-Anfragen, dass das relevant werden könnte, lassen die Datenquellen schon gar nicht mehr zu.

              dedlfix.