Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] include / require - wielkość liter a konfiguracja PHP
Forum PHP.pl > Forum > Przedszkole
lukasamd
Witam wszystkich,
mam pewien problem z dosyć prostym kodem - jest funkcja, która dostaje jako argument string i załącza plik np. z tablicą do przyłączenia do już istniejącej, w mega-skrócie tak:


  1. function add_file($filename = '')
  2. {
  3. $file = DIR_MAIN . "/files/{$filename}.php";
  4.  
  5. if (file_exists($file))
  6. {
  7. require_once $file;
  8. }
  9. }


Problem pojawa się, gdy jako argument podam coś z wielkimi znakami - np. plik nazywa się testFile.php ale podanie jako argumentu testFile nie zadziała - wywala błąd o tym, że nie znaleziono testfile (tak, bez dużej litery).
Z czego to wynika? Zakładam, że chodzi o konfigurację PHP, bo problem występuje na 1-2 z 6-7 współdzielonych kontach hostingowych.
wookieb
W unixach ważna jest wielkość liter plików, W Windowsach nie.
Mackos
W manualu funkcji readdir jest napisana bardzo elegancka funkcja, która moim zdaniem mogłaby się do tego nadać.
  1. if ($handle = opendir('.')) {
  2. while (false !== ($entry = readdir($handle))) {
  3. if ($entry != "." && $entry != "..") {
  4. echo "$entry\n";
  5. }
  6. }
  7. closedir($handle);
  8. }
wookieb
@Mackos chyba nie wiesz o czym mówisz...
lukasamd
@wookieb:
Wszystkie testowane przeze mnie konta działały na linuksach (czasem Debian, czasem CentOS, chyba był też jeden Ubuntu). Oczywiście wiem, że wielkość znaków ma znaczenie, ale dziwi mnie zachowanie PHP - zupełnie jakby "wymuszał" aby ten argument miał same małe litery, lub też w takiej formie używał go podczas sprawdzania i załączania pliku.
Po drodze nie ma nic, co modyfikowałoby ten argument, a jednak do file_exists oraz require trafia on jakby bo strtolower...
by_ikar
No to spróbuj nie udziwniać składni, zamiast:

  1. $file = DIR_MAIN . "/files/{$filename}.php";


zrób to normalnie:

  1. $file = DIR_MAIN.'/files/'.$filename.'.php';


I wyświetl sobie tą ścieżkę i sprawdź czy jest różnica. Dodatkowo, do funkcji która raczej wymaga podania argumentu, nie nadawaj pustego argumentu, nie wiem jaki to ma cel?
lukasamd
W pierwszym poście napisałem, że to mega-skrót a nie kod - chodzi o sam fakt zmniejszania liter, który bierze się znikąd.
A co do składni - nie ma znaczenia jak by nie było napisane, poza tym ta zaprezentowana wyżej również jest jak najbardziej poprawna.
by_ikar
Cytat(lukasamd @ 23.12.2011, 16:38:26 ) *
W pierwszym poście napisałem, że to mega-skrót a nie kod - chodzi o sam fakt zmniejszania liter, który bierze się znikąd.


W takim wypadku pokaż cały kod.

BTW używanie eregi też jest poprawne, a czy jest właściwe to jest inna kwestia. wink.gif
lukasamd
Cały kod:

  1. /**
  2. * Load the language variables for a section.
  3. *
  4. * @param string The section name.
  5. * @param boolean Is this a datahandler?
  6. * @param boolean supress the error if the file doesn't exist?
  7. */
  8. function load($section, $isdatahandler=false, $supress_error=false)
  9. {
  10. // Assign language variables.
  11. // Datahandlers are never in admin lang directory.
  12. if($isdatahandler === true)
  13. {
  14. $this->language = str_replace('/admin', '', $this->language);
  15. }
  16. $lfile = $this->path."/".$this->language."/".$section.".lang.php";
  17.  
  18. if(file_exists($lfile))
  19. {
  20. require_once $lfile;
  21. }
  22. elseif(file_exists($this->path."/english/".$section.".lang.php"))
  23. {
  24. require_once $this->path."/english/".$section.".lang.php";
  25. }
  26. else
  27. {
  28. if($supress_error != true)
  29. {
  30. die("$lfile does not exist");
  31. }
  32. }
  33.  
  34. // We must unite and protect our language variables!
  35. $lang_keys_ignore = array('language', 'path', 'settings');
  36.  
  37. if(is_array($l))
  38. {
  39. foreach($l as $key => $val)
  40. {
  41. if((empty($this->$key) || $this->$key != $val) && !in_array($key, $lang_keys_ignore))
  42. {
  43. $this->$key = $val;
  44. }
  45. }
  46. }
  47. }



A co jest niewłaściwego w używaniu {} do wyświetlania zmiennych?
Pytam szczerze, bo jeżeli coś jest nie tak, to wolałbym wiedzieć wink.gif
by_ikar
Nie ma nic złego w klamrach, ale używanie ich wszędzie, czy używanie wszędzie cudzysłowia to jest moim zdaniem, jest niepotrzebnym narzucaniem na wydajność. Żeby w cudzysłowiu php znalazło zmienną, musi całą jego zawartość przeparsować. W proceduralnym stylu, promowanym przez wiele cms'ów praktycznie każda linijka to jest echo z cudzysłowiem. Niby nic, ale kilkaset takich linijek i tworzy się niepotrzebny narzut. Klamry słóżą do innego celu niż ładnego wyglądania i również stosuje się je tam gdzie trzeba, przykładowo w sytuacjach jak w tym temacie: http://forum.php.pl/index.php?showtopic=190084 a nie za każdym razem. W cudzysłowiu dodatkowo chyba większość IDE nie "odnajduje" naszych smiennych. Czyli w takiej liście zmiennych, podczas refaktoryzacji zmieni się tylko część zmiennych, które "widzi" nasze IDE. kolorowanie składni również leży. Przypomina mi to właśnie proceduralny styl..

Po kodzie niczego nie widzę, ale całkowicie całego kotu też nie widzę. Wrzuć w tą funkcję wszędzie tam gdzie używasz zmiennej $section, tuż przed użyciem var_dumpa. Albo jeżeli używasz jakiegoś IDE porób sobie breakpointy i sprawdź co jest przekazywane do metody.
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.