Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Dynamiczne określania nazwy zmiennych w skrypcie zawierającym formularz w nowej wersji PHP
wpm834
post
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"
  1. <HTML><HEAD><TITLE>Formularz</TITLE>
  2. <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-2">
  3. </HEAD><BODY> <?php $row_z[0]=29;
  4. $tmp = "opcja_$row_z[0]";
  5.  
  6. if(isset($_GET[$tmp]))
  7. { $temp = $_GET[$tmp];}else{ $temp = ""; }
  8. print_r($_GET);
  9.  
  10. if ($temp) {
  11. echo"<br> opcja_$row_z[0]"; echo" : ";
  12. echo ${"opcja_$row_z[0]"};
  13. print '<br><A HREF="4-00.php">Powrót do formularza</A>';
  14. } else {
  15. echo "<br> Nie ma wpisanych danych, wywietlamy formularz <br>";
  16.  
  17. print '<FORM ACTION="4-00.php" METHOD=GET>';
  18. // print '<INPUT TYPE="text" NAME="opcja_29">';
  19. print("<input type=checkbox name=\"opcja_$row_z[0]\" >");
  20. print '<INPUT TYPE="submit" VALUE="Wyslij">';
  21. print '</FORM>';
  22. }
  23.  
  24. ?></BODY></HTML>
Go to the top of the page
+Quote Post
trueblue
post
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?
Go to the top of the page
+Quote Post
wpm834
post
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.
Go to the top of the page
+Quote Post
trueblue
post
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?
Go to the top of the page
+Quote Post
wpm834
post
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
  1. $tmp = "opcja_$row_z[0]";
  2.  
  3. if(isset($_GET[$tmp]))
  4. { $temp = $_GET[$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 !

Go to the top of the page
+Quote Post
markuz
post
Post #6





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

Ostrzeżenie: (0%)
-----


A gdzie definiujesz zmienną $opcja_29? Bo nie widzę takiego zapisu w twoim skrypcie a mimo to starasz się ją wyświetlić:
  1. echo ${"opcja_$row_z[0]"};
Go to the top of the page
+Quote Post
wpm834
post
Post #7





Grupa: Zarejestrowani
Postów: 16
Pomógł: 0
Dołączył: 20.10.2012

Ostrzeżenie: (0%)
-----


W tych miejscach
  1. <?php $row_z[0]=29;
  2.  
  3. oraz w linii 19 mamy pole
  4. print("<input type=checkbox name=\"opcja_$row_z[0]\" >");
  5.  
  6. które po zatwierdzeniu formularza jest traktowane przez interpreter PHP jako
  7. ${"opcja_$row_z[0]"} czyli $opcja_29


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ć.
Go to the top of the page
+Quote Post
trueblue
post
Post #8





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Proponuję Ci dodać do skryptu:
  1. echo $_GET['opcja_29'];

uruchomić skrypt, zaznaczyć checkbox, zatwierdzić formularz i zobaczyć co dostaniesz.
Go to the top of the page
+Quote Post
wpm834
post
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
Go to the top of the page
+Quote Post
vonski
post
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:

  1. parse_str($_SERVER['QUERY_STRING']);


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.
Go to the top of the page
+Quote Post
markuz
post
Post #11





Grupa: Zarejestrowani
Postów: 1 240
Pomógł: 278
Dołączył: 11.03.2008

Ostrzeżenie: (0%)
-----


Cytat(wpm834 @ 1.04.2014, 23:33:50 ) *
W tych miejscach
  1. <?php $row_z[0]=29;
  2.  
  3. oraz w linii 19 mamy pole
  4. print("<input type=checkbox name=\"opcja_$row_z[0]\" >");
  5.  
  6. które po zatwierdzeniu formularza jest traktowane przez interpreter PHP jako
  7. ${"opcja_$row_z[0]"} czyli $opcja_29


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
Go to the top of the page
+Quote Post
wpm834
post
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
Go to the top of the page
+Quote Post
trueblue
post
Post #13





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Cytat(wpm834 @ 2.04.2014, 11:59:39 ) *
(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:
  1. foreach($_GET as $name=>$value)

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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 18:15