Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Odczyt danych z bazy.
Forum PHP.pl > Forum > PHP
AniaR
Witam,

Majac 2 tebele w bazie:

Kategorie (id, nazwa)
Zdjecia (id, id_kategorii, sciezka)

Chcialabym odczytac dane z tabel by wyswietlaly sie nastepujaco:

JAKAS NAZWA KATEGORII 1
zdjecie1
zdjecie2
..
zdjecieN

JAKAS NAZWA KATEGORII 2
zdjecie1
zdjecie2
..
zdjecieN


......

JAKAS NAZWA KATEGORII N
zdjecie1
zdjecie2
..
zdjecieN



Zrobilam to w ten sposob ze najpierw wyswietlam nazwy wsyztskich kategorii:
JAKAS NAZWA KATEGORII 1
JAKAS NAZWA KATEGORII 2
...
JAKAS NAZWA KATEGORII N

a po nacisnieciu na ktoras z nazw, w adescie url przekazuje zmienna z id tej kategorii i nastepnie pobieram z bazy zdjecia ktore spelniaja warunek: id_kategorii = $id
W ten sposob wyswietlam zdjecia z danej kategorii. Jednak wyswietlam wtedy tylko jedna grupe zdjec z jednej kategorii.

Jednaj mi zalezy by wyswietlic na raz wszytskie zdjecia ktore sa w bazie posegregowane kategoriami, a dodatkowo nad kazda z grup zdjec nazwe kategori do ktorej nalezą.
Czy ktos moze dac mi wskazowke jak ulozyc pytanie badz pytania by wyswietlic dane w taki sposob jaki potrzebuje??
kirex
Możesz zrobić to na 2 sposoby, wyciągając najpierw kategorie i później do nich zdjęcia:

  1. <?php
  2. $kategorieSql = mysql_query('select * from Kategorie order by nazwa asc');
  3.  
  4. while($kategoria = mysql_fetch_assoc($kategorieSql)) {
  5.  
  6.   echo $kategoria['nazwa'] . '<br>';
  7.  
  8.   $zdjeciaSql = mysql_query('select * from Zdjecia where id_kategorii = ' . $kategoria['id']);
  9.   while($zdjecie = mysql_fetch_assoc($zdjeciaSql)) {
  10.      echo $zdjecie['sciezka'] . '<br>';
  11.   }
  12.  
  13. }
  14. ?>


lub ciągnąć wszystko razem i w php sobie rozbić

  1. <?php
  2. $kategorieZdjeciaSql = mysql_query('select k.nazwa, z.* from Kategorie k inner join Zdjecia z on k.id = z.id_kategorii order by k.nazwa asc');
  3.  
  4. $kategoria = null;
  5.  
  6.  while($kategorieZdjecia = mysql_fetch_assoc($kategorieZdjeciaSql )) {
  7.  
  8.   if($kategoria != $kategorieZdjecia['nazwa']) {
  9.      $kategoria = $kategorieZdjecia['nazwa'];
  10.      echo $kategorieZdjecia['nazwa'] . '<br>';
  11.   }
  12.  
  13.   echo $kategorieZdjecia['sciezka'] . '<br>';
  14.  }
  15. ?>


jedno i drugie powinno działać poprawnie, chociaż lepszym wyjściem jest 2 opcja ponieważ ma tylko jedno zapytanie do bazy
AniaR
Dziekuje bardzo:) Zaraz bede probowala:)
sowiq
@kirex,
jeśli już chcesz pomagać, to rób to dobrze.

1. Twój pierwszy sposób pokazuje jedną z gorszych praktyk, jakie można stosować przy zabawie z SQL. Uzależniasz ilość zapytań od ilości rekordów w bazie. Jeśli w tabelce 'Kategoria' będziesz miał 1k rekordów, to 'Zdjęcia' wykonasz 1k zapytań. Jeśli będzie tam 100k rekordów, to liczba zapytań będzie odpowiednio większa. Oczywiście w tym przypadku zapewne nie będzie takiej ilości danych, ale trzeba się wystrzegać powielania złych nawyków.

2. Ten sposób jest już o wiele lepszy, ale też nie do końca poprawny. Dużo lepszym pomysłem jest zastosowanie JOIN'ów - wykonują się one szybciej niż iloczyny kartezjańskie, które zastosowałeś.
Przepraszam, źle przeczytałem.
kirex
@sowiq,

Potrafisz czytać ze zrozumieniem ? Napisałem na końcu, że drugie rozwiązanie jest lepsze. Co do join, to niby co jest w 2 zapytaniu ?
sowiq
Przepraszam, źle przeczytałem 2. sposób.
AniaR
A jak zmodyfikowac ten kod:

<?php
$kategorieZdjeciaSql = mysql_query('select k.nazwa, z.* from Kategorie k inner join Zdjecia z on k.id = z.id_kategorii order by k.nazwa asc');

$kategoria = null;

while($kategorieZdjecia = mysql_fetch_assoc($kategorieZdjeciaSql )) {

if($kategoria != $kategorieZdjecia['nazwa']) {
$kategoria = $kategorieZdjecia['nazwa'];
echo $kategorieZdjecia['nazwa'] . '<br>';
}

echo $kategorieZdjecia['sciezka'] . '<br>';
}
?>

Aby rowniez wyswietlalo nazwy kategorii do ktorych nie sa dodane zadne zdjecia?

A jak zmodyfikowac ten kod:

<?php
$kategorieZdjeciaSql = mysql_query('select k.nazwa, z.* from Kategorie k inner join Zdjecia z on k.id = z.id_kategorii order by k.nazwa asc');

$kategoria = null;

while($kategorieZdjecia = mysql_fetch_assoc($kategorieZdjeciaSql )) {

if($kategoria != $kategorieZdjecia['nazwa']) {
$kategoria = $kategorieZdjecia['nazwa'];
echo $kategorieZdjecia['nazwa'] . '<br>';
}

echo $kategorieZdjecia['sciezka'] . '<br>';
}
?>

Aby rowniez wyswietlalo nazwy kategorii do ktorych nie sa dodane zadne zdjecia?
kirex
tak ?:

  1. <?php
  2. $kategorieZdjeciaSql = mysql_query('select k.nazwa, z.* from Kategorie k left join Zdjecia z on k.id = z.id_kategorii order by k.nazwa asc');
  3.  
  4. $kategoria = null;
  5.  
  6. while($kategorieZdjecia = mysql_fetch_assoc($kategorieZdjeciaSql )) {
  7.  
  8.    if($kategoria != $kategorieZdjecia['nazwa']) {
  9.        $kategoria = $kategorieZdjecia['nazwa'];
  10.        echo $kategorieZdjecia['nazwa'] . '<br>';
  11.    }
  12.  
  13.    if(!empty($kategorieZdjecia['sciezka')) {
  14.        echo $kategorieZdjecia['sciezka'] . '<br>';
  15.    }
  16. }
  17. ?>
AniaR
Dolklanie tak winksmiley.jpg jestes THE BEST exclamation.gif
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.