Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Blad w zapytaniu sql
Forum PHP.pl > Forum > Przedszkole
eminiasty
Witam, mam pewnien problem dotyczacy zwracania wynikow w paginacji, kod paginacji jest tu:(raczej samego przetwarzania)
  1. $result= mysqli_query($link,$query) or die(mysqli_error());
  2. $row = mysqli_fetch_array($result);
  3. extract($row);
  4.  
  5. $onpage = 10;
  6. $navnum = 7;
  7. $allpages = ceil($all_posts/$onpage);
  8.  
  9. if(!isset($_GET['page']) or $_GET['page'] > $allpages or !is_numeric($_GET['page']) or $_GET['page'] <= 0){
  10. $page = 1;
  11. }else{
  12. $page = $_GET['page'];
  13. }
  14. $limit = ($page - 1) * $onpage;



Zapytanie wyglada nastepujaco:
Problem polega na tym, iż dane sa zwracana na podstawie kategori a nie newsow. Czyli jak powinno byc
$onpage = 10; newsow na stronie to wyswietla ich np 2 jesli sa 2 po 5 kategori w jednym. Jak przerobic to zapytanie by wyswietlal po newsach, a nie po kategoriach?
Probowalem GROUP BY news_id lecz to nie w tym rzecz bo potem sa kategorie nie wyswietlane ..;/
  1. $query1 ="
  2. SELECT ".$prefix."news.*,".$prefix."users.*,".$prefix."news_categories.*,".$prefix."categories.*
  3. FROM ".$prefix."news
  4. JOIN ".$prefix."users
  5. ON ".$prefix."news.users_id = ".$prefix."users.users_id
  6. JOIN ".$prefix."news_categories
  7. ON ".$prefix."news.news_id = ".$prefix."news_categories.news_id
  8. JOIN ".$prefix."categories
  9. ON ".$prefix."categories.categories_id = ".$prefix."news_categories.categories_id
  10. ORDER BY news_date_add
  11.  
  12. LIMIT $limit, $onpage";


Zauwazylem ze glowny blad jest w

  1. JOIN ".$prefix."news_categories
  2. ON ".$prefix."news.news_id = ".$prefix."news_categories.news_id

bo przyrownuje jednego newsa (jedno id) do kilku kategori czyli tego samego id , tylko nie wiem jak to zmienic zeby bylo poprawnie..;/
com
".$prefix."news.*,".$prefix."users.*,".$prefix."news_categories.*,".$prefix."categories.* już Ci mówiłem zastąp to *, bo to niczego nie daje a tylko zaciemnia wydłuża niepotrzebnie kod, czemu masz potrójnego joina?
eminiasty
  1. już Ci mówiłem zastąp to *
tzn? przeciez jest *?

1 join - z tabeli users wyciaga loginy(zeby byl wyswietlany potem)
  1. JOIN ".$prefix."users
  2. ON ".$prefix."news.users_id = ".$prefix."users.users_id



2 join - potrzebny jest w sumie zeby zrobic 3 joina(chyba) , bo potrzebuje miec powiazanie z categoreis
  1. JOIN ".$prefix."news_categories
  2. ON ".$prefix."news.news_id = ".$prefix."news_categories.news_id

3 join - nazy kategori sa trzymane w tabeli categories wiec musze je jakos pobrac? id kategori do newsa jest przypisywane w news_categories wiec stad chyba to potrzebne
  1. JOIN ".$prefix."categories
  2. ON ".$prefix."categories.categories_id = ".$prefix."news_categories.categories_id
com
tak ale cale to ".$prefix."news.*,".$prefix."users.*,".$prefix."news_categories.*,".$prefix."categories.*" wystarczyło by zapisać jako * i efekt jest ten sam, ok no to musisz jeszcze zgrupować te wyniki odpowiednio, poczytaj o group by wink.gif
eminiasty
pisalem ze probowalem je grupowac
np. tak
  1. GROUP BY ".$prefix."news_categories.news_id


lecz rodza sie dwa problemy
1. nie wyswietla wszystkich newsow
2. po zgrupowaniu nie wyswietla wszystkich kategori dla danego newsa
com
zaraz zaraz, z tego co widzę wyświetla te kategorie do których należą newsy, wiec jak nalezą do 2 np to nie wyświetli ich 5 przecież
eminiasty
Dokladnie, a powinno chyba je wyswietlac.
W sesnie ze jeden newst ma dwie kategorie to je wyswietla przy nim. nie osobno.
To wyglada tak:

bez grupowania


z grupowaniem


Chce zeby bylo jak na pierwszym tylko nie zliczalo po ilosci kategori na stronie tylko ilosci postow.
com
on niczego nie zlicza, bo dalej masz 10 rekordów tylko zgrupowanych wiec na stronie robi Ci się ich np 5. Policz sobie ile masz katergorii, bo tyle jest rekordów, czyli 10 smile.gif
eminiasty
Ja wiem jak wyglada problem, nie umeim go tylko rozwiazac bo grupowanie nie dziala chyba..

To co mowisz jest prawda.
Tylko nie chce zeby na pierwszej stronie bylo 5 a na drugiej juz 6 nesow, a na 3 juz 7 np.
Prosze o pomoc w rozwiazaniu tej sytuacji.
com
no to musisz ograniczyć wyświetlanie w inny sposób, powiedzmy przyjac pesymistyczny przypadek czyli 10xkategoria, a podział na strony zrobić w samym php smile.gif
eminiasty
rzuca mi sie tylko slowo jak?
W ktorym miejscu takie ograniczegnia powinny byc umieszczone? to powinno byc zrobione w postaci ifa czy inaczej?

Cytat
no to musisz ograniczyć wyświetlanie w inny sposób, powiedzmy przyjac pesymistyczny przypadek czyli 10xkategoria

czy chodzi ci o to aby ilosc wyswietlanych posotw na stronie podniesc np do 100? co w przypadku postow z kiludziesieciowam kategoriami zmniejszy liczebnosc? przeciez to nie rozwiazuje problemu, pozatym kazda strona bedzie zawiaerac inna liczbe postow

to jest moje wyswietlanie:

  1. ....
  2. //wyswietlanie danych
  3. echo '<table class="table">
  4. <thead>
  5. <tr>';
  6. echo'<th>LOGIN </th>';
  7. echo'<th>TYTUL</th>
  8. <th>KATEGORIA</th>
  9. <th>DATA ADD</th>
  10. <th>DATA END</th>
  11. <th>WYŚ</th>
  12. </tr>
  13. </thead>
  14. <tbody>
  15. ';
  16. foreach ($newst as $id => $newsy){ //petla, która leci po newsach
  17. echo '<tr>
  18. <td>'.$newsy['users'].'</td>
  19. <td>'.$newsy['name'].'</td><td>';
  20. foreach ($newsy['categories'] as $cat){ //pętla, która leci po kategoriach w newsach
  21. echo"<span class='rama label' style='color:#".$cat['color']."; background-color:".$cat['bg'].";'>".$cat['name']."</span>";
  22. }
  23. echo '</td><td>'.$newsy['date_add'].'</td>
  24. </td><td>'.$newsy['date_end'].'</td>
  25. </td><td>'.$newsy['display'].'</td>
  26. ';
  27. echo'<td>
  28. <a href="mod.php?s=news&a=czytaj&id='.$id.'" data-original-title="Czytaj" data-toggle="tooltip" type="button" class="btn btn-xs btn-success"><i class="fa fa-fw fa fa-comment"></i></a>
  29. </td>';
  30. echo'<td>
  31. <a href="mod.php?s=news&a=edytuj&id='.$id.'" data-original-title="Edytuj" data-toggle="tooltip" type="button" class="btn btn-xs btn-primary"><i class="fa fa-fw fa fa-pencil-square-o"></i></a>
  32. </td>';
  33. echo'<td>
  34. <a href="mod.php?s=news&a=usun&id='.$id.'" id="js-news-usun" data-original-title="Usuń" data-toggle="tooltip" type="button" class="btn btn-xs btn-danger js-are-you-sure"><i class="fa fa-fw fa fa-trash"></i></a>
  35. </td>';
  36.  
  37. }
  38. echo '</tr>
  39. </tbody>
  40. </table>';
  41.  
  42. }
com
chodzi o to żeby pobrać x rekordów z bazy, a ograniczenie i podział na strony nie robić przez limit a poprzez ograniczenie w tablicy przy wyświetlaniu. Ale ze względu na to że rekordów może być sporo dlatego sugerowałem limit ilość kategorii razy ilość elementów, których niech jest 5 zamiast 10 np.
eminiasty
ok ok
chodzi ci o wywalnie LIMIT $limit, $onpage
tylko ze o to opiera sie paginacja ktora wyswietla newsy na kolejnych stronach.
com
tak, i te paginacje zrób w php nie poprzez bazę, limit daj ale np 5 rekordów x 5 kategorii wink.gif dodasz warunek modulo i tam ograniczysz na strony smile.gif
eminiasty
fajnie niby rozumiem.. ale nie wiem jak zrobic paginacje bez uzycia LIMIT i jak ten LIMIT zaimplementowac w kod php, najsmieszniejsze jest to ze kiedy nie uzywalem JOINow to wszystko bylo ok.
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.