ugrás a tartalomhoz

PHP 5.2.3 + require_once() fv + XML kimenet --> hol a hiba???

fchris82 · 2008. Júl. 15. (K), 23.55
Egy érdekes problémába ütköztem, amit megoldottam, de igazából nem jöttem rá, hogy mi okozza a hibát, vagy egyáltalán hogyan kellene csinálni :?

index.php:
  1. <?php  
  2. require_once('inc/_config.php');  
  3.   
  4. // Egyéb dolgok, amiket a tesztelés során kikommenteztem.  
  5.   
  6. require_once('response/xml.php');  
  7. ?>  
A _config.php-ban változók tömege van, ami pl az adatbázishoz csatlakozáshoz kell.

xml.php:
  1. <?php  
  2. header('Content-type: text/xml; charset=utf-8');  
  3. echo '<?xml version="1.0" encoding="utf-8"?>  
  4. <DOKUMENTUMELEM>  
  5.   valami szoveg  
  6. <VALAMIELEM>valami szoveg</VALAMIELEM>  
  7. </DOKUMENTUMELEM>';  
  8. ?>  
Eredetileg itt DOM-mal egy tömbből készül az XML, de már annyira kiakadtam, hogy nem megy, inkább a netről leszedtem egy ELMÉLETILEG biztosan működő példát :D

Tehát ez elméletileg és gyakorlatilag is azt az eredményt adja, hogy:
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <DOKUMENTUMELEM>  
  3.   valami szoveg  
  4. <VALAMIELEM>valami szoveg</VALAMIELEM>  
  5. </DOKUMENTUMELEM>  
Jobb klikk-->Forrás megtekintése műveletre valóban ezt írja ki. DE! A Firefox meg ezt írja ki:
XML feldolgozási hiba: nem jól formázott
Hely: http://...
1. sor, 2. oszlop:
<?xml version="1.0" encoding="utf-8"?>
-^

Mindegy, hogy mit íratok ki, a hiba mindig a második karakter lesz. Ha telenyomom szóközökkel az elejét, akkor is, ha törlöm a legelső sort, akkor is. Ha include() van a require_once() helyett, akkor is ez a jelenség. Ha van egy beillesztés az utolsó sor előtt, akkor halál. Ha kikommentezem őket, akkor működik.
A jelenlegi megoldás:
  1. ob_start();  
  2. require_once('inc/_config.php');  
  3.   
  4. // Többi kód  
  5.   
  6. ob_end_clean();  
  7. require_once('response/xml.php');  
Jé, és működik :-/ FireBuggal megnéztem, hogy mit küld vissza a rendszer a egyik és mit a másik esetben. Az egyetlen különbség, hogy a válasz header-ben a Content-Length értéke 6 byte-al kevesebb (amikor jó). De amikor megnézem a forrást, ezt a 6 byte-ot sehol nem találom. Se szóköz formájában, se sehogy máshogy.

Tudja vki a megoldást erre a számomra különös problémára?

Chris :)
 
1

UTF8

bonga · 2008. Júl. 16. (Sze), 08.11
Egészen véletlenül nem utf8 kódolással mentetted a két .php fájlt? Az utf8 kódolású fájlok elejére egyes szövegszerkesztők szabvány szerint ún. BOM-ot mentenek, ami pont 3 byte. Ezt a BOM-ot a php nem veszi figyelembe, de mint output-ra küldendő byte-okat igen, vagyis a böngésződ frankón megkapja őket, amit viszont értelmezni már nem tud. Nézd meg egy hex-nézegetőben a forrásfájljaidat, hogy mi az első 3 byte-juk, hátha itt a kutya elásva.
2

Ön nyert

fchris82 · 2008. Júl. 17. (Cs), 00.22
Valóban, UTF-8, BOM-mal. És tényleg ott a 3 byte.