Autor Zpráva
ElPetros
Profil
Dobrý den, dělám na filtru, kde bude moct člověk vybrat značku auta a poté mu do selectu načtou modely, vytahnuté z DB. Zkoušel jsem to přes AJAXi, vytvořil jsem si php soubor, kde vytvářím XML a poté ho přes AJAXovou funkci ho načítám do zkušebního DIVu, abych věděl jestli to vůbec funguje, ale prostě ne a ne to fungovat. Přikládám všechny důležité soubory (zkrácené). Jinak stránka je ve starém redakčním systému Sunlight XXL 1.0.1. Proto v tom mainu je output. Všechno funguje v pořádku jen se nechce načíst XMLko do toho DIVu zkouška. Hlásí to alert, že se nenačetlo XML. Děkuji předem za jakoukoli pomoc, jelikož si fakt už nevím rady. Nejdůležitější jsou první dva soubory, kde první je v php vytvořené XMLko a ve druhém je AJAX pro načtení dat z XML do toho DIVu. Poslední soubor tam se jen volá ta funkce.

autaXML.php
<?php
  require 'connect.php';
  
  
  //Dotaz na DB
$sql =  "SELECT `manufacturer`, `model`, `body`, `fuel`, `id` " .
           "FROM `auta` " .
           "GROUP BY `manufacturer`";
  
//Vytažení dat
$brandsData = mysql_query( $sql,$databaze_s ) or die('Nelze načíst data aut; ' . mysql_error() );
    
        
//Založení XML souboru pro Ajax
header("Content-Type: text/xml");
$xml = new DOMDocument("1.0","utf-8");
$brands = $xml->createElement("znacky");
$xml->appendChild($brands);
    
while($zaznam = $brandsData->fetch_object()){
  //Vytvořit struktůru
  $brand = $xml->createElement("znacka");
  $brandData = $xml->createTextNode($zaznam ->znacka);
  $brand->appendChild($brandData);
            
  $model = $xml->createElement("model");
  $modelData = $xml->createTextNode($zaznam ->model);
  $model->appendChild($modelData);
            
  //Poskládat správně
  $brand->appendChild($model);
  $brands->appendChild($brand);
}
$vystup = $xml->saveXML();
echo $vystup;
?>

function.php
<script>
function prectiSoubor(){
  var xhr;

  if (window.XMLHttpRequest){
      // IE7+, Firefox, Chrome, Opera, Safari
      xhr=new XMLHttpRequest();
  } else {
      // IE6, IE5
      xhr=new ActiveXObject("Microsoft.XMLHTTP");
  }
  if(xhr){
    xhr.open("POST","autaXML.php",true);
    xhr.onreadystatechange=function(){
      if (xhr.readyState==4 && xhr.status==200){
          xmlDoc=xhr.responseXML;
          document.getElementById("zkouska").innerHTML=xmlDoc;
      }
    }
    xhr.send(null);
    if(!xhr.responseXML){
        alert("Nenacetlo se XML!")
    }
  } else {
    alert("Nenacetlo se xhr!")
  }
}
</script>

main.php
<?php

require 'connect.php';
require 'functions.php';
    
    //Výběr z databáze všechny auta
    $sql1 = "SELECT * " .
           "FROM `auta` " .
           "ORDER BY `id` DESC ".
           "LIMIT " . mysql_escape_string( $start ) . ", " . mysql_escape_string( $limit ) . ";";
    
    //Spojení s databází       
    $cars = mysql_query( $sql1,$databaze_s )
      or die('Nelze načíst data aut; ' . mysql_error() );    
      
    //Filtr  
    $output =  "<form class=\"filtrAut\" method=\"GET\" onsubmit=\"\">";
    $output .= "<h3>Hledání vozidla</h3>";
    //Filtr - Výběr značky
    //$url = $_SERVER['PHP_SELF'] . "?" . $_SERVER['QUERY_STRING'];
    $output .= "<p><label for=\"znackaAuta\">Značka: </label><select onchange=\"prectiSoubor()\" id=\"znackaAuta\">";
    $output .= "<option value=\"nerozhoduje\">Všechny značky</option>";
    //Načtení značek
    if($pocet != 0){
      $sql2 =  "SELECT `manufacturer`, `model`, `body`, `fuel`, `id` " .
               "FROM `auta` " .
               "GROUP BY `manufacturer`";
      //Vytažení dat
      $brandsData = mysql_query( $sql2,$databaze_s )
        or die('Nelze načíst data aut; ' . mysql_error() );
      //Procházení dat
      while($znacky = MySQL_Fetch_Array($brandsData)){
        
            $znacka = $znacky['manufacturer'];
            
            //Přidávání optionu        
            $output .=  "<option value=\"" . $znacka . "\">" . $znacka ."</option>";
      }
    }           
    $output .= "</select></p>";
    //Filtr - Výběr modelu
    $output .= "<p><label for=\"modelAuta\">Model: </label><select id=\"modelAuta\">";
    $output .= "<option value=\"nerozhoduje\">Všechny modely</option>";
    $output .= "</select></p>";
    //Tlačítko filtrovat
    $output .= "<button onclick=\"prectiSoubor()\"type=\"submit\">Hledat vozidla</button>";
    $output .= "</form>";
    $output .= "<div id=\"zkouska\"></div>";         

?>
Davex
Profil
V okamžiku těsně po odeslání požadavku přece ještě nemůžeš vědět, jestli se XMLko načetlo nebo ne. To se dozvíš až v tom callbacku.
Chamurappi
Profil
Reaguji na ElPetrose:
Hlásí to alert, že se nenačetlo XML.
V době, kdy to testuješ, se nenačetlo ještě vůbec nic. Kontroluješ xhr.responseXML v době, kdy jsi teprve odeslal HTTP požadavek, odpověď zatím neexistuje. S odpovědí můžeš pracovat až v onreadystatechange.

header("Content-Type: text/xml");
Pokud neuvedeš charset v MIME typu, prohlížeč by měl předpokládat kódování us-ascii. Dříve na specifikaci prohlížeče kašlaly, nevím, jaký je současný stav (tipnul bych si, že se nezměnil).

Nevím, co bychom měli dělat s tím PHP kódem — pro funkčnost u klienta je důležitý jen jeho výstup a ten asi neumím/nechci představovat. Můžu jen na první pohled konstatovat, že při die('Nelze načíst data aut') nevzniká platné XML.

Mimochodem, „alert("Nenacetlo se xhr!")“ — nemůže nastat. Pokud neuspěje podmínka na řádku 5 a selže pokus o vytvoření new ActiveXObject("Microsoft.XMLHTTP"), vznikne neodchycená výjimka. Dnes sice v podstatě neexistují prohlížeče, kde takový stav nastane, ovšem kdyby nastal, tak alert nevyskočí.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: