Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Tajemniczy błąd - typy danych
Forum PHP.pl > Forum > PHP
WebCM
Już 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):
Cytat
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.

  1. #Start sesji bez ustawiania nazwy - zanim wszystko się dokona
  2.  
  3. #Domyślny język - na przykład "pl"
  4. $nlang = 'pl';
  5.  
  6. #Zmiana języka - wątpię, by to miało wpływ
  7. if(isset($_GET['lang']) && ctype_alnum($_GET['lang']) && is_dir('./lang/'.$_GET['lang']))
  8. {
  9. $nlang = $_SESSION['lang'] = $_GET['lang'];
  10. setcookie('lang', $nlang, time()+23328000); //9 miesięcy
  11. }
  12.  
  13. #Język - jeśli istnieje w sesji
  14. elseif(isset($_SESSION['lang']))
  15. {
  16. $nlang = $_SESSION['lang'];
  17. }
  18.  
  19. #Język - jeśli istnieje w cookies - ale wątpię w to
  20. elseif(isset($_COOKIE['lang']))
  21. {
  22. if(ctype_alnum($_COOKIE['lang']) && is_dir('./lang/'.$_COOKIE['lang']))
  23. {
  24. $nlang = $_SESSION['lang'] = $_COOKIE['lang'];
  25. }
  26. }
  27.  
  28. #Automatyczne wykrywanie języka - może tu leży przyczyna?
  29. elseif(isset($cfg['detectLang']))
  30. {
  31. foreach(explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $x)
  32. {
  33. if(isset($x[2]))
  34. {
  35. $x = $x[0].$x[1];
  36. }
  37. if(ctype_alnum($x) && is_dir('./lang/'.$x))
  38. {
  39. $nlang = $_SESSION['lang'] = $x; break;
  40. }
  41. }
  42. unset($x);
  43. }
  44.  
  45. #Katalog z plikami językowymi
  46. define('LANG', $nlang);
  47. define('LANG_DIR', './lang/'.LANG.'/');
  48.  
  49. #Dołącz główny plik języka
  50. 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?
Riklaunim
dziwny ten kod, unsety, zabawy z przekazywaniem danych od jednej zmiennej do drugiej. is_dir('./lang/'.$x)) - pewnie dochodzi do tego że /lang/ jest katalogiem a $x ma jakąś dziwną wartość (od . ./ poczynając). Wrzuć tam warunek na istnienie pliku językowego z podkatalogu. Podobnie może mieć się sprawa z $_COOKIE i $_SESSION gdzie używasz is_dira.
WebCM
Sprawcą całego zamieszania jest register_globals.

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:
Kod
if(isset($_SESSION['lang'])) define('lang', $_SESSION['lang']);
if($_SESSION['haslo'] == 'xxx')
nie gwarantuje bezpieczeństwa!

Do poczytania przykład 10: http://php.net/manual/en/security.globals.php

  1. //Start sesji
  2.  
  3. //Zmienne łączą referencje
  4. $_SESSION['pies'] = 997;
  5. echo $pies;
  6. echo '<br />';
  7.  
  8. //Tutaj już nie ma referencji
  9. $_GET['pancerni'] = 4;
  10.  
  11. //ale $pancerni zawiera pierwotną wartość z URL
  12. echo $pancerni;
  13. echo '<br />';
  14.  
  15. //Ochrona przed register_globals przed session_start() powinna zapewnić ochronę
  16. $_SESSION['zmiennaGET'] = 123;
  17. $zmiennaGET = $_GET['hackme'];
  18.  
  19. //Efekt? Lepiej unikać konfliktu zmiennych
  20. echo $_SESSION['zmiennaGET'];
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.