Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Pętlę (lub co innego), ucinają jeden wynik
thomson89
post
Post #1





Grupa: Zarejestrowani
Postów: 1 178
Pomógł: 51
Dołączył: 7.01.2009
Skąd: Gdańsk

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


Witam!

Kombinuję już od 3h nad tym i już nie mogę. Proszę o pomoc!

Niżej podam kod, który zwraca wartości pobrane z bazy i przetwarza je. Tworzę z danych z bazy, kwadraciki z danymi produktów. Kwadratów jest 12 na stronę - 4 linijki po 3 takie "elementy". Problem polega na tym, że ostatni "element" z ostatniej linijki nie jest wyświetlany. Próbowałem już z poprawianiem pętli, zmianami numerków i liczb. Ale to na nic. Wyświetlając także zmienną $zew_licznik, wychodziło na to, że kod dla 12 elementu się wykonuje.

  1. $polaczenie = new baza;
  2. $query = 'SELECT * FROM `produkty` LIMIT '.$start.', '.$this -> ile_na_stronie;
  3. $wynik1 = mysql_query($query);
  4. $query = 'SELECT * FROM `produkty`';
  5. $wynik2 = mysql_query($query);
  6.  
  7. $out = array();
  8. while($row = mysql_fetch_assoc($wynik1)) {
  9. $out[] = $row;
  10. }
  11.  
  12. $textResult .= '</p><p class="zdjecia">
  13. <table class="produkty">';
  14.  
  15. $ile = mysql_num_rows($wynik1);
  16. $ile = ceil($ile/3);
  17. $zew_licznik = 1;
  18. $i = 1;
  19. while($i <= $ile)
  20. {
  21. $textResult .= '<tr>';
  22. $c = 1;
  23. while($c <= 3)
  24. {
  25. if($out[$zew_licznik] != '')
  26. {
  27. $plik = file_get_contents($this -> szablon_produkt);
  28. $plik = str_replace('<cena>', $out[$zew_licznik]['cena'], $plik);
  29. $plik = str_replace('<symbol>', $out[$zew_licznik]['nazwa'], $plik);
  30. $plik = str_replace('<opis>', $out[$zew_licznik]['opis'], $plik);
  31.  
  32. //obrazki
  33. $nazwa = $out[$zew_licznik]['nazwa'];
  34. $nazwa = preg_replace('/[^a-z ]+/i', '', $nazwa);
  35. $nazwa = str_replace(' ', '', $nazwa);
  36. $nazwa = strtolower($nazwa);
  37. $plik = str_replace('<obrazek>', 'http://www.gl-art.pl/sklep/produkty/'.$nazwa.'.jpg', $plik);
  38.  
  39. $textResult .= $plik;
  40.  
  41.  
  42. }
  43. $c++;
  44. $zew_licznik++;
  45.  
  46. }
  47. $textResult .= '</tr>';
  48. $i++;
  49. }
  50.  
  51. $textResult .= '</table>';

  1. <td><img height="150" src="<obrazek>"><strong>Cena:</strong> <cena><br><strong>Nazwa:</strong> <symbol><br><strong>Opis:</strong> <opis><br><br><span class="linki"><a href="<link>">Więcej ?</a></span></td>


Ten post edytował thomson89 6.08.2010, 22:26:51
Go to the top of the page
+Quote Post
vokiel
post
Post #2





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


Po pierwsze, to te drugie zapytanie jest tu chyba niepotrzebne.

Po drugie po co zliczasz ilość zwróconych rekordów, skoro masz tablicę $out, w której masz te produkty. Podlicz liczbę wierszy w tej tablicy. W końcu to z tych danych później korzystasz.

Pokaż jaką wartość ma zmienna $ile z linii 15 i linii 16.

W ogóle to co to za dziwne konstrukcje. Po co Ci tutaj aż dwie pętle while? Masz tablicę elementów, chcesz co trzy elementy przechodzić do nowej linii, to weź zrób to coś jak tak (warunek z if może trzeba będzie na końcu umieścić, nie sprawdzałem, a późno już):
  1. $i = 0;
  2. foreach ($out as $item){
  3. if ($i%3==0){
  4. // trzeci element czyli np
  5. echo '</tr><tr>';
  6. }
  7. // tutaj Twoje wyświetlanie, z tym, że zamiast $out[$zew_licznik]['cena'] używasz $item['cena']
  8. $i++;
  9. }


edit: Można zacząć licznik od 1, albo dodać w warunku:
  1. if ($i%3==0 && $i!=0){}


Ten post edytował vokiel 6.08.2010, 22:48:44
Go to the top of the page
+Quote Post
glh
post
Post #3





Grupa: Zarejestrowani
Postów: 97
Pomógł: 20
Dołączył: 18.12.2007
Skąd: Poznań

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


Tylko powierzchownie przyglądnąłem się temu, nie testowałem nic i będę strzelał(IMG:style_emoticons/default/smile.gif)

Zmienna out jest tablicą, a tablice liczone są od zera.
Tymczasem u Ciebie pętla zaczyna od elementu o indeksie 1. Może tu tkwi problem - w zmiennej zew_licznik.
Go to the top of the page
+Quote Post
thek
post
Post #4





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




I po co tak męczyć się? Nie prościej zrobić zabawę z modulo? Na starcie sprawdzanie czy licznik osiągnął określona wartość. Jeśli tak to zamknij dotychczasowy <tr> i otwórz nowy. Kod skrócisz o minimum kilkanaście linii.

EDIT: Vokiel mnie ubiegł... I IF ma być na samym początku. Musi jednak wyeliminować pierwsze przejście pętli bo mu wstawi całkowicie pusty <tr> bez jakichkolwiek <td> wewnątrz.
Powód edycji: [thek]: Uzupełnienie
Go to the top of the page
+Quote Post
thomson89
post
Post #5





Grupa: Zarejestrowani
Postów: 1 178
Pomógł: 51
Dołączył: 7.01.2009
Skąd: Gdańsk

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


glh, rozwiązał problem. Oczywiście dziękuje za propozycje zmian.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 17.09.2025 - 11:40