Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Pętla źle zwraca wartości
Forum PHP.pl > Forum > Przedszkole
wojciechu
Witam,

Przy pomocy pętli chcę pobrać z bazy dane i wstawić je jako kolejne opcje w polu select. Zmienna $ile_d po wykonaniu zapytania do bazy ma wartość 2, więc powinno mi utworzyć 2 pola select...a wyświetla się tylko jedno.

  1. <?php
  2. //wstawianie z bazy
  3. $connection = @mysql_connect('xxx', 'xxx', 'xxx')
  4. or die('Brak połączenia z serwerem MySQL');
  5. $db = @mysql_select_db('xxx', $connection)
  6. or die('Nie mogę połączyć się z bazą danych');
  7.  
  8. $uzupelnij_d = mysql_query("SELECT * FROM dokumenty GROUP BY dokument ORDER BY id ASC") or die(mysql_error());
  9.  
  10. $ile_d = mysql_num_rows($uzupelnij_d);
  11.  
  12. for($i=0;$i<$ile_d;$i++)
  13. {
  14. $kolumna=mysql_fetch_array($uzupelnij_d);
  15.  
  16. echo '<option value="' . $kolumna[0] . '>' . $kolumna[0] . ' (' . $kolumna[4] . ')</option>';
  17.  
  18. }
  19. mysql_free_result($uzupelnij_d);
  20. ?>

muniekw
A spróbuj w pętli for tak:
  1. for($i=0;$i<=$ile_d;$i++)
wojciechu
Oprócz kodu php generującego ten jeden select, mam pod nim dobrze opisywany w html drugi select. I jak zrobię, tak jak opisałeś, to te dwa selecty łączą się w jeden...więc jeszcze gorzej sad.gif
muniekw
Teraz jak robisz to wywołanie:
  1. echo '<option value="' . $kolumna[0] . '>' . $kolumna[0] . ' (' . $kolumna[4] . ')</option>';


To odwołujesz się do jednej konkretnej wartości. Spróbuj uzależnić to od indeksu pętli czyli od $i
prz3kus
Ja proponuje się zapoznać jak można wyświetlać rekordy: http://www.php.net/mysql_fetch_array
b4rt3kk
Bardziej odpowiednia jest tu pętla while, która automatycznie przesuwa wewnętrzny wskaźnik tablicy.

  1. while($kolumna=mysql_fetch_row($uzupelnij_d)) echo '<option value="' . $kolumna[0] . '>' . $kolumna[0] . ' (' . $kolumna[4] . ')</option>';
wojciechu
@b4rt3kk:
while zwraca ten sam wynik, czyli tylko jedną pozycję sad.gif
muniekw
Moim zdaniem najporściej jak będziesz etapami wyświetlał sobie to co Ci zwraca dane zapytanie i powinieneś dojść co jest nie tak.
Spróbuj powyświetlać sobie wartości np:
  1. echo "<pre>";
  2. print_r($kolumna);
  3. echo "</pre>";
b4rt3kk
Cytat(wojciechu @ 28.09.2012, 10:41:16 ) *
@b4rt3kk:
while zwraca ten sam wynik, czyli tylko jedną pozycję sad.gif


Więc sprawdź czy na pewno masz dwa rekordy wynikowe:

  1. $kolumna=mysql_fetch_array($uzupelnij_d);
  2. print_r($kolumna);
wojciechu
@b4rt3kk:
Zrobiłem jak napisałeś - wyszło, że tylko 1 pozycja jest w tabeli.... ale skąd w takim razie 2 pozycje, jeśli w PHPmyadmin wrzucę to samo zapytanie, oraz w $ile_d = mysql_num_rows($uzupelnij_d); questionmark.gif
b4rt3kk
Prawdopodobnie przez grupowanie:

  1. SELECT * FROM dokumenty GROUP BY dokument ORDER BY id ASC


pewnie pole dokument w obu przypadkach jest takie samo? Zmień zapytanie na takie:

  1. SELECT * FROM dokumenty ORDER BY id ASC
wojciechu
No właśnie coś to grupowanie nie działa dobrze. Wg Twojej metody wyświetlą mi się wszystkie wpisy dokumenty, ale część z nich siępowtarza...stąd użyłem polecenia GROUP BY. Jak widać, nie działa ono dobrze, masz jakąs alternatywę, jak wydobyć tylko niepowtarzające się wpisy?
b4rt3kk
Przedstaw mi strukturę tabeli, może należy pogrupować po innym polu? Lub dodać jakieś kolejne pole w tabeli wg którego będziesz grupował? Np.

id | costam | klucz_grupowania
====================
1 | wartosc1 | 1
2 | wartosc2 | 1
3 | wartosc3 | 2
4 | wartosc4 | 1
5 | wartosc5 | 3
6 | wartosc6 | 2
wojciechu
id | dokument | inne_dane_1 | inne_dane_2 | inne_dane_3
----------------------------------------------------------------------
1 | dok1 | bla1 | bla7 | bla13
2 | dok1 | bla1 | bla8 | bla14
3 | dok2 | bla3 | bla9 | bla15
4 | dok3 | bla4 | bla10 | bla16
5 | dok4 | bla5 | bla11 | bla17
6 | dok4 | bla5 | bla12 | bla18

Czyli - chcę pobrać niepowtarzające się wartości dla dokumentu, oraz odpowiadające im inne_dane_1
b4rt3kk
A co chcesz uzyskać? Żeby jak się to wyświetlało w Twoim select?
wojciechu
Chcę żeby wyświetliło się w select:

dok1 | bla1
dok2 | bla3
dok3 | bla4
dok4 | bla5

edit:

użyłem teraz polecenia
  1. SELECT DISTINCT dokument, inne_dane_1 FROM dokumenty ORDER BY id ASC
, w phpmyadmin wszystko ładnie wygląda(2 wiersze widoczne....), ale w php wyrzuca jedną pozycję...
___________


Dlaczego w PHPmyadmin jak zadaję zapytanie SQL:
  1. SELECT DISTINCT dokument, nazwa_dokument FROM tabela ORDER BY id ASC

to wyświetla mi tablicę 2x2, czyli taką jakiej potrzebuję...a jak w php zadam to samo zapytanie:
  1. $uzupelnij_d = mysql_fetch_array(mysql_query("SELECT DISTINCT dokument, nazwa_dokument FROM tabela ORDER BY id ASC")) or die(mysql_error());
  2.  
  3. print_r ($uzupelnij_d);


to już powstaje tablica jednowymiarowa....
  1. Array ( [0] => xxx-xxx [dokument] => xxx-xxx [1] => jakaś nazwa [nazwa_dokument] => jakaś nazwa )


czytałem manuale o fetch_array ale nie mogę znaleźć odpowiedzi, czemu mi nie wypluwa wszystkich wartości...

edit:
nieaktualne - wyjaśnione smile.gif echo i zapętlenie było źle zrobione...
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.