• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

AJAX request fehlerhaft

P51D

Mitglied
Hallo miteindaner

Ich habe ein kleines Problem, bei dem ich nicht mehr weiter weiss:
Komischerweise wird plötzlich ein Teil des Scripts nicht mehr ausgeführt.

die Datei get_content.php
PHP:
if(isset($_GET["page"])){
    $title = "";
    $date = "";
    $type = "";
    $author = "Admistrator";
    $page = "";
    $request = $_GET['page'];
    if($request == "agenda"){
        /**
         *    Agenda einbinden und Zugriff auf Datenbank initialisieren
         */
        require_once("includes/class_agenda.php");
        $agenda = new MySQL_agenda();
        
        $title = "Agenda";
        $page = $agenda->display_events($num = 0, $tab_offset = 3);
    }
    echo json_encode($send);                                                            // Array codieren als String (JSON)
}

Komischerweise wird die Fallback-Version ohne JavaScript richtig angezeigt, aber mit JavaScript kommt beim Firebug als Antwort nur das:
page"agenda"
title"Agenda"
date_time""
type""
author"Admistrator"
contentnull

Wenn ich bei der Agenda-Klasse nur eine Zeile auskommentiere, funktioniert es auch mit AJAX:
PHP:
    while(($row = mysql_fetch_array($result)) && ($count <= $num)){        // Alle oder nur best. Anzahl ausgeben
        if(($count % 2) == 0){                                            // Zeilenweise Farbe wechseln
            $msg .= "\r$tabs\t<tr bgcolor=\"$this->color_body1\">";
        }
        else{
            $msg .= "\r$tabs\t<tr bgcolor=\"$this->color_body2\">";
        }
        $count ++;
        
        if($row["priority"] == 1){                                        // Priorität markieren
            $font = 'style="color: '.$this->high_priority.'"';
        }
        else{
            $font = 'style="color: '.$this->normal_priority.'"';
        }        
        $msg .= "\r$tabs\t\t<td align=\"center\" $font>".$this->get_event_date($row["id"])."</td>";
        $msg .= "\r$tabs\t\t<td $font>".$row["description"]."</td>";
        $msg .= "\r$tabs\t\t<td $font>".$row["location"]."</td>";                     ///   <== Auskommentiert -> läuft; so nicht
        $msg .= "\r$tabs\t</tr>";
    }

Hat jemand vielleicht eine Idee??
Achja, hier noch der Link (Menu-Punkt Agenda):
Harmonie Schwarzenburg: Home

Besten Dank
MFG
P51D
 
Werbung:
Auf jeden Fall liegt der Fehler da drin, dass content == null ist. Dadurch wird der Ajax Fehler ausgeloest.
Wie befuellst du denn dieses $send array?
 
Also ich finde die Bedienung der Seite ohne JS wesentlich angenehmer und die Skripte sind auch solche, wo ich immer froh bin, dass ich NoScript verwende. Deine Funktion waitForImages() kann ältere Rechner vor allem wenn mal ein Bild nicht geladen werden kann hast du da eine Endlosschleife. Um das laden von Bilder zu checken gibt es bessere Lösungen.

AJAX hat hier für den Besucher keinen erkennbaren Nutzen, eher im gegenteil, da die übliche Reaktion des Browsers beim klicken auf einen Link nicht erfolgt, kann es Besucher verwirren.
 
Werbung:
Wie befuellst du denn dieses $send array?

Achja, dies habe ich wohl vergessen zu kopieren...
PHP:
    $send = array(                                                                        // Array zusammenstellen
        "page" => $request,
        "title" => $title,
        "date_time" => $date,
        "type" => $type,
        "author" => $author,
        "content" => $page
    );


@struppi
Von welchen Funktionen sprichst du jetzt? Hast du zu der "besseren" Lösung um das Laden eines Bildes zu überprüfen noch ein Beispiel? Ich hätte hier noch eine Timeout-Funktion hinzugefügt, damit der AJAX-Teil abgebrochen wird, falls er zu lange dauert (die Seite befindet sich ja auch in Überarbeitung und ist noch nicht fertig).
Verbesserungsforschläge nehme ich gerne entgegen.

Ich sehe hierbei den Nutzen schon, da viele Mitlgieder des Vereins noch mit älteren PC's und langsameren Internetverbindungen auch auf die Seite zugreifen wollen. Hier möchte ich den Datenstrom etwas limitert halten, so dass halt nur die wesentlichen Inhalte sich ändern. Die Reaktion beim Klicken ist hier halt jetzt der Ladebalken.

MFG
P51D
 
So wirklich kann man durch dein PHP-Skript noch immer nicht durchsteigen, fürchte ich. Mir ist zumindest nicht klar, was da wie zusammenspielt.
 
Werbung:
@struppi
Von welchen Funktionen sprichst du jetzt? Hast du zu der "besseren" Lösung um das Laden eines Bildes zu überprüfen noch ein Beispiel? Ich hätte hier noch eine Timeout-Funktion hinzugefügt, damit der AJAX-Teil abgebrochen wird, falls er zu lange dauert (die Seite befindet sich ja auch in Überarbeitung und ist noch nicht fertig).
Verbesserungsforschläge nehme ich gerne entgegen.
Für das alles gibt es Events. onload und onerror zeigen an, ob ein Element geladen wurde und funktionieren auch bei Bilder (auch wenn es nicht dokumentiert ist). Wobei ich mich bei dem Code frage, warum du alle Bilder des Dokumentes abfragst? window.onload wird gefeuert, wenn alle Bilder geladen wurden, diese Abfrage macht also keinen Sinn. Bei AJAX ist es ähnlich auch dort kann man Fehlerhafte Requests abfragen.

Aber wie gesagt, ich finde die JS-lose Variante benutzerfreundlicher, zumal der server so schnell ist, dass mir zumindest kein Unterschied aufgefallen ist.
 
also, hier ist dann mal das komplette Skript: get_content.php
PHP:
//Error-Verarbeitung
require_once("includes/class_error.php");
$error_handling = new error();

if(isset($_GET["page"])){
    $title = "";
    $date = "";
    $type = "";
    $author = "Administrator";
    $page = "";
    $request = $_GET['page'];
    if($request == "agenda"){
        //Agenda einbinden und Zugriff auf Datenbank initialisieren
        require_once("includes/class_agenda.php");
        $agenda = new MySQL_agenda();
        
        $title = "Agenda";
        $page = $agenda->display_events($num = 0, $tab_offset = 3);
    }
    else{
        //Inhalte einbinden und Zugriff auf Datenbank initialisieren
        require_once("includes/class_content.php");
        $content = new MySQL_Content();
        
        //Menü einbinden und initialisieren
        require_once("includes/class_menu.php");
        $menu = new MySQL_Menu();
        
        $menu_id = $menu->get_link_id_as_url($request);                                    // ID aus der Menü-Tabelle
        $type = $menu->get_link_type($menu_id);
        switch($type){
            case "content":
                $id = $content->get_id($request);
                $page = $content->get_content($id);
                $title = $content->get_title($id);
                $date = $content->get_date_time($id);
                $author = $content->get_author($id);

                if(($page == "") || ($page == NULL)){                                    // Seite existiert nicht in Datenbank -> Fehlermeldung
                    $message = "page <i>'".$request."'</i> was not found.";
                    $page = $error_handling->show_message($source="Database", $message, $tab_offset = 3);
                    $title = "Harmonie Schwarzenburg: Error";
                }
                break;
            
            case "gallery_images":
                //Bildergalerie einbinden
                require_once("includes/class_picture_gallery.php");
                $gallery = new picture_gallery();
                    
                $title = $menu->get_link_title($menu_id);
                $page = $gallery->get_gallery($request, $title, $ajax = true);
                $date = $gallery->get_dir_date($request, $ajax = true);
                
                if($page == NULL){
                    $message = "directory <i>'".$request."'</i> was not found.";
                    $page = $error_handling->show_message($source="Server", $message, $tab_offset = 3);
                }
                else{
                    $title = $title;
                    $page = "\t<h3>$title</h3><br/><br/>".$page;
                }
                break;
            
            case "gallery_movie":
                //Videogalerie einbinden
                require_once("includes/class_media_player.php");
                $player = new media_player();
                $page = $player->get_media_player($request, $tab_offset = 3, $ajax = true);
                $title = $menu->get_link_title($menu_id);
                break;
            
            case "email":
                //Kontaktformular einbinden
                require_once("includes/class_contact.php");
                $contact = new Contact_form();
                
                $id = $contact->get_id($request);
                $page = $contact->get_contact_form($request, $tab_offset = 3, $fromname = "", $frommail = "", $mailsubject = "", $mailtext = "", $send_result = "");
                $title = $contact->get_title($id);

                break;
            
            default:
                $message = "Unknown content type. <i>'".$request."'</i> was not found.";
                $page = $error_handling->show_message($source="Server", $message, $tab_offset = 3);
                break;
        }
    }
    if(($page == null) || ($page == "")){
        $page = $error_handling->show_message($source="Server", $message="Page load failed", $tab_offset = 3);
    }
    $send = array(                                                                        // Array zusammenstellen
        "page" => $request,
        "title" => $title,
        "date_time" => $date,
        "type" => $type,
        "author" => $author,
        "content" => $page
    );
    echo json_encode($send);                                                            // Array codieren als String (JSON)
}

Die Version ohne JavaScript lädt die Werte vor dem HTML Teil
PHP:
/* ********************* Klassen einbinden und initialisieren ******************************** */
//Besucherzähler
require_once("includes/class_counter.php");

//Error-Verarbeitung
require_once("includes/class_error.php");
$error_handling = new error();

//Status der Seite
require_once("includes/class_state.php");
$page_state = new state();
$page_state->state_db_init();

//Kontaktformulare initialisieren
require_once("admin/includes/class_contact.php");
$contact = new Contact_form();    

//Videogalerie einbinden
require_once("includes/class_media_player.php");
$player = new media_player();

// Menü einbinden und initialisieren
require_once("includes/class_menu.php");
$menu = new MySQL_Menu();
$menu->Menu_init();

//Bildergallerie
require_once("includes/class_picture_gallery.php");
$gallery = new picture_gallery();                    

if(isset($_GET["page"])){
    //Inhalte einbinden und Zugriff auf Datenbank initialisieren
    require_once("includes/class_content.php");
    $content = new MySQL_Content();
    $content->content_init();
    
    if(isset($_GET["page"])){                                                        // GET Variable gesetzt
        $content_id = $content->get_id($_GET["page"]);
        $page = $_GET["page"];
    }
    else{                                                                            // Startseite
        $content_id = $content->get_id("home");
        $page = "home";
    }
    
    if($page == "agenda"){
        //Agenda einbinden und Zugriff auf Datenbank initialisieren
        require_once("includes/class_agenda.php");
        $agenda = new MySQL_agenda();
        $agenda->agenda_init();
        
        $title = "Agenda";
        $page = $agenda->display_events();
    }
    else{    
        $menu_id = $menu->get_link_id_as_url($page);                                    // ID aus der Menü-Tabelle
        if($menu_id != NULL){
            switch($menu->get_link_type($menu_id)){
                case "content":
                    if($content_id == NULL){
                        $message = "page <i>'".$_GET["page"]."'</i> was not found.";
                        $page = $error_handling->show_message($source="Database", $message, $tab_offset = 3);
                    }
                    else{
                        $page = $content->get_content($content_id, $tab_offset = 3);        // Aktueller Seiteninhalt
                        $title = $content->get_title($content_id);                            // Seiten-Titel
                        $author = $content->get_author($content_id);                        // Autor des Textes
                        $date_time = $content->get_date_time($content_id);                    // Erstellungsdatum des Textes
                    }
                    break;
                
                case "gallery_images":            
                    $title = $menu->get_link_title($menu_id);
                    $page = $gallery->get_gallery($page, $title);
                    $title = $title;
                    $date_time = $gallery->get_dir_date($page);
                    $page = "\t<h3>$title</h3><br/><br/>".$page;
                    if($page == NULL){
                        $message = "directory <i>'".$_GET["page"]."'</i> was not found.";
                        $page = $error_handling->show_message($source="Server", $message, $tab_offset = 3);
                    }
                    break;
                
                case "gallery_movie":                    
                    $title = $menu->get_link_title($menu_id);
                    $page = $player->get_media_player($dir = $_GET["page"], $tab_offset = 3);
                    break;
                
                case "email":
                    $id = $contact->get_id($_GET["page"]);
                    $title = $contact->get_title($id);
                    $date_time = "";
                    $page = $contact->get_contact_form($_GET["page"], $tab_offset = 3, $fromname = "", $frommail = "",
                                                    $mailsubject = "", $mailtext = "", $send_result = $msg);
                    break;
            }
        }
        else{
            $message = "Page was not found in database";
            $page = $error_handling->show_message($source="Server", $message, $tab_offset = 3);
        }
    }
    if(($page == "") ||($page == NULL)){                                                // Seite ist nicht in Datenbank
        $message = "page <i>'".$_GET["page"]."'</i> was not found.";
        $page = $error_handling->show_message($source="Database", $message, $tab_offset = 3);
        $title = "Error";
    }
}
 
und die Einträge werden so ausgelesen:
PHP:
function display_events($num = 0, $tab_offset = 0){                        // $num = 0 -> alle / oder Anzahl
    global $GLOBAL;                                                        // Variable in Klasse bekannt machen
    $db = $GLOBAL["db_agenda"];

    $sql = "SELECT * FROM $db ORDER by `date` ASC";                        // Werte auslesen
    $result = mysql_query($sql);
    if(!$result) exit(mysql_error());
    
    if($num == 0){                                                        // Alle Einträge anzeigen
        $num = $this->get_event_num_rows();
    }
    $tabs = "";
    for($i = 0; $i < $tab_offset; $i ++){
        $tabs .= "\t";
    }
    
    $msg = "\r$tabs<h3>Agenda</h3><br/>";
    
    $msg .= "\r$tabs<table cellspacing=\"2\" cellpadding=\"5\" $this->css_table>";
    $msg .= "\r$tabs\t<colgroup>";
    $msg .= "\r$tabs\t\t<col width=\"200\"/>";
    $msg .= "\r$tabs\t\t<col width=\"400\"/>";
    $msg .= "\r$tabs\t\t<col width=\"300\"/>";
    $msg .= "\r$tabs\t</colgroup>";
    
    $msg .= "\r$tabs\t<tr bgcolor=\"$this->color_head\" style=\"font-color:$this->font_color_head\">";
    $msg .= "\r$tabs\t\t<th>Datum / Zeit</th>";
    $msg .= "\r$tabs\t\t<th>Beschreibung</th>";
    $msg .= "\r$tabs\t\t<th>Ort</th>";
    $msg .= "\r$tabs\t</tr>";
    
    $count = 1;                                                            // Variable für verschiedenfarbige Zeilen
    while(($row = mysql_fetch_array($result)) && ($count <= $num)){        // Alle oder nur best. Anzahl ausgeben
        if(($count % 2) == 0){                                            // Zeilenweise Farbe wechseln
            $msg .= "\r$tabs\t<tr bgcolor=\"$this->color_body1\">";
        }
        else{
            $msg .= "\r$tabs\t<tr bgcolor=\"$this->color_body2\">";
        }
        $count ++;
        
        if($row["priority"] == 1){                                        // Priorität markieren
            $font = 'style="color: '.$this->high_priority.'"';
        }
        else{
            $font = 'style="color: '.$this->normal_priority.'"';
        }        
        $msg .= "\r$tabs\t\t<td align=\"center\" $font>".$this->get_event_date($row["id"])."</td>";
        $msg .= "\r$tabs\t\t<td $font>".$row["description"]."</td>";
        $msg .= "\r$tabs\t\t<td $font>".$row["location"]."</td>";
        $msg .= "\r$tabs\t</tr>";
    }
    $msg .= "\r$tabs</table>";

    return $msg;
}

@Struppi
Ich frage ja auch nicht alle Bilder des Dokumentes ab. Nur bei der Bildergalerie wird jeweils überprüft ob alle Bilder im "Content" schon geladen wurden um anschliessend die Clearbox und einen Glossy Effekt zu initialisieren. Der Glossy läuft leider nicht, wenn die Bilder nachträglich über JavaScript hinzugefügt wurden. Bei der Clearbox weiss ich es nicht, da ich es noch nicht ausprobiert habe.

Das Interessante am Request ist ja, dass dieser nicht zwingend Fehlerhaft ist. ReadyState == 4 und Status == 200. Nur wird kein Inhalt über "content" im übermittelt. Aber wenn ich im get_content.php vor dem $send-Array ein $page=hallo einfüge, wird das hallo angezeigt. Nur der Agenda Inhalt nicht.

MFG
P51D
 
Werbung:
LOL, Problem gefunden: Es war mal wieder UTF-8...
ein
mysql_query('SET CHARACTER SET utf8');
vor dem Select hat alles behoben. Aber wieso lief es ohne JavaScript? da ist doch der Datenbankzugriff über die identischen Funktionen gegeben. Einziger Unterschied ist der json String.

MFG
P51D
 
Ich liebe es, wie in der Bug-Beschreibung steht: „if a string contains an Euro symbol ( � )

Da ist doch mein spontaner Gedanke, dass die Daten, die der Bug-Autor als Grundlage genommen hat, ein falsch kodiertes Euro-Zeichen enthielten. ;)

Der Bug steht auch auf BOGUS.

Aus der Doku zu json_encode: „This function only works with UTF-8 encoded data.“
 
Werbung:
Zurück
Oben