Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Rozwiązany][PHP][MySQL] Mam Array, jak wyciągnąć resztę?
Forum PHP.pl > Forum > Przedszkole
kasior
Witajcie. Mam problem. Wiem,że rozwiązanie jest na pewno banalnie proste ale ja już 2 dzień siedzę nad tym i nie wiem co robię źle.

Jest sobie <select> który wyświetla drzewo kategorii i newsów w nich zawartych. Wygląda to teraz tak:



Jak widać zamiast pod każda z kategorii pokazać jej zawartość zapytanie pokazuje za każdym razem wszystkie artykuły ze wszystkich kategorii.
Kod php tej sekcji wygląda tak :

  1.  
  2. $sql= 'select id_category, category_pl from articles_categories where id_category != "1"';
  3. $stmt = $hDB->prepare($sql);
  4. $stmt->execute();
  5. $num = $stmt->rowCount();
  6.  
  7. if ($num>0){
  8. $art = $stmt->setFetchMode(PDO::FETCH_ASSOC);
  9. for ($i=0;$i<$num;$i++){
  10. $art = $stmt->fetch();
  11. $tmpart[] = $art;
  12. $cat_ids[$i] = $tmpart[$i]['id_category'];
  13.  
  14.  
  15. }
  16.  
  17. }


To wyciąga kategorie. Wynik tego zapytania:

  1. (
  2. [0] => 2
  3. [1] => 14
  4. [2] => 15
  5. [3] => 16
  6. [4] => 17
  7. [5] => 21
  8. [6] => 27
  9. [7] => 30
  10. [8] => 31
  11. [9] => 32
  12. [10] => 33
  13. [11] => 34
  14. [12] => 35
  15. [13] => 36
  16. [14] => 37
  17. )
  18.  


Następnie zrobiłem takie coś:

  1. foreach ($cat_ids as $cat) {
  2.  
  3.  
  4. $sql= 'select id, id_category, subject_pl from articles where id_category = :id_categ order by add_date desc';
  5. $stmt = $hDB->prepare($sql);
  6. $stmt->bindParam(':id_categ',$cat,PDO::PARAM_INT);
  7. $stmt->execute();
  8. $num = $stmt->rowCount();
  9.  
  10. if ($num>0){
  11. $arty = $stmt->setFetchMode(PDO::FETCH_ASSOC);
  12. for ($i=0;$i<$num;$i++){
  13. $arty = $stmt->fetch();
  14. $tmparty[] = $arty;
  15.  
  16. }
  17. }
  18. }
  19.  
  20.  
  21. $smarty->assign('tmpart',$tmpart);
  22. $smarty->assign('tmparty',$tmparty);


Kod html wygląda tak:

  1. <option value="0" style="font-weight:bold">&nbsp;&nbsp;<b>Kategorie artykułów</b></option>
  2. {section start=0 step=1 name=tmpart loop=$tmpart}
  3. <option value="akt:{$tmpart[tmpart].id_category}:1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└ {$tmpart[tmpart].category_pl|stripslashes}</option>
  4.  
  5. {section start=0 step=1 name=arty loop=$tmparty}
  6. <option value="akt:{$tmparty[arty].id_category},{$tmparty[arty].id}" style="color:#0066CC">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└ {$tmparty[arty].subject_pl|stripslashes}</option>
  7. {/section}
  8.  
  9. {/section}


Możecie mi wytknąć co robię nie tak??
nospor
Pisalem arta o identycznym problemie:
http://nospor.pl/grupowanie-wynikow-n35.html
moze ci sie przyda
kasior
Może nie pomogło. Jakoś nie mogę tego zastosować do mojego kodu i smarty. A kombinuję jak koń pod górę smile.gif
nospor
Kod co tam podalem tworzy tablice na podstawie danych a nastepnie wyswietla info na podstawie tej tablicy.
Tablica generowana jest z identycznej struktury co u ciebie wiec nie wiem w czy masz problem.
A jak juz bedziesz mial tablice to potem na spokojnie wstawisz ją do smarty.
kasior
Proszę bardzo. Tak wygląda kod po tym co mi dałeś. Nie wyświetla produktów niestety tylko kategorie.

  1.  
  2. $sql= 'select c.id_category, c.category_pl, a.id, a.id_category, a.subject_pl from articles_categories c left join articles a on a.id_category = c.id_category and c.id_category != "1" order by add_date desc';
  3. $stmt = $hDB->prepare($sql);
  4. $stmt->execute();
  5. $num = $stmt->rowCount();
  6.  
  7. if ($num>0){
  8. $art = $stmt->setFetchMode(PDO::FETCH_ASSOC);
  9. for ($i=0;$i<$num;$i++){
  10. $art = $stmt->fetch();
  11. $tmpart[] = $art;
  12. }
  13.  
  14. }
  15.  
  16.  
  17. echo '<select>';
  18. foreach ($tmpart as $id_category => $category){ //petla, która leci po kategoriach
  19. echo '<option>'.$category['category_pl'].'</option>';
  20. //$smarty->assign('tmpart',$category);
  21.  
  22.  
  23. foreach ($category['subject_pl'] as $product){ //pętla, która leci po produktach w kategorii
  24. echo '<option> ------------- <b>'.$product['subject_pl'].'</b></option>';
  25. //$smarty->assign('tmparty',$product);
  26.  
  27. }
  28.  
  29. }
  30. echo '</select>';


Tego selecta zrobiłem po to,zeby coś widzieć. Zmienne smarty na razie zahaszowane.
nospor
po pierwsze: sortuję po kategorii, dopiero potem po czyms innym
po drugie: nie masz wogole kodu, ktory buduje tablicę, wiec nie wiem jakim prawem ma ci to dzialac winksmiley.jpg
kasior
Ok. Wykminiłem. Może komuś się przyda.

  1. $sql= 'select id_category, category_pl from articles_categories where id_category != "1"';
  2. $stmt = $hDB->prepare($sql);
  3. $stmt->execute();
  4. $num = $stmt->rowCount();
  5.  
  6.  
  7. if ($num>0){
  8. $art = $stmt->setFetchMode(PDO::FETCH_ASSOC);
  9. for ($i=0;$i<$num;$i++){
  10. $art = $stmt->fetch();
  11. $tmpart[] = $art;
  12. $cat_ids[$i] = $tmpart[$i]['id_category'];
  13.  
  14. }
  15. }
  16.  
  17. foreach ($cat_ids as $cat) {
  18.  
  19. $sql= 'select id, id_category, subject_pl from articles where id_category = :id_categ order by add_date desc';
  20. $stmt = $hDB->prepare($sql);
  21. $stmt->bindParam(':id_categ',$cat,PDO::PARAM_INT);
  22. $stmt->execute();
  23. $num = $stmt->rowCount();
  24.  
  25. if ($num>0){
  26. $arty = $stmt->setFetchMode(PDO::FETCH_ASSOC);
  27. for ($i=0;$i<$num;$i++){
  28. $arty = $stmt->fetch();
  29. $tmparty[$arty['id_category']][] = $arty;
  30. }
  31.  
  32. }
  33.  
  34. }
  35. $smarty->assign('tmpart',$tmpart);
  36. $smarty->assign('tmparty',$tmparty);
  37.  
  38. $stmt->closeCursor();


I templatka :

  1. <option value="0" style="font-weight:bold">  Kategorie artykułów</option>
  2. {assign var=idc value=$tmpgal[tmppag].id_category}
  3. {section start=0 step=1 name=tmpart loop=$tmpart}
  4. <option value="akt:{$tmpart[tmpart].id_category}:1">       ? {$tmpart[tmpart].category_pl|stripslashes}</option>
  5. {assign var=idc value=$tmpart[tmpart].id_category}
  6. {section start=0 step=1 name=arty loop=$tmparty[$idc]}
  7. <option value="akt:{$tmparty[$idc][arty].id_category},{$tmparty[$idc][arty].id}" style="color:#0066CC">              ? {$tmparty[$idc][arty].subject_pl|stripslashes}</option>
  8. {/section}
  9. {/section}
nospor
Cytat
Wykminiłem.
Zrobiłeś to w najgorszy z możliwych sposobów: zapytania lecą u Ciebie w pętli. Optymalne jak cholera winksmiley.jpg
Cytat
Może komuś się przyda.
Mam nadzieję że nie.

Nie wiem czemu nie zastosujesz tego co ci podałem? Bo u mnie jest na czystym mysql_ a u Ciebie na PDO? No przecież musisz tylko zamienić pobieranie rekordów na PDO.
A wiem, że umiesz robić pobieranie rekordów na PDO bo Twoje kody powyżej o tym świadczą.
kasior
Zrobić sobie tablicę po twojemu to nie problem. Problem jest potem, kiedy trzeba to wywalić do Smarty. Najwięcej czasu zajęło szukanie sposobu właśnie na to.
Masz pomysł to pokaż. Zależy mi na tym, żeby to optymalnie chodziło.
nospor
całą tablicę przypisujesz do smarty poprzez assign_by_ref a następnie w smarty przelatujesz po niej analogicznie jak ja to robilem w czystym php.
kasior
No ok. Popróbuję. Thx Nospor za porady winksmiley.jpg Guziczek na "P" poleciał winksmiley.jpg
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.