![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 16 Pomógł: 0 Dołączył: 20.10.2012 Ostrzeżenie: (0%) ![]() ![]() |
Sprawa dotyczy późnego i dynamicznego określania nazwy zmiennych w skrypcie zawierającym formularz w nowych wersjach PHP
Zmienna ma nazwę postaci: opcja_$row_z[0] gdzie $row_z[0] jest generowana gdzieś w innym miejscu. Tu dla uproszcznia przyjęto $row_z[0]=29; Skrypt ten dobrze działa w WAMP5 (Apache1.3, PHP 5.04) , natomiast w XAMPP 1.8 (Apache2.4, PHP 5.47) nie rozpoznaje zinterpretowanej nazwy zmiennej opcja_29 uzyskanej z elementu checkbox formularza wyswietlając na ekranie: Array ( [opcja_29] => on ) opcja_29 : Notice: Undefined variable: opcja_29 in C:\xampp-portable\htdocs\4-00.php on line 12 A oto kod "4-00.php"
|
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
A nie ma czasem wyłączonej opcji register_globals w php.ini?
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 16 Pomógł: 0 Dołączył: 20.10.2012 Ostrzeżenie: (0%) ![]() ![]() |
Zgadza się , ale obecnie w PHP nie stosuje się zmiennych globalnych
i tutaj w moim skrypcie także nie występują - bo nie są do niczego potrzebne. |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
A w jaki sposób odczytujesz zmienną z checkboxa, bo ja widzę, że nie pobierasz go z tablicy $_GET?
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 16 Pomógł: 0 Dołączył: 20.10.2012 Ostrzeżenie: (0%) ![]() ![]() |
Zmienna z checkboxa to "opcja_$row_z[0]"
i tutaj jest podstawiana do $ tmp
Po zatwierdzeniu formularza dostaję URL postaci: http://localhost:1080/4-00.php?opcja_29=on i chcę miec wyswietlone wg skryptu opcja_29 : on a mi wyswietla tylko opcja_29 : czyli - bez "on" W starszych wersjach PHP działa to OKEY ! |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 1 240 Pomógł: 278 Dołączył: 11.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 16 Pomógł: 0 Dołączył: 20.10.2012 Ostrzeżenie: (0%) ![]() ![]() |
W tych miejscach
Muszę nadmienić ze ogólnie mamy tu zmienną o nazwie nieokreślonej, stąd niemożność pobrania jej z $GET bo nie znamy nazwy klucza ani jego pozycji gdyż z innej czesci skryptu są dodawane inne parametry. $row_z[0]=29; przyjęto tu dla uproszczenia jako wartość chwilową żeby nie gmatwać. |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 16 Pomógł: 0 Dołączył: 20.10.2012 Ostrzeżenie: (0%) ![]() ![]() |
To zbyt trywialne!
Niestety nie zrozumiałeś istoty tematu, która że nazwa zmiennej postaci "opcja__XX" jest NIEZNANA (gdzieś generowana dynamicznie, XX=457, 29, 88 ...) i tu dla uproszczenia przyjąłem konkretną nazwę ( a więc znaną) by przetestować działanie funkcji klamry ${"..."} która w nowym PHP teraz nie działa |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 292 Pomógł: 89 Dołączył: 27.12.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Cytat Zgadza się , ale obecnie w PHP nie stosuje się zmiennych globalnych i tutaj w moim skrypcie także nie występują - bo nie są do niczego potrzebne. Zmienne globalne okazjonalnie się stosuje (e.g. Wordpress), a koledze bardziej chodziło o to, że prawdopodobnie na poprzednim serwerze było włączone register_globals i dlatego to działało. Raczej nie ma to związku, że teraz Ci nie działa na "nowym PHP". Po odebraniu formularza dodaj to: to powinno zaimitować w pewnym sensie register_globals tylko dla tego konkretnego skryptu. Z tym że z tą funkcją trzeba raczej ostrożnie, to raz, a dwa, że jeśli musisz się uciekać do tego typu zabiegów, to raczej bym przemyślał logikę tego skryptu, może da się inaczej. |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 1 240 Pomógł: 278 Dołączył: 11.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
W tych miejscach
Muszę nadmienić ze ogólnie mamy tu zmienną o nazwie nieokreślonej, stąd niemożność pobrania jej z $GET bo nie znamy nazwy klucza ani jego pozycji gdyż z innej czesci skryptu są dodawane inne parametry. $row_z[0]=29; przyjęto tu dla uproszczenia jako wartość chwilową żeby nie gmatwać. Zdaję sobie sprawę z tego, że to zmienna nie określona aczkolwiek nadal nie widzę abyś w którymś miejscu tworzył zmienną $opcja_XXX (którą to chcesz wyświetlić w lini 12. Jak chcesz wyświetlić zawartość $_GET['opcja_XXX'] to wyświetl $temp bo do niej przypisujesz wartość GET. Do $row_z[0] przypisujesz 29 - nie ma to nic wspólnego ze zmienną $opcja_29. Od kiedy to PHP sam konwertuje tablicę $_GET na zmienne? Skoro masz pole o nazwie opcja_29 nie oznacza to, że PHP stworzy zmienną $opcja_29 po wysłaniu GET. Chyba, że czegoś nie zauważyłem (IMG:style_emoticons/default/wink.gif) PS. A skoro nie wiesz jakie dane będą przesyłane do GET to czemu stworzysz sesji która będzie przechowywała ID opcji? Wtedy będziesz wiedział jakie parametry GET wyświetlić. Ten post edytował markuz 2.04.2014, 10:25:11 |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 16 Pomógł: 0 Dołączył: 20.10.2012 Ostrzeżenie: (0%) ![]() ![]() |
(1) Co do zmiennych globalnych, to były TAKŻE one wyłączone w INI (register_globals=off )
w WAMPIE gdzie skrypt pięknie hulał tylko była nieco mniejsza wersja PHP5.04. (2)Jesli chodzi o $ temp to rzeczywiscie mogę wyświetlić echo $temp z tym że $temp nie jest już nazwą unikalną. Sprawa jest taka ze checkboxów mogę miec dowolną ilość , tyle ile wyrzuci mi wynik z bazy danych, poszczególne checkboxy nazywane są jako opcja_XX gdzie XX jest nieznane w momencie pisania skryptu. (3) Muszę przyznać że zrobiłem kiedyś wersję całkowicie tablicową, to jest zamiast zmiennych łańcuchowych typu opcja_$var dawałem $opcja[var] [ind] , no i oczywiście zastowałem tablice sesyjne i wsjo DZIAŁAŁO. Myślałem ze zapomocą stringów też się da, ale nowy PHP (powyżej 5.4.4) to blokuje, gdyż poprzednio interpreter widział przetworzone pole input jako zmienną. Ten post edytował wpm834 2.04.2014, 11:01:52 |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 6 806 Pomógł: 1828 Dołączył: 11.03.2014 Ostrzeżenie: (0%) ![]() ![]() |
(3) Muszę przyznać że zrobiłem kiedyś wersję całkowicie tablicową, to jest zamiast zmiennych łańcuchowych typu opcja_$var dawałem $opcja[var] [ind] , no i oczywiście zastowałem tablice sesyjne i wsjo DZIAŁAŁO. To co stoi na przeszkodzie teraz? A jeśli musisz zostać przy nazewnictwie "opcja_XX", to przy odbieraniu danych przeleć w pętli tablicę $_GET:
i badaj $name pod kątem początkowego stringu "opcja_", jeśli taką ma nazwę, to wytnij resztę, rzutuj na int i będziesz mieć id opcji. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.08.2025 - 18:15 |