Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Wyświetlanie rekordów za pomocą pętli co 3 rekordy
Zagiewa
post 9.04.2010, 02:24:26
Post #1





Grupa: Zarejestrowani
Postów: 84
Pomógł: 0
Dołączył: 12.08.2009

Ostrzeżenie: (0%)
-----


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 :/

Ten post edytował Zagiewa 9.04.2010, 02:26:13
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
AdIoS_Neo
post 9.04.2010, 04:58:36
Post #2





Grupa: Zarejestrowani
Postów: 159
Pomógł: 43
Dołączył: 8.03.2009

Ostrzeżenie: (0%)
-----


  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ć...
Go to the top of the page
+Quote Post
Zagiewa
post 9.04.2010, 06:13:36
Post #3





Grupa: Zarejestrowani
Postów: 84
Pomógł: 0
Dołączył: 12.08.2009

Ostrzeżenie: (0%)
-----


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

Ten post edytował Zagiewa 9.04.2010, 06:33:32
Go to the top of the page
+Quote Post
blooregard
post 9.04.2010, 06:18:18
Post #4


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




Proszę używać BBCode.


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
mortus
post 9.04.2010, 08:27:32
Post #5





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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 -.
Go to the top of the page
+Quote Post
Zagiewa
post 9.04.2010, 12:23:23
Post #6





Grupa: Zarejestrowani
Postów: 84
Pomógł: 0
Dołączył: 12.08.2009

Ostrzeżenie: (0%)
-----


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

Ten post edytował Zagiewa 9.04.2010, 12:35:43
Go to the top of the page
+Quote Post
rossco
post 9.04.2010, 20:23:48
Post #7





Grupa: Zarejestrowani
Postów: 72
Pomógł: 0
Dołączył: 17.02.2007

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
mortus
post 9.04.2010, 20:29:29
Post #8





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Zagiewa
post 11.04.2010, 01:07:51
Post #9





Grupa: Zarejestrowani
Postów: 84
Pomógł: 0
Dołączył: 12.08.2009

Ostrzeżenie: (0%)
-----


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?

Ten post edytował Zagiewa 11.04.2010, 21:06:13
Go to the top of the page
+Quote Post
mortus
post 11.04.2010, 08:13:49
Post #10





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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ć.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 20:03