Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]eval SQL i tablica
Forum PHP.pl > Forum > Przedszkole
phpuser88
1. Do tabeli SQL zapisuje "prawdziwe" zmienne przypisane do tablicy w takiej postaci:
  1. $NazwaZmiennej1=$Q[1]#$NazwaZmiennej2=$Q[2]#$NazwaZmiennej3=$Q[3]#

2. Następnie pobieram i obrabiam za pomocą explode w taki sposób:
  1. $X = explode("#", $row['cfg2']);

Dzięki czemu dostaje prawidłową (prawie!)funkcjonalną tablice gdzie $NazwaZmiennej1 = Q[1] itd.
Wyświetla się to jako tekst, jednak chce nadać temu wartość PHP za pomocą funkcji eval(); ale siedzę nad tym dłuższą chwile testując różnorakie pomysły i nie idzie po mojej myśli...

Cały kod wygląda tak:
  1. $X = explode("#", $row['cfg2']);//pobieram wzór tablicy przypisany do zmiennej
  2.  
  3. foreach ($X as $key => $value) {//czyszcze puste wyniki
  4. if (empty($value)) {
  5. unset($X[$key]);
  6. }
  7. }
  8. $ILE = COUNT($X);//licze ile wyników
  9.  
  10. $Q = explode("#", $row['historia']);//pobieram inne dane, które chce połączyć z nazwą zmiennych
  11. for ($i=0; $i<=$ILE; $i++){//wrzucam w pętle
  12. $wtf = $X[$i].'<br/>';//przypisuje wartość aby czytelnie wyświelić z <br/>
  13. #od tego miejsca poniżej jest problem, bo na końcu dane prawidłowo wyświetlają się z tablicy Q[], ale nie są przypisywane do unikalnej nazwy zmiennej... jak to zmienićquestionmark.gif
  14. eval("\$wynik= \"$wtf\";"); //TU JEST PROBLEM... niby nadaje "funkcjonalność" zmiennej, ale nie tak jak tego oczekuje...
  15. //wyniki są wyświetlane, ale niestety tylko z Q[] i to z "= "
  16. echo $wynik;
  17.  
  18. # WYNIK:
  19. = 1
  20. = 2
  21. = 3
  22. }


Zamiast wyniku =1,2,3 chcę osiągnąć przypisanie tego wyniku do zmiennej tj.
$NazwaZmiennej1 = $Q[1] ($NazwaZmiennej1 = 1)
$NazwaZmiennej2 = $Q[2] ($NazwaZmiennej2 = 2)
$NazwaZmiennej3 = $Q[3] ($NazwaZmiennej3 = 3)
Aby następnie te zmienne wyświetlić poza pętlą for();

Czy to jest w ogóle możliwe??
trueblue
A nie lepiej stworzyć tabelę dwukolumnową (nazwa, wartosc) i przechowywać odrębnie każdą zmienną - jej nazwę i wartość?
Potem takie dane możesz zaczytać do tabeli w PHP (indeksy stanowią nazwy Twoich zmiennych).

Ale jeśli tak bardzo chcesz:
  1. ${'nazwa_zmiennej'}=wartosc;
phpuser88
No właśnie nie lepiej, bo to jest wzór za pomocą którego zczytuje zapisaną historię danych z formularza i te dane się różnią, a tworzę tzw. panel admina gdzie chce mieć podgląd i mogę sobie pozwolić na tego typu zagmatwany kod. Ułatwi mi to pracę gdy np. dodam nowego inputa w formularzu, bo będę mógł kolejną pozycję (tj. nowego inputa) dopisać i później zczytywać z bazy, zamiast zapisywać wszystko ręcznie w kilku miejscach w pliku. Nie wiem czy zrozumiale to opisałem, ale uważam to za dobry pomysł^^

Chyba nie kumam Twojego rozwiązania, bo: eval(${'wynik'}=$wtf); nie śmiga, wywala: Parse error: syntax error, unexpected end of file in .. eval()'d code on line 1

EDIT:
Teraz doczytałem o klamrach. Nazwy zmiennych są unikatowe i znacząco różnią się od siebie więc to rozwiązanie niestety nie przejdzie. Nie ma innego sposobu?
Salvation
Dobra, to teraz ja zadam pytanie.
Dlaczego danych z GET-a nie obrobisz za pomocą parse_url() + małej pętli i nie wrzucisz tego sobie fizycznie do tablicy gdzie przed zapisaniem do bazy wsadzisz do JSON-a?

Iterować po tablicy jest łatwiej niż sprawdzać zmienne czy istnieją, szczególnie, że nie wiesz do końca jakie one będą, bo nie masz petternu dla nich z tego co rozumiem.
phpuser88
Dane są z POST. Właśnie doczytałem o parse_url() i to bardzo fajne rozwiązanie, ale nie działa na POST i raczej nie o to chodzi.
Chciałbym tylko nadać "funkcjonalność" zmiennym, które są wczytane z bazy.
trueblue
Cytat(phpuser88 @ 27.04.2022, 20:13:31 ) *
Teraz doczytałem o klamrach. Nazwy zmiennych są unikatowe i znacząco różnią się od siebie więc to rozwiązanie niestety nie przejdzie.

To rozwiązanie zakłada właśnie unikalność nazw zmiennych. Tu żadnego eval się nie stosuje. Podałem Ci cały kod niezbędny do utworzenie zmiennej.
phpuser88
Cytat(Salvation @ 27.04.2022, 20:32:05 ) *
Iterować po tablicy jest łatwiej niż sprawdzać zmienne czy istnieją, szczególnie, że nie wiesz do końca jakie one będą, bo nie masz petternu dla nich z tego co rozumiem.
W bazie mam zapisane w dwóch kolumnach zmienne, które są przygotowane specjalnie pod tablice w taki sposób: #dane#dane2#dane3...

Następnie przepuszczam przez explode i przypisuje zawartość danych do z góry określonych zmiennych (mam pattern), tj.
  1. $Q = explode("#", $row['historia']);
  2. $NazwaZmiennej1 = $Q[1];
  3. $NazwaZmiennej2 = $Q[2];
  4. $NazwaZmiennej4 = $Q[3]; itd.

Unikalne zmienne później wykorzystuje w kilku miejscach, aby wyświetlić ich wartość. Jednak za każdym razem gdy dodam coś nowego, muszę ręcznie dopisywać w pliku, w kilku miejscach z zachowaniem kolejności kolejne $NazwaZmiennejX = $Q[X].
Chciałbym ten proces zautomatyzować przez wpakowanie całego patternu do bazy, a następnie gdy dodam coś nowego, to za pomocą prostego formularza zrobię update patternu w bazie i później w pliku wszystko zostanie zaktualizowane w kilku miejscach, bo będzie z czytywane z bazy. Problem polega na tym, że gdy wrzucę pattern do bazy i chce zrobić z niego funkcjonalne zmienne za pomocą eval(); to zamiast przypisania zawartości $Q[x] do $UniqZmiennejX, wyświetla się tylko wynik $Q[x], a unikalne zmienne pozostają nie aktywne i nie wiem jak zrobić, aby PHP uruchomił taki kod z bazy: $NazwaZmiennej1 = $Q[1];$NazwaZmiennej2 = $Q[2]; itd. Po uruchomieniu takiego kodu reszta będzie miała właściwą zawartość i jeśli będę chciał dodać coś nowego, to zrobię update bazy w jednym miejscu z kolejnym $NazwaZmiennejX = $Q[X];
@trueblue, tyle, że zmienna w klamrze nie rozwiązuje tego problemu, albo totalnie na maxa nie ogarniam w co szczerze wątpię. Raczej problem leży ze zrozumiałym opisem po mojej stronie, albo z założeniem, że jest możliwe do wykonania wczytanie funkcjonalnego kodu PHP z bazy w takiej postaci tuż pod $Q = explode("#", $row['historia']);
  1. $NazwaZmiennej1 = $Q[1];
  2. $NazwaZmiennej2 = $Q[2];
  3. $NazwaZmiennej4 = $Q[3]; itd.
trueblue
  1. $Q = explode("#", $row['historia']);
  2. foreach($Q as $index=>$value){
  3. ${'NazwaZmiennej'.($index+1)}=$value;
  4. }
phpuser88
Wybacz za późną odpowiedź. Próbowałem z klamrami, ale nie działają. Dzięki za próbę pomocy z rozwiązaniem raczej nie możliwego problemu.
Stworzyłem na nowo kompletny przykład, przedstawia on połowicze rozwiązanie, bo wyświetla prawidłowe wartości, ale bez "zmiennych" na których bazowałem w wielu miejscach w pliku porównując i analizując dane. Generalnie cały przykład jest daremny, bo mogę to zastąpić prostym i bezpośrednim odpytaniem `dane` i otrzymam ten sam wynik. I tak to będzie chyba bardziej komfortowe niż ręczne dopisywanie w kilkunastu miejscach kolejnego akapitu z $UniqNazwaZmiennej = $Q[+1];
  1. UPDATE `form` SET `pattern` = '$raz=$Q[1]#$dwa=$Q[2]#$trzy=$Q[3]#' WHERE `form`.`id` = 3;
  2. UPDATE `form` SET `dane` = '#dane raz#dane dwa#dane trzy' WHERE `form`.`id` = 3;
  3.  
  4. $sql="SELECT * FROM `form` WHERE id=3 LIMIT 1";
  5. if ($result = mysqli_query($con, $sql)) { while($row = mysqli_fetch_assoc($result)) {
  6.  
  7. $Q = explode("#", $row['dane']);//pobieram inne dane, które chce połączyć z nazwą zmiennych
  8. $db_pattern = explode("#", $row['pattern']);//pobieram wzór tablicy przypisany do zmiennej
  9. foreach ($db_pattern as $key => $value) {//czyszcze puste wyniki
  10. if (empty($value)) {
  11. unset($db_pattern[$key]);
  12. }
  13. }
  14. $ILE = COUNT($db_pattern);//licze ile wyników
  15.  
  16. for ($i=0; $i<=$ILE; $i++){//wrzucam w pętle
  17. eval("\$wynik[]= \"$db_pattern[$i]\";"); //Array ( [0] => =dane raz [1] => =dane dwa [2] => =dane trzy [3] => )
  18. $wynik = str_replace("=","",$wynik);//Array ( [0] => dane raz [1] => dane dwa [2] => dane trzy [3] => )
  19. }
  20.  
  21. echo $wynik[1];//dane dwa
  22. echo $wynik[2];//dane trzy
  23. }}


edit:
Właśnie sobie uświadomiłem, że jeśli zmienię strukturę danych w bazie i wstawie w eval() kolejną tabele z bazy jako "nowa zmienna", to powinienem otrzymać satysfakcjonujący wynik laugh.gif
Może ogarnia ktoś poprawną składnie eval? bo nie mogę uzyskać tego efektu, a chodzi mi o to:
  1. UPDATE `form` SET `pattern` = '$raz#$dwa#$trzy#' WHERE `form`.`id` = 3;
  2. UPDATE `form` SET `dane` = '#dane raz#dane dwa#dane trzy' WHERE `form`.`id` = 3;
  3.  
  4. $Q = explode("#", $row['dane']);//pobieram inne dane, które chce połączyć z nazwą zmiennych
  5. $db_pattern = explode("#", $row['pattern']);//pobieram wzór tablicy przypisany do zmiennej
  6.  
  7. for ($i=0; $i<=$ILE; $i++){//wrzucam w pętle
  8. eval("\$Q[$i]= \"$db_pattern[$i]\";"); //teoretycznie powinno to być możliwe, ale męczę się z prawidłową składnią :/
  9. }
trueblue
Za dużo slashy i cudzysłowów. Jeśli już, to raczej:
  1. eval("$Q[$i]= $db_pattern[$i];");



Nie wiem też czy na pewno dobrałeś poprawną kolejność, według mnie powinno być przypisanie do zmiennej z $db_pattern wartość z $Q, a nie odwrotnie.

Może wykorzystasz:
  1. $db_pattern=explode('#','$raz#$dwa#$trzy#');
  2. $Q=explode('#','#dane raz#dane dwa#dane trzy');
  3.  
  4. foreach($db_pattern as $index=>$variable){
  5. if(!empty($variable) && isset($Q[$index])){
  6. ${str_replace('$','',$variable)}=$Q[$index];
  7. }
  8. }
  9. print_r(get_defined_vars());
phpuser88
BOSKO! biggrin.gif próbowałem z klamrami w różnej konfiguracji, ale nigdy nie dały żadnego wyniku więc wróciłem do nieszczęsnego eval'a.
Przy eval próbowałem wspomnianą konfiguracje i zwraca błąd składni, ale to już nie istotne. tongue.gif

Dzięki wielkie! i dzięki za poznanie mnie z get_defined_vars(); bo to świetny zbiór informacji w jednym miejscu^^
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.