Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Pobieranie danych z tebeli
Forum PHP.pl > Forum > Przedszkole
mefistofeles
Witam,

W tabeli 'kolory' (id_koloru, nazwa) przechowuje nazwy kolorów.
Chciałbym je wszystkie pobrać do zmiennej:

  1. <?php
  2. $wszystkie[] = mysql_fetch_row(mysql_query("SELECT `nazwa` FROM `kolory` WHERE id_koloru > 0"));
  3. //echo $wszystkie[0];
  4. echo '<pre>';
  5.    print_r($wszystkie);
  6.    echo '</pre>';
  7. ?>


W $wszystkie zapisuje mi się tylko jeden, pierwszy kolor (id = 1)
Jak pobrać wszystkie nazwy do tej zmiennej (tablicy) ?
slightyboy
Cytat(mefistofeles @ 23.06.2009, 03:20:07 ) *
Witam,

W tabeli 'kolory' (id_koloru, nazwa) przechowuje nazwy kolorów.
Chciałbym je wszystkie pobrać do zmiennej:

  1. <?php
  2. $wszystkie[] = mysql_fetch_row(mysql_query("SELECT `nazwa` FROM `kolory` WHERE id_koloru > 0"));
  3. //echo $wszystkie[0];
  4. echo '<pre>';
  5.    print_r($wszystkie);
  6.    echo '</pre>';
  7. ?>


W $wszystkie zapisuje mi się tylko jeden, pierwszy kolor (id = 1)
Jak pobrać wszystkie nazwy do tej zmiennej (tablicy) ?
Skorzystaj z funkcji mysql_fetch_array" title="Zobacz w manualu PHP" target="_manual lub mysql_fetch_assoc" title="Zobacz w manualu PHP" target="_manual. Funkcja, z której skorzystałeś wykorzystywana jest w pętlach (jako swojego rodzaju kursor), przy jej użyciu również można osiągnąć pożądany przez Ciebie efekt:

  1. <?php
  2. $wszystkie = Array();
  3.  while ($row = mysql_fetch_row(mysql_query(...))) {
  4.    array_push($wszystkie, $row);
  5.  }
  6. ?>


Pytanie tylko po co to robić, skoro istnieją funkcje, które przedstawiłem na początku. winksmiley.jpg

PS. Zapomniałem o jednym. Nie rozumiem po co w zapytaniu warunek "id > 0", jeśli pole ID jest zadeklarowane jako indeks główny oraz posiada atrybut auto_increment, to tego typu warunek jest zbędny (pomijając fakt, iż tego typu warunek na polu identyfikatora i tak jest niepotrzebny). smile.gif
mefistofeles
Rzeczywiście, ten warunek jest zbyteczny smile.gif
W każdym razie jak robię tak:

  1. <?php
  2. $wszystkie = Array();
  3. while ($row = mysql_fetch_row(mysql_query("SELECT `nazwa` FROM `kolory`"))) {
  4.   array_push($wszystkie, $row);
  5.   print_r ($wszystkie);
  6.  
  7. }
  8. ?>



to skrypt się zapętla i drukuje ciągle jedno i to samo aż w końcu firefox mi się zawiesza ...
Co robie źle ?

Tak w ogóle to wcześniej (bez pętli która podałeś) próbowałem też z fetch_array i fetch_assoc, ale opróćz sposobu prezentacji
i tak zawsze dostawałem tylko 1 wiersz:


  1. <?php
  2. $wszystkie[] = mysql_fetch_array(mysql_query("SELECT `nazwa` FROM `kolory`"));
  3. echo '<pre>';
  4.   print_r($wszystkie);
  5.   echo '</pre>';
  6. ?>
zimekk
a sprobuj tak:
  1. <?php
  2. $wszystkie = array();
  3. $zapytanie = mysql_query("SELECT `nazwa` FROM `kolory`");
  4. while($tabela = mysql_fetch_row($zapytanie))
  5. {
  6. ...
  7. }
  8. ?>
behu
  1. <?php
  2. $wszystkie = array();
  3. while ($row = mysql_fetch_assoc(mysql_query("SELECT * FROM `kolory`"))) {
  4.   $wszystkie[$row['id_koloru']] = $row['nazwa'];
  5. }
  6. ?>



albo
  1. <?php
  2. $wszystkie = array();
  3. while ($row = mysql_fetch_assoc(mysql_query("SELECT * FROM `kolory`"))) {
  4.   $wszystkie[] = $row['nazwa'];
  5. }
  6. ?>
slightyboy
Kurcze faktycznie, pomieszało mi się całkowicie (pewnie ze względu na porę oraz fakt, iż od dłuższego już czasu nie korzystam z gołego mysql_*). Tak to powinno wyglądać.

  1. <?php
  2. $wszystkie = Array();
  3.  
  4. while( $row = mysql_fetch_row( mysql_query(...) ){
  5.  array_push($wszystkie, $row);
  6. }
  7.  
  8. var_dump($wszystkie);
  9. ?>


Co do poprzedniego mojego posta, wybacz - każda z tych funkcji zwraca kursor. winksmiley.jpg
mefistofeles
Działa tylko sposó ktory zaproponował Zimekk:


  1. <?php
  2. $wszystkie = array();
  3. $zapytanie = mysql_query("SELECT `nazwa` FROM `kolory`");
  4. while($tabela = mysql_fetch_row($zapytanie))
  5. {
  6. array_push($wszystkie, $tabela);
  7. }
  8. print_r ($wszystkie);
  9. ?>


Pozostałe albo powoduja przekroczenie bufora pamięci (w tabeli są tylko 3 rekordy) albo się zapętlają
i strona się nie ładuje.



Jeszcze jedna rzecz.
Poszerzyłem ten skrypt o formularz, który generuje listę wszystkich kolorów (przy każdym jest checkbox)

  1. <?php
  2. $wszystkie = array();
  3. $zapytanie = mysql_query("SELECT `nazwa` FROM `kolory`");
  4. while($tabela = mysql_fetch_row($zapytanie))
  5. {
  6. array_push($wszystkie, $tabela);
  7. }
  8.  
  9.  
  10. $number = count($wszystkie);
  11.  
  12.  
  13. echo '<form method="post" action="">';
  14.  
  15. for ($i = 0; $i < $number; $i++)
  16. {
  17.    echo '<Input type="checkbox" name="'.$wszystkie[$i][0].'" value="' .$i. '">' . $wszystkie[$i][0];
  18. }
  19. echo '<input type="submit" value="OK">';
  20. ?>



Powiedzcie jako można by zrobić, że gdy użytkownik zaznaczy checkbox przy danym kolorze i kliknie ok, to wtedy w tabeli 'uzytkownicy' w polu
kolor zapisze się id tegoż właśnie koloru ? (foreach?)
Derw
Po pierwsze lepszym rozwiazaniem było by chyba zamiast chexbox użyć radio ( chyba że użytkownik może wybrać kilka kolorów?) 

Nie wiem czy dobrze myślę ale ja bym zrobił to tak:

  1. <?php
  2. if(!empty($_POST['Kolor'])){
  3.  
  4. //i tutaj wykonujesz update do tabeli uzytkwnicy w zmiennej $_POST['Kolor'] będzie id  
  5. mysql_query('UPDATE Uzytkownicy SET kolor ="'.$_POST['Kolor'].'"
  6. WHERE login="'. $login.'"');
  7.  
  8. }
  9.  
  10. echo '<form method="post" action="">';
  11.  
  12. for ($i = 0; $i < $number; $i++)
  13. {
  14.    echo '<Input type="radio" name="Kolor" value="' .$i. '">' . $wszystkie[$i][0];
  15. }
  16. echo '<input type="hidden" value="'.$login.'">';
  17. echo '<input type="submit" value="OK">';
  18. ?>


zakładam że action będzie się odwoływać do tego samego pliku w którym znajduje się formularz, jeżeli nie to if trzeba będzie dodać do tego pliku na który wskazuje action.
mefistofeles
Oczywiście, że o radio chodziłio :]

Wielkie dzięki za pomoc !
phpion
Cytat(slightyboy @ 23.06.2009, 03:27:56 ) *
Skorzystaj z funkcji mysql_fetch_array" title="Zobacz w manualu PHP" target="_manual lub mysql_fetch_assoc" title="Zobacz w manualu PHP" target="_manual. Funkcja, z której skorzystałeś wykorzystywana jest w pętlach (jako swojego rodzaju kursor), przy jej użyciu również można osiągnąć pożądany przez Ciebie efekt:

  1. <?php
  2. $wszystkie = Array();
  3.  while ($row = mysql_fetch_row(mysql_query(...))) {
  4.    array_push($wszystkie, $row);
  5.  }
  6. ?>


Pytanie tylko po co to robić, skoro istnieją funkcje, które przedstawiłem na początku. winksmiley.jpg

Dla ścisłości - siejesz herezję. Sugerujesz, że korzystając z podanych wyżej funkcji można pominąć pętlę? W takim razie doczytaj proszę czym różnią się te funkcje, co zwracają, bo zapewniam Cię, że i w ich przypadku konieczne jest użycie pętli.

PS: poza tym chyba (nie sprawdzałem, ale tak mi się wydaje) Twoja pętla będzie wykonywać się w nieskończoność z racji ciągłego wykonywania zapytania do bazy danych.
slightyboy
Cytat
Dla ścisłości - siejesz herezję. Sugerujesz, że korzystając z podanych wyżej funkcji można pominąć pętlę? W takim razie doczytaj proszę czym różnią się te funkcje, co zwracają, bo zapewniam Cię, że i w ich przypadku konieczne jest użycie pętli.

PS: poza tym chyba (nie sprawdzałem, ale tak mi się wydaje) Twoja pętla będzie wykonywać się w nieskończoność z racji ciągłego wykonywania zapytania do bazy danych.
Pierwszą rzecz wyjaśniłem wcześniej (moja pomyłka). Drugą też miałem wyjaśniać, ale już było późno. smile.gif

Wynik zapytania powinien być przypisany do zmiennej i dopiero później użyty w pętli (godzina 3:00 robi swoje tongue.gif).

PS. Nie nazywałbym tego herezją, a poprostu przemęczeniem. smile.gif
lis3k
Temat stary, ale kolega się uczy z tego forum i się na niego natknął, a to może oznaczać że i inni się natykają. Tak więc troszkę wyjaśnień.
Plan jest taki, że mysql_query łączy się z bazą, ściąga wszystkie pasujące rekordy i ustawia tak zwany kursor (czyli po prostu wybiera sobie z listy jeden rekord który aktualnie "obrabia") na sam początek.
wywoływana kilka razy zawsze (albo i nie, ale w przykładzie podanym w wątku zawsze) zwróci to samo.

zadaniem funkcji mysql_fetch_***** jest pobrać "aktualny" rekord ze źródła wszystkich rekordów jakie mysql_query wypluło, i ustawić w tej liście ("źródle") kursor na następny, tak żeby przy następnym wywołaniu funkcji mysql_fetch_***** mogła pobrać kolejny rekord i znowu przygotować sobie następny. Kiedy się skończą, zwraca false.

Jeśli pętla wygląda tak: while($row=mysql_fetch_array(mysql_query(...)))
to mysql_query zwróci listę wszystkich rekordów z kursorem na pierwszym, mysql_fetch_array pobierze ten pierwszy rekord, zwróci i ustawi kursor na liście zwróconej przez mysql_query, na drugi. W kolejnym przebiegu znowu wykona się mysql_query (bo jej wynik nie był składowany w żadnej zmiennej), i znowu zwróci listę wszystkich rekordów, z kursorem ZNOWU ustawionym na pierwszy, który mysql_fetch_array znowu ustawi na drugi, ale jakie to ma znaczenie skoro za chwilę dostanie znowu świeżą listę z kursorem znowu ustawionym na pierwszy.
Tyle "znowu" sugeruje pętlę nieskończoną.
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.