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:

<?php
require_once('inc/_config.php');

// Egyéb dolgok, amiket a tesztelés során kikommenteztem.

require_once('response/xml.php');
?>
A _config.php-ban változók tömege van, ami pl az adatbázishoz csatlakozáshoz kell.

xml.php:

<?php
header('Content-type: text/xml; charset=utf-8');
echo '<?xml version="1.0" encoding="utf-8"?>
<DOKUMENTUMELEM>
  valami szoveg
<VALAMIELEM>valami szoveg</VALAMIELEM>
</DOKUMENTUMELEM>';
?>
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:
<?xml version="1.0" encoding="utf-8"?>
<DOKUMENTUMELEM>
  valami szoveg
<VALAMIELEM>valami szoveg</VALAMIELEM>
</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:

ob_start();
require_once('inc/_config.php');

// Többi kód

ob_end_clean();
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.