ďťż
Podstrony
|
telcocafeJuż 2 użytkowników skarży się, że nie wczytują się pliki językowe.Powód: stała LANG nie jest wartością skalarną. Hipoteza 1: stała zawiera słowo "array" Hipoteza 2: stała zawiera wartość null Hipoteza 3: stała zawiera tablicę lub obiekt W pierwszym przypadku stała zawierała "Array", ale nie było błędu. W drugiej (najnowszej) przypadłości wyskakuje ostrzeżenie (pakiet WebServ): Warning: Constants may only evaluate to scalar values in ... on line 131 Warning: require(./lang/LANG/main.php) [function.require]: failed to open stream: No such file or directory in ... on line 135 Jedno wiem - w podanym niżej fragmencie coś musi się dziać ze zmienną $nlang. #Start sesji bez ustawiania nazwy - zanim wszystko się dokona session_start(); #Domyślny język - na przykład "pl" $nlang = 'pl'; #Zmiana języka - wątpię, by to miało wpływ if(isset($_GET['lang']) && ctype_alnum($_GET['lang']) && is_dir('./lang/'.$_GET['lang'])) { $nlang = $_SESSION['lang'] = $_GET['lang']; setcookie('lang', $nlang, time()+23328000); //9 miesięcy } #Język - jeśli istnieje w sesji elseif(isset($_SESSION['lang'])) { $nlang = $_SESSION['lang']; } #Język - jeśli istnieje w cookies - ale wątpię w to elseif(isset($_COOKIE['lang'])) { if(ctype_alnum($_COOKIE['lang']) && is_dir('./lang/'.$_COOKIE['lang'])) { $nlang = $_SESSION['lang'] = $_COOKIE['lang']; } } #Automatyczne wykrywanie języka - może tu leży przyczyna? elseif(isset($cfg['detectLang'])) { foreach(explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $x) { if(isset($x[2])) { $x = $x[0].$x[1]; } if(ctype_alnum($x) && is_dir('./lang/'.$x)) { $nlang = $_SESSION['lang'] = $x; break; } } unset($x); } #Katalog z plikami językowymi define('LANG', $nlang); define('LANG_DIR', './lang/'.LANG.'/'); #Dołącz główny plik języka require LANG_DIR.'main.php'; U mnie ten problem nie występuje. Znów pojawiają się hipotezy: 1) skrypt przechwycił jakąś inną sesję, w której istnieje zmienna sesyjna $lang 2) skrypt przechwycił ciasteczko - raczej odpada, bo musiałaby istnieć ścieżka 3) wykrywanie języka nie działa prawidłowo Patrzę na kod i nie widzę problemu. U mnie nie występuje. Jednak 2 osoby już się skarżyły. Co jest grane? Podpowiem Ci. Na serwerze jest sobie forum, które w sesji zapisuje ustawienia. Zapisuje sobie również $_SESSION['lang'] jako tablicę, np., array('pl' => 1, 'en-us' => 0.7, 'en' => 0.3). Teraz Twój skrypt wykrywa, że istnieje zmienna sesji o takiej nazwie i próbuje wrzucić tablicę do stałej. Oto i rozwiązanie problemu. Co zrobić? Własny folder sesji, inne nazwy zmiennych sesji (z prefiksem dla przykładu)... Ot i dylemat ;) Właśnie nie. Po pierwszym uruchomieniu skryptu wszystko działa. Przy kolejnych już pojawia się ten błąd. Teraz już wiem, że zmienna $nlang zawiera zawartość zmiennej $lang, czyli ciągi tekstów dla wybranego języka. $nlang = $_SESSION['lang'];Tu się wszystko rozgrywa. Czy to błąd PHP, czy nie wolno tak przypisywać danych do tablic:$nlang = $_SESSION['lang'] = $xczy błąd mogłem popełnić w innym pliku? Chcę zwrócić uwagę, że nigdzie w kernel.php nie tworzę referencji do $nlang ani $_SESSION['lang'] Starsza wersja kodu: http://pastebin.com/C11tQBCD Przydałoby się narzędzie do monitorowania, w którym miejscu skrypt ustawia lub kasuje zmienne i jakie przyjmują wartości. Xdebug chyba nie wybiega aż tak daleko. Użytkownik Ferrari edytował ten post 21 marzec 2010, 18:37 To stwórz sobie debugger logujący wartości przed miejscem, w którym występuje błąd... albo zmień język na lepiej zaprojektowany, gdzie nie trzeba obchodzić ograniczeń amatorskich hostingow, skrypcików, czy pisać wszystko od zera z licznymi błędami. Frameworki takie jak Django, Ruby On Rails, Grails, Pylons to fajne narzędzia i dobrze opłacana praca. Włączyłem opcje:register_globals = On register_long_arrays = On session.auto_start = 1 Błąd zawitał także u mnie :) Mogłem to zrobić od razu i nie zawracać forum. Przy okazji zapytam: na niektórych serwerach można stawiać wewnętrzne php.ini. Jak to zrobić na localhost? PS. Sprawcą całego zamieszania jest register_globals. Będę prowadził badania, a wyniki gdzieś przydałoby się opublikować - może w FAQ, może w innych miejscach? PS 2. Wszystko jasne. Gdy register_globals = On, w skrypcie tworzy się wielka czarna dziura. Do zmiennych globalnych można odwołać się przez referencje, a więc:if(isset($_SESSION['lang'])) define('lang', $_SESSION['lang']); if($_SESSION['haslo'] == 'xxx')nie gwarantuje bezpieczeństwa! Do poczytania przykład 10: http://php.net/manua...ity.globals.php //Start sesji session_start(); //Zmienne łączą referencje $_SESSION['pies'] = 999; echo $pies; echo '<br />'; //Tutaj już nie ma referencji $_GET['pancerni'] = 4; //ale $pancerni zawiera pierwotną wartość z URL echo $pancerni; echo '<br />'; //Ochrona przed register_globals przed session_start() powinna zapewnić ochronę $_SESSION['zmiennaGET'] = 123; $zmiennaGET = $_GET['hackme']; //Efekt? echo $_SESSION['zmiennaGET']; Użytkownik Ferrari edytował ten post 21 marzec 2010, 22:56 A najlepiej dać blokadę instalacji gdy RG są włączone i htaccessem wyłączyć się ich nie da. |
|||
Sitedesign by AltusUmbrae. |