Fehlermeldung "...unable to call handler()..."

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Fehlermeldung "...unable to call handler()..."

    Hallo!

    Ich bin recht neu bei PHP, habe aber erfolgreich einen XML-Parser gebaut.

    Der geht bei mir auch einwandfrei, wenn er aber auf einem anderen Server liegt und von dort aus auf eine XML-Datei zurückgreift, die unter meiner Domain liegt, produziert er erst folgende Fehlermeldung dreimal, bevor er die Ausgabe aber dann doch richtig macht:

    Warning: Unable to call handler () in ... on line 144
    In Zeile 144 finde ich aber nichts böses:
    PHP-Code:
    xml_parse($parser$str); 
    ...

    Mein Parser-Script sieht so aus:

    PHP-Code:
     function startElement ($parser$element_name) {
        switch (
    $element_name) {
            case 
    "NETZWERK" : echo ("\n"); break;
            case 
    "MITGLIED" : echo ("html "); break;
            case 
    "URL"        : echo ("html"); break;
            case 
    "NAME_KURZ": echo (""); break;
            case 
    "NAME_LANG": echo (""); break;
        }
    }
        
    function 
    endElement ($parser$element_name
    {
        switch (
    $element_name
        {
            case 
    "NETZWERK" :    echo ("\n"); break;
            case 
    "MITGLIED" :    echo ("html"); break;
            case 
    "URL"        :    echo ("html">"); break;
            case "
    NAME_KURZ":     echo ("</a>"); break;
            case "
    NAME_LANG":    echo (""); break;
        }
    }


    function cdata (
    $parser$data
    {    
        echo (
    $data);
    }


    //der XML-Parser wird erstellt
    $parser=xml_parser_create();
                
    xml_set_element_handler(
    $parser, "startElement", "endElement");
    xml_set_character_data_handler(
    $parser, "cdata");

    xml_set_default_handler (
    $parser, "");

    //XML-Datei wird geöffnet und zeilenweise ausgelesen
    $fhandle=fopen("http://www.meinedomain.de/netzwerk/netzwerk_wrs.xml", "r");
    while (!feof($fhandle)) 
    {
        
    $str fgets($fhandle1000);

    //Dies ist jetzt die Zeile, die die Fehlermeldung nennt:    
    xml_parse($parser$str);
        
        
    //Fehlerbehandlung
        
    $ecode=xml_get_error_code($parser);
        if (
    $ecode !=0
        {
            die (
    "<script>alert('Ein Fehler ist aufgetreten:".xml_error_string($ecode)."');</script>");
        }
    }


        
    fclose($fhandle);


    xml_parser_free ($parser); 
    Es gibt in meinem Skript keine Funktion
    PHP-Code:
    handler(); 
    Was habe ich falsch gemacht, oder besser: was ist der Unterschied zwischen zwei Servern?

    Helft mir bitte...

    Thanx!

    bossman

  • #2
    ich kenne mich zwar überhaupt nicht mit XML aus aber ich sehe hier auf jeden Fall einen Fehler

    PHP-Code:
    switch ($element_name
        {
            case 
    "NETZWERK" :    echo ("\n"); break;
            case 
    "MITGLIED" :    echo ("html"); break;
            case 
    "URL"        :    echo ("html">"); break; // hier ist der Fehler
            case "
    NAME_KURZ":     echo ("</a>"); break;
            case "
    NAME_LANG":    echo (""); break;
        } 
    es müsste evntl so heissen
    PHP-Code:
    switch ($element_name
        {
            case 
    "NETZWERK" :    echo ("\n"); break;
            case 
    "MITGLIED" :    echo ("html"); break;
            case 
    "URL"        :    echo ("html"); break;
            case 
    "NAME_KURZ":     echo ("</a>"); break;
            case 
    "NAME_LANG":    echo (""); break;
        } 
    oder je nachdem was du eben per echo ausgeben möchtest
    p.s. echo ist keine Funktion...du kannst die Klammern getrost weglassen Bsp:
    echo "Hallo ich funktioniere auch ohne klammern";

    nur ein Schönheitstipp

    cya CrazyPip

    Kommentar


    • #3
      Danke, aber das "html" ist nur ein Platzhalter für meinen HTML-Text, den ich für eine bessere Lesbarkeit weggelassen habe. Da war ich nur zu schlampig

      Wie gesagt, unter meiner Domain geht das ganze Skript fehlerlos und genau so, wie es soll, dann habe ich es an einen Kunden geschickt, damit er das Skript einbauen kann, dann kam die Fehlermeldung vor der (wiederum richtigen) Ausgabe...

      Bossman

      Kommentar


      • #4
        Hi bossman,

        willkommen in der community!

        Ein Handler ist ist ein Objektzeiger der auf einen Heap (Speicherbereich) zeigt, keine eigentliche Funktion.

        Es ist folgendes passiert:
        PHP-Code:
        //XML-Datei wird geöffnet 
        // und zeilenweise ausgelesen 
        // Edit Blaster: (nicht korrekt, Buffereinstellung 1000, es werden die ersten 1000 Bytes gelesen)

        $fhandle=fopen("http://www.meinedomain.de/netzwerk/netzwerk_wrs.xml""r");
        // Die File-Open-Fkt. funktioniert nur im LAN (OS - Steuerung) sauber,
        // weil die fOpen nur dort schnell genug ausgeführt wurde, so das ein 
        // Handle auf den Heap an den Parser übergeben werden kann.

        while (!feof($fhandle)) 
        {
            
        $str fgets($fhandle1000);
        ....
        // es erfolgt solange eine Fehlermeldung bis das File vollständig übertragen wurde. 
        In modernen Hochsprachen verwendet man deshalb ein Exception-Handling - try, catch und throw oder finally. ( auch ab PHP 4.2.3)

        Um Verbindungsaufbauten in Programmabläufen zu synchroniseren, verwendet man deshalb primär Sockets( z.B TCP oder UDP).

        Und deine switch-cases sind auch übel. Schöner ist:
        PHP-Code:
        $elemente = array ( "netzwerk" => "\n",
                                          
        "mitglied" => "html",
                                            ....);
        echo 
        $element{$element_name}; // geschweifte Klammern beachten 
        Fazit:
        Hatte wieder kaum was mit xml zu tun.

        cu

        Blaster
        Yuppi, endlich Elite ...

        Kommentar


        • #5
          Vielen Dank! ... Wie gesagt, ich bin noch recht neu bei PHP...

          Aber gibt es für das Problem ein Workaround?
          Ich möchte unbedingt unter meiner eigenen Domain eine Mitglieder/Partner-Liste bereithalten, die ich bei Änderungen bei den Mitgliedern zentral aktualisieren kann. Die infos dazu liegen in einer MySQL-Datenbank, auf die aber nur ich von meiner Internet-Präsenz aus zugreifen kann. Diese Mitgliederliste soll aber auch auf anderen Webseiten verfügbar sein, und dort für die anderen komfortabel aktuell bleiben.

          Deswegen habe ich aus der MySQL-Datenbank heraus eine XML-Datei erstellt, die dann von eben diesem PHP-Skript von irgendwo aus dem Web abgerufen werden kann...


          bossman

          Kommentar


          • #6
            Noch ein Zwischenversuch:

            PHP-Code:
            // Versuche statt
            $str fgets($fhandle1000);

            // mal
            $str fread($fhandle4096); 
            Yuppi, endlich Elite ...

            Kommentar


            • #7
              Es geht schon besser: aus dreimal die gleiche Fehlermeldung sind nur noch zwei Fehlermeldungen geworden.
              Aber leider langt's noch nicht ganz. Allerdings kann ich gerade nicht live testen, weil ich halt nicht auf den Server unserer Kunden zugreifen kann... Jetzt habe ich von meiner Test-Umgebung zuhause aus auf unseren Web-Hoster zugegriffen. Oder kann das so große Unterschiede machen?

              Gibt es irgendeine Funktion, die einen zuerst die gewünschte Datei laden lässt, bevor man weitergeht?

              Thx,

              bossman

              Kommentar

              Lädt...
              X