Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Dynamiczne określania nazwy zmiennych w skrypcie zawierającym formularz w nowej wersji PHP
Forum PHP.pl > Forum > Przedszkole
wpm834
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>
trueblue
A nie ma czasem wyłączonej opcji register_globals w php.ini?
wpm834
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.
trueblue
A w jaki sposób odczytujesz zmienną z checkboxa, bo ja widzę, że nie pobierasz go z tablicy $_GET?
wpm834
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 !

markuz
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]"};
wpm834
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ć.
trueblue
Proponuję Ci dodać do skryptu:
  1. echo $_GET['opcja_29'];

uruchomić skrypt, zaznaczyć checkbox, zatwierdzić formularz i zobaczyć co dostaniesz.
wpm834
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
vonski
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.
markuz
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 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ć.
wpm834
(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ą.
trueblue
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.
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.