Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Zmienna nazwa zmiennej
Forum PHP.pl > Forum > Przedszkole
MalyKazio
Witam,

Nie jestem w stanie poradzić sobie sam z moim problem. Przestudiowałem manual tutaj ale niestety nie ruszyłem z miejsca. Chodzi mi o taką rzecz:
Pobieram dane z bazy danych.
  1. <?php
  2. $query = "SELECT * FROM tabela ".$zapytanie;
  3. $wynik = mysql_query($query);
  4. $z['znaleziono']=mysql_num_rows($wynik);
  5. ?>


I teraz chcę to wyświetlić. Problem w tym, że w zależności od ilości zwróconych rekordów chcę mieć albo zwykłą tablicę, w przypadku znalezienia jednego rekordu, albo tablicę numeryczną. Kod wygląda w skrócie tak:

  1. <?php
  2. while($row = mysql_fetch_array($wynik)) {
  3.   if($h['znaleziono']>1) {
  4.     // tutaj coś żeby wyświetlała się poprawna nazwa zmiennej.
  5.   }
  6.        $h['nr']=$row['nr'];
  7.        $h['organizacja']=$row['organizacja'];
  8. ?>

Powyższy kod jest ok, jeśli mam 1 rekord znaleziony. Jeśli jednak jest więcej rekordów to chciałbym zamiast $h mieć $h[$row['nr]]['nr], $h[$row['nr]]['organizacja'] itd. Ja zrobić żeby zastąpić to $h - w przypadku wystąpienia więcej niż jednego rekordu $h[$row['nr']]. Wiem, że mogę zrobić oddzielnie przypisane wartości jeśli znaleziono 1 rekord i oddzielnie jeśli więcej ale tych pól jest naprawdę sporo i nie ma sensu dublować kodu. Próbowałem na różne sposoby:
  1. <?php
  2. $w=$row['nr];
  3.    $h{$w}['nr']=$row['nr];
  4. ?>
i inne ale bez skutku.
zulus
Hmmm pobrałeś już ile masz wierszy wyniku i teraz np:
  1. <?php
  2. $data = array();
  3. if($z['znaleziono'] > 1) {
  4.  while($data = mysql_fetch_assoc($wynik)) {
  5.    $return[$data['nr']] = $data;
  6.  }
  7. } else {
  8.  $return = mysql_fetch_assoc($wynik);
  9. }
  10. ?>


No a teraz kilka spraw:
1. "Normalna" tablica to w tablica indeksowana numerami (w większości języków programowania).
2. Zainteresuj się lepiej pdo, albo chociaż mysqli (dla MySQL >=4.1)
MalyKazio
Nie za bardzo tak mogę zrobić. Po pierwsze nie wszystkie zwracane w tablicy wartości odpowiadają tym z tabeli w bazie danych, np:
$h['nazwa']=przygotujtekst($row['nazwa);
albo
$h['costam']=$row['costam']*2 itp, itd.
dlatego nie mogę wykorzystać czegoś w rodzaju:
$return[$data['nr']] = $data;

Dlatego potrzebuję takiego cuda, które zwróci mi tablicę w postaci:
$h['nazwa']=przygotujtekst($row['nazwa']) - i inne pola podobnie - w przypadku gdy jest tylko jeden pobrany rekord.
Zaś w postaci:
$h[$row['nr]]['nazwa']=przygotujtekst($row['nazwa']) - jeśli pobranych rekordów będzie więcej.
SirZooro
  1. <?php
  2. $data = array();
  3. if($z['znaleziono'] > 1)
  4. {
  5.  while($data = mysql_fetch_assoc($wynik))
  6.  {
  7.    $dane2['a'] = $dane['a'];
  8.    $dane2['b'] = $dane['b'] + 1;
  9.    $dane2['c'] = $dane['c'] / 12;
  10.    $h[] = $dane2;
  11.  }
  12. }
  13. else
  14. {
  15.  $dane = mysql_fetch_assoc($wynik);
  16.  $h['a'] = $dane['a'];
  17.  $h['b'] = $dane['b'] + 1;
  18.  $h['c'] = $dane['c'] / 12;
  19. }
  20. ?>
MalyKazio
Oczywiście, tak można zrobić. Tylko przy 50 polach kod trochę się rozstrasta a przy zastosowaniu zmiennej zmiennej, której nie udaje mi się stworzyć tylko raz bym musiał to wpisywać a zatem kod byłby o połowę któtszy.
nithajasz
Nie wiem co kombinujesz ale może to Ci pomoże:

  1. <?php
  2. $h = array();
  3. if($z['znaleziono'] > 1)
  4. {
  5.  while($data = mysql_fetch_assoc($wynik))
  6.  {
  7.      $h[$row['id']] = $data;
  8.  }
  9. }
  10. else
  11. {
  12.  $dane = mysql_fetch_assoc($wynik);
  13.  $h[] = $dane;
  14. }
  15. ?>


Po krótce $row['id'] reprezentuje Ci unikalny numer rekordu (więc nie powinien się powtarzać).
W przypadku gdy będzie jeden rekord znaleziony to zwróci Ci tablice w postaci:
$h[0]['nr'] , $h[0]['organizacja'] itd...
Natomiast gdy znajdzie kilka rekordów to zwróci Ci tablicę w postaci:
$h[nr_id]['organizacja'], $h[nr_id]['nr'] gdzie nr_id jest to ten klucz jaki wpisałeś tworząc tablicę czyli $row['id'].

Co ciekawsze jeśli nie będzie istniało $h[0] znaczy, że znalazło więcej wartości bo numery id masz przydzielane od 1 w góre.

To chyba pomoże.
MalyKazio
Wszystko jasne, tylko że w przypadku gdy jest jeden rekord w wynik ma być $h['nr'], $h[''organizacja'], a gdy jest więcej ma być $h['nr']['nr'], $h['nr']['organizacja'] itd. Nie wiem jak dodać ten jeden dodatkowy indeks w przypadku gdy jest więcej rekordów. Kombinuję ze zmiennymi nazwami zmiennych, tak żeby w przypadku kilku rekordów zamiast $h podstawiało mi $h['nr'] ale mi nie wychodzi.
sowiq
To ja Ci powiem coś, o czym (wydaje mi się) nie wiesz.

$h - zmienna i nazwie 'h'
$h['dupa'] - zmienna typu tablicowego o nazwie 'h'

To, co Ty napisałeś, to nie zmiana nazwy zmiennej, ale jej typu.

Wyżej masz podane dobre przykłady. Wystarczy trochę wyobraźni i dobrych chęci. Argument o 50 polach mnie nie przekonuje - od tego są pętle. Zresztą jak zrobisz to w inny sposób to również musisz napisać które pole z tych 50 mnożysz przez 18, a które traktujesz funkcją przygotuj(), więc na jedno wychodzi.

Bez urazy, ale tak btw - jak się nie zaplanuje pisana aplikacji przed jej pisaniem, to później się kombinuje tak jak Ty teraz.
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.