Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Wyświetlanie rekordów za pomocą pętli co 3 rekordy
Forum PHP.pl > Forum > Przedszkole
Zagiewa
Witam. Mam w bazie rekordy które chce odczytać z tym, że chcę aby wyświetlały się w konkretny sposób a dokładniej mówiąc co trzy, następna linia trzy, następna trzy itd. Wiem mniej więcej jak to powinno wyglądać ale ciężko mi to przenieść na PHP. Oto co skleciłem i prosił bym tylko o pomoc - jak przekształcić skrypt a w zasadzie głównie pętlę aby wyświetlała co trzy rekordy.

Łączę się z bazą a następnie:
Kod
$kategorie = "SELECT * FROM kategorie_linkow ORDER BY id";
$result = mysql_query($kategorie) or
die("Sprawdź rezultat!" . mysql_error());

while($wyswietl = mysql_fetch_array($result)) {

if($i = 1; $i <= 3; $i++) {
$id = $wyswietl['id'];
$kategoria = $wyswietl['kategoria'];

$lista .=<<<EOD
<td>$kategoria</td>
EOD;
}
}

$naglowek = "<table id=\"linki\">";
$s_tr = "<tr>";
$e_tr = "</tr>";
$stopka = "</table>";

$tabela =<<<EOD
$naglowek
$s_tr
$e_tr
$lista
$stopka
EOD;

echo $tabela;


Jak widać gdy usuniemy z pętli while pętlę for wyświetli mi ona wszystkie rekordy ale w jednym wierszu dlatego też wstawiłem pętlę for która chciał bym aby co trzy rekordy przechodziła do nowego wiersza i wyświetlała kolejne trzy itd. ale gdy tylko napisałem tą pętlę stanąłem w miejscu bo wiem, że ona nie działa tak jak bym chciał bo coś jej brakuje i właśnie nie wiem co :/
AdIoS_Neo
  1. $i=1;
  2. while($wyswietl = mysql_fetch_array($result)){
  3. if(!($i%3))
  4. $lista .= "<tr>";
  5.  
  6. $id = $wyswietl['id'];
  7. $kategoria = $wyswietl['kategoria'];
  8.  
  9. $lista .=<<<EOD
  10. <td>$kategoria</td>
  11. EOD;
  12. if(!($i%3))
  13. $lista .= "</tr>";
  14. $i++;
  15. }

Takie najprostsze rozwiązanie... trochę lamerskie ale działa ;p o tej godzinie trochę już głowa przestaje pracować...
Zagiewa
Działa ale nie zupełnie tak jak chciałem. Dodam, że chwilowo mam tylko 5 rekordów więc na przykładzie pustej tabeli pokażę jak chciałem aby wyświetlały się rekordy:

Kod
[/code]<table>
<tr>
<td>1</td><td>2</td><td>3</td>
</tr>
<tr>
<td>4</td><td>5</td>
</tr>
</table>


itd. jeśli przybędzie więcej rekordów. Skrypt który zaproponowałeś układa mi odwrotnie tongue.gif a wygląda to tak:

Kod
<table>
<tr>
<td>1</td><td>2</td>
</tr>
<tr>
<td>3</td>
</tr>
<tr>
<td>4</td><td>5</td>
</tr>
</table>


A przynajmniej tak mi wyświetliło, ciekawe jak by zachował się skrypt gdy bym dodał np. parę rekordów więcej ale mniejsza z tym, szkoda ze nie działa nadal jak powinien tongue.gif
blooregard
Proszę używać BBCode.
mortus
Zobacz ten post, a konkretnie drugi listing. Zmienna $liczba to u Ciebie liczba wszystkich rekordów, a zmienna $liczb_w_wierszu, to u Ciebie liczba rekordów jaką chcesz mieć w jednym wierszu. Skrypt uzupełnia puste komórki znakiem -.
Zagiewa
Mortus, jak przeanalizowałem ten post co mi podesłałeś, na jego podstawie zmieniłem swoją pętlę i patrząc na kod musi działaćexclamation.gif a nie działa sad.gif Znów posługując się pustą tabelą pokażę jak się wyświetlają:
Kod
<table>
<tr>
<td></td><td></td><td></td><td></td><td></td>
</tr>
</table>

Bez sensu, a kod wygląda tak:
Kod
$i = 1;
$ile = 3;

while($wyswietl = mysql_fetch_array($result)) {

if($i%$ile == 0 && $i != 0) {

echo "</tr><tr>";
}

$id = $wyswietl['id'];
$kategoria = $wyswietl['kategoria'];

$lista .=<<<EOD
<td>$kategoria</td>
EOD;

$i++;
}

$naglowek = "<table id=\"linki\"><tr>";
$stopka = "</tr></table>";

$tabela =<<<EOD
$naglowek
$lista
$stopka
EOD;

echo $tabela;

Jednak udało się. W powyższym kodzie były dwa błędy.

1. Zamiast echo "</tr><tr>"; trzeba było wstawić:
Kod
$lista .=<<<EOD
</tr><tr>
EOD;

2. Drugi błąd to czysta matematyka tongue.gif zmienna $i na starcie musi mieć wartość 0 a nie 1

Już działa wszystko więc dzięki wielkie za pomoc smile.gif
rossco
Jestem jeszcze początkująca, ale wydaje mi się że musisz zrobić pętle w pętli - zagnieżdżanie pętli. pierwsza pętla drukuję <tr> a druga <td> w (wyrażeniach) określasz ilość wierszy i kolumn
mortus
Cytat(rossco @ 9.04.2010, 21:23:48 ) *
Jestem jeszcze początkująca, ale wydaje mi się że musisz zrobić pętle w pętli - zagnieżdżanie pętli. pierwsza pętla drukuję <tr> a druga <td> w (wyrażeniach) określasz ilość wierszy i kolumn
@ rossco Problem rozwiązany i wystarczyła tylko jedna pętla. Przeczytaj dokładnie poprzednie posty. Pozdrawiam
Zagiewa
Odświeżam temat bo nadszedł czas na rozbudowanie tego kodu. Problem jest ten sam czyli zależy mi na tym aby wyświetlały się co trzy rekordy ale tym razem jest trochę trudniej. Najpierw przedstawię co kod ma robić. Pierwsze co to pobiera rekordy z bazy których jest dokładnie pięć i mają być one kategoriami. Pod każdą z kategorii mają się wyświetlać dane. Dane te na razie nie mają większego znaczenia więc są po prostu przypadkowe i mają na celu tylko i wyłącznie sprawdzić czy są wyświetlane we właściwym miejscu. Mój obecny kod wyświetla ja w sposób przedstawiony poniżej w tabeli.
Kod
kategoria1  kategoria2  kategoria3  kategoria4  kategoria5
a           a           a           a           a
b           b           b           b           b
c           c           c           c           c
d           d           d           d           d
e           e           e           e           e
f           f           f           f           f

Teraz potrzebuję aby wyświetlały się co trzy kategorie w wierszu czyli coś takiego:
Kod
kategoria1  kategoria2  kategoria3
a           a           a              
b           b           b              
c           c           c                
d           d           d              
e           e           e                
f           f           f        

kategoria4  kategoria5
a           a
b           b
c           c
d           d
e           e
f           f

Wcześniej pomogliście mi to wykonać gdy wyświetlałem tylko same kategorie za pomocą tego warunku:
  1. if($i%$ile == 0 && i$ != 0) {
  2. echo "</tr><tr>";
  3. }

Ale tym razem kod się zmienił i nie wiem jak teraz użyć tego warunku aby wyświetlać co trzy kategorie w wierszu. Mój kod wygląda tak:
  1. $kategorie = "SELECT kategoria FROM kategorie_linkow ORDER BY id";
  2. $result = mysql_query($kategorie) or
  3. die("<p id=\"text\">Sprawdź rezultat! " . mysql_error() . "</p>");
  4.  
  5. $i = 0;
  6. $ile = 3;
  7.  
  8. while($wyswietl = mysql_fetch_array($result)) {
  9.  
  10. $kategoria = $wyswietl['kategoria'];
  11.  
  12. $lista .=<<<EOD
  13. <td>$kategoria</td>
  14. EOD;
  15.  
  16. $i++;
  17. }
  18.  
  19. for($y = 1; $y <= $i; $y++) {
  20.  
  21. $linki .=<<<EOD
  22. <td>
  23. EOD;
  24.  
  25. for($x = 1; $x <= 5; $x++) {
  26.  
  27. $linki .=<<<EOD
  28. $x<br />
  29. EOD;
  30. }
  31.  
  32. $linki .=<<<EOD
  33. </td>
  34. EOD;
  35. }
  36.  
  37. $naglowek = "<table id=\"linki\"><tr>";
  38. $tr = "</tr><tr>";
  39. $stopka = "</tr></table>";
  40.  
  41. $tabela =<<<EOD
  42. $naglowek
  43. $lista
  44. $tr
  45. $linki
  46. $stopka
  47. EOD;
  48.  
  49. echo $tabela;

Macie jakieś pomysły jak to zrobić? jakieś podpowiedzi?
mortus
Przede wszystkim powiedz, po co tak to wszystko rozdrabniasz (dzielisz na linki, listę, nagłówek, stopkę), jaki masz w tym cel? No i dlaczego raz używasz zwykłych cudzysłowów do deklarowania stringów, a innym razem delimiterów heredoc (<<<EOD). Przecież
  1. $tabela = $naglowek . "\n" . $lista . "\n" . $stopka;
to to samo co
  1. $tabela = <<<EOD
  2. $naglowek
  3. $lista
  4. $stopka
  5. EOD;
Tymczasem Twój kod traci spójność i czytelność.
A teraz przejdźmy do sedna. Nie zrobisz tego w taki sposób, ale podam Ci rozwiązanie z podobnym do Twojego buforowaniem całej tabeli
  1. $kategorie = "SELECT kategoria FROM kategorie_linkow ORDER BY id";
  2. $result = mysql_query($kategorie) or die("Błąd zapytania: " . mysql_error());
  3. $i = 0;
  4. $ile = 3;
  5. $outputBuffer = "<table><tr>";
  6. while($wyswietl = mysql_fetch_array($result)) {
  7. $kategoria = $wyswietl['kategoria'];
  8. if($i%$ile == 0 && $i != 0) {
  9. $outputBuffer .= "</tr><tr>";
  10. }
  11. $outputBuffer .= "<td><table><tr><td>$kategoria</td></tr><tr><td>";
  12. for($j = 1; $j <= 5; $j++) {
  13. $outputBuffer .= "$i<br />";
  14. }
  15. $outputBuffer .= "</td></tr></table></td>";
  16. $i++;
  17. }
  18. // dopełniamy puste komórki
  19. for($i = 0; $i < $ile - mysql_num_rows($result)%$ile; $i++) {
  20. $outputBuffer .= "<td></td>";
  21. }
  22. $outputBuffer .= "</tr></table>";
  23. echo $outputBuffer;
Taki sam efekt można osiągnąć przy użyciu pętli for
  1. $kategorie = "SELECT kategoria FROM kategorie_linkow ORDER BY id";
  2. $result = mysql_query($kategorie) or die("Błąd zapytania: " . mysql_error());
  3. $wszystkich = mysql_num_rows($result);
  4. $ile = 3;
  5. $outputBuffer = "<table><tr>";
  6. for($i = 0; $i < $wszystkich; $i++) {
  7. $wyswietl = mysql_fetch_array($result);
  8. $kategoria = $wyswietl['kategoria'];
  9. if($i%$ile == 0 && $i != 0) {
  10. $outputBuffer .= "</tr><tr>";
  11. }
  12. $outputBuffer .= "<td><table><tr><td>$kategoria</td></tr><tr><td>";
  13. for($j = 1; $j <= 5; $j++) {
  14. $outputBuffer .= "$i<br />";
  15. }
  16. $outputBuffer .= "</td></tr></table></td>";
  17. }
  18. // dopełniamy puste komórki
  19. for($i = 0; $i < $ile - $wszystkich%$ile; $i++) {
  20. $outputBuffer .= "<td></td>";
  21. }
  22. $outputBuffer .= "</tr></table>";
  23. echo $outputBuffer;
W 23 liniach zrobiłem to, co ty w 49. Pisałem z głowy, więc nie wiem, czy na 100% będzie działać.
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.