Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [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


--------------------
Sklep 70%
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
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ł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


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
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.


--------------------
Sklep 70%
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 Aktualny czas: 21.08.2025 - 06:04