![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 81 Pomógł: 0 Dołączył: 20.03.2003 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Nieczęsto proszę kogoś na forum o pomoc, bo zawsze staram się rozwiązywać problemy sam. Z tym jednak nie mogę sobie poradzić. Nie mam zupełnie pojęcia o co chodzi.
Zacząłem tworzyć stronę, która będzie dostępna w kilku językach. Gość już na stronie głównej może wybrać sobie, w jakim języku witryna ma być wyświetlana. Klikając w odpowiedni link, tworzy zmienną $HTTP_SESSION_VARS["lang"], zawierającą wiadomość, o tym, jaki gość wybrał język. W skrypcie strony, na samym początku sprawdzane jest, czy zmienna istnieje. Jeśli nie, to przypisana jest jej wartość języka angielskiego. Następnie includowany jest plik, zawierający deklarację tablicy $lang, w której pod odpowiednimi indeksami zawarte będą przetłumaczone na dany język teksty. To tyle tytułem wstępu. Poniżej wklejam fragment kodu, który ma wyświetlić różne tytuły dla różnych języków: header.php
lang/polski/lang_main.php
lang/english/lang_main.php
Przy pierwszym uruchomieniu strony, kiedy jeszcze sesja nie jest ustawiona, skrypt działa poprawnie i wyświetla angielski tekst tytułu. Kiedy jednak ktoś kliknie w link jakiegoś języka, wyświetlana jest tylko pierwsza litera tekstu z zaincludowanej zmiennej. Nie mam pojęcia, o co w tym chodzi. Głupi problem i zapewne prosty w rozwiązaniu, ale nie pozwala mi się ruszyć dalej. Proszę o pomoc. Link do tej stronki: http://www.footbag.p2.pl/footbagnews |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarząd Postów: 3 503 Pomógł: 28 Dołączył: 17.10.2002 Skąd: Wrocław ![]() |
Aż mnie zaskoczyło te pytanie...
Może coś po drodze modyfikuje tablicę z językami? |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 81 Pomógł: 0 Dołączył: 20.03.2003 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Między includem a echo jest czysty HTML i JS. Nic niczego nie modyfikuje... PS. Mnie też to bardzo zaskoczyło... Ten post edytował Cod 25.06.2004, 08:33:51 |
|
|
![]()
Post
#4
|
|
Grupa: Zarząd Postów: 3 503 Pomógł: 28 Dołączył: 17.10.2002 Skąd: Wrocław ![]() |
może na próbę zmień zawartość plików jezykowych i zamiast słow kluczowych wpisz tam po prostu "PL" i "EN" ?
...coś mi tu śmierdzi... tylko jeszcze nie wiem co... BTW: $_GET $_SESSION $_POST ... bo mi się od $HTTP_*_VARS oczy męczą (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) |
|
|
![]()
Post
#5
|
|
Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław ![]() |
Nie wchodząc w problem odczytywania tablicy lang, wydaje mi się, że sam mechanizm przehowywania języka jest błędny.
W ten sposób nigdyy nie sprawdzasz, czy czasem już nie jest w sesji informacja na temat języka. Ja to robię zazwyczaj tak: 1. sprawdzam czy jest info o języku w get 2. jeśli 1 tak, sprawdzam czy istnieje taki język 3. jeśli 2 tak - zapisuje do sesji 4. jeśli 1 nie - sprawdzam czy jest język w sesji 5. jeśli 4 nie - przypisuje domyślny język do sesji |
|
|
![]()
Post
#6
|
|
Grupa: Zarząd Postów: 3 503 Pomógł: 28 Dołączył: 17.10.2002 Skąd: Wrocław ![]() |
Po konsultacjach na GG dotarliśmy do tego, że zaczęlo działać po zmianie nazy tanblicy z $lang na inną..
Jestem zdumiony... |
|
|
![]()
Post
#7
|
|
Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław ![]() |
a ja chyba rozumiem.
Jest to efekt połaczenia pracy na zmiennych superglobalnych z register_globals=on Już dawno temu raportowałem, że takie połaczenie może być bardzo niebezpieczne, z uwagi na to, że dla skryptu zmienne $lang i $HTTP_GET_VARS["lang"] są w takim przypadku równoznaczne (to tak, jakby skorzystać z session_register() Na szczęscie w przypadku korzystania z $_SESSION w nowych wersjach php nie spotykamy się (chyba) z tym problemem. |
|
|
![]()
Post
#8
|
|
Grupa: Zarząd Postów: 3 503 Pomógł: 28 Dołączył: 17.10.2002 Skąd: Wrocław ![]() |
DeyV, ale to nie tłumaczy pokazywania tylko pierwszego znaku. nadpisywać ok, może. Ale sprawdzaliśmy var_exportem i to co on pokazuje normaklnie w <title> jest wstawianie jako $...[0] - a takiej konstrukcji w kodzie nie ma nawet.
Zamiana na $_* też niewiele dała. Pomaga jedynie zmiana nazwy tablicy. Kod widziałem, jest na moje oko cały poprawny. |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 300 Pomógł: 1 Dołączył: 22.09.2003 Skąd: Czeladź Ostrzeżenie: (0%) ![]() ![]() |
mogę dokładnie potwierdzić że to co pisał DeyV jest prawdą. pare razy już zdażała mi się taka sytuacja jak właśnie był register globals na on. wydaje mi się że php wtedy miesza coś z typami. wtedy dokładnie pojawia się 1 litera danego stringu.
|
|
|
![]()
Post
#10
|
|
Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław ![]() |
1. zmiana register_globals = off od razu rozwiązuje problem
2. użycie $_SESSION samo w sobie nie pomaga A przyczyna takiego zachowania jest taka: z uwagi na to, że według variables_order Session jest wyżej, niż zwykłe zmienne, więc tablica $langs zostaje nadpisane stringiem $_SESSION["lang"] Jednak my nadal staramy się odwoływać do tej zmiennej, jak do tablicy. pisząc: $langs['test'] php nie znajduje takiego pola, stwierdza natomiast, że $langs nie jest tablicą asocjacyjną. Konwertuje więc słowo 'test' na int, (w efekcie otrzymuje 0 i sprawdza, czy istnieje taki index w naszej pseudo tablicy. Co prawda nie istnieje, ale php 4 pozwala na odwoływanie się do kolejnych znaków stringa poprzez $string[ $i ] więc w wyniku otrzymujemy znak nr. 0 naszego stringa. Nie bardzo wiem tylko, jak zachodzi transformacja, w wyniku której w $langs nie znajduje się napis 'english' tylko 'xnglish' ale to musi być jakoś związane z sobą. edited. Już wiem jak. W wyniku działania variables_order i nadpisywania zmiennych nie dochodzi do czystego nadpisania zmiennej (na zasadzie $lang = $_SESSION["lang"] ) tylko na połączeniu tych zmiennych, gdzie nasza zmienna jest wrzucana na koniec zmennej tablicowej w sessji. Oczywiście gdy jest to tablica. Gdy w sessji jest string, zachodzi ta dziwna konwersja typów, czego efekty dało się zauważyć. Jak z tym walczyć? Ja używam prefixów w zmiennych sessyjnych (stare przyzwyczajenie, ale przydatne, bo nie zawsze można wymusić przełączenie na register_globals =off |
|
|
![]()
Post
#11
|
|
Grupa: Zarząd Postów: 3 503 Pomógł: 28 Dołączył: 17.10.2002 Skąd: Wrocław ![]() |
Czyli kłaniają się stanbdardykodowania...
$arrlang i po sprawie... albo OOP:
|
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 81 Pomógł: 0 Dołączył: 20.03.2003 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Dzięki wszystkim za rozwiązanie problemu i szczegółowe wyjaśnienie, o co chodziło. Niestety nie mogę wyłączyć register_globals, więc pozostaje mi podmianka jednego "lang" na coś innego. Tak właśnie zrobiłem i wszystko jest git.
(IMG:http://forum.php.pl/style_emoticons/default/cool.gif) |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 436 Pomógł: 6 Dołączył: 8.11.2003 Skąd: Szczecin Ostrzeżenie: (0%) ![]() ![]() |
Jeżeli możesz kozystać z plików .htaccess to możesz wyłączyć register_globals. Stworz plik ".htaccess" i wpisz w nim taką treść:
Kod php_flag register_globals 0 Nie wiem czy tak, ale prawodopodobne tak. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.08.2025 - 22:36 |