Problem ten pojawia się zazwyczaj gdy stronę wykorzystującą sesje próbujemy poddać testowi na poprawność kodu XHTML ( http://validator.w3.org).
Ponieważ walidator nie akceptuje cookies to automatycznie do adresu doklejany jest identyfikator sesji, np.
index.php?go=1&PHPSESSID=474d2aa02a8431ca59aa96f39917b806
Jednakże wtedy validator zgłasza problem, ponieważ & (ampersend) to znak specjalny, który powinien być zawsze zakończony średnikiem. Prawidłowo zapisany ampersend powinien wyglądać tak : &. Oczywiście problem ten dotyczy nie tylko sesji (chociaż jest to przypadek specyficzny), ale wszystkich adresów z niepoprawnie zapisanym znakiem &. Za ustawienie separatora dla argumentów w wyjściowym adresie URL odpowiada zmienna konfiguracyjna arg_separator.output, domyślnie ustawiona na &. Jak się zapewne już domyślacie należy zmienić ją na &.Jednakże trochę inaczej sprawa ma się arg_separator.input, które odpowiada za parsowanie URLa w drugą stronę. Jej wartością nie jest bowiem pojedyńczy separator do odzielania argumentów w URLu, lecz lista separatorów. Ustawienie & spowoduje, że separatorami będą litery a, m, p oraz & i ;, a nie sam ampersend, tak jakbyśmy tego chcieli. Aby temu zaradzić arg_separator.input należy ustawić na ;&.Warto zwrócić uwagę na fakt, że w przeciwieństwie do arg_separator.output, arg_separator.input nie może być ustawione wewnątrz pliku, tak więc najlepiej obie wartości (dla większej przejrzystości) ustawić albo w php.ini albo w .htaccess.Przykład z wpisami w .htaccess :
php_value arg_separator.input ";&" php_value arg_separator.output "&"
Przykład z wpisami w php.ini :
arg_separator.input = ";&" arg_separator.output = "&"
Ja rozwiazuje ten problem w inny sposob. Jestem przyzwyczajony do pisania "?" :P
function change_amp($buffer)
{
return (str_replace("?", "&", $buffer));
}
ob_start("change_amp");
echo '????????????????';
ob_end_flush();
emo9, zwróć się proszę z dokladnym opisem twojego problemu na forum.
Zrobiłem to tym sposobem z .htaccess i teraz w w3c mam coś takiego: character "&" not allowed in attribute specification list .
No właśnie daltego o tym napisałem, że nie każdy (np. ja) ma dostęp do php.ini...
~camel to co podałeś to niemalże ten sam sposób. Bo kwestia polega tylko na ustawieniu pewnych dyrektyw. Ty ustawiasz tylko na czas wykonania danego skryptu. Jest to wyjście idealne dla osób, które nie mają dostępu do pliku php.inni a jednocześnie mogą kożystać z ini_set(). Rozwiązanie proponowane przez ~sopel jest uniwersalne i działa dla wszystkich skryptów uruchamianych "na" danej konfiguracji PHP
Niedawno pisałem o tym na forum.. Ja zrobiłem to tak:
W pliku php "ini_set('arg_separator.output', "&");" i wszystko działa :)