Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z wyświetlaniem danych z MySQL
Forum PHP.pl > Forum > PHP
alkesz1718
Witam,
Mam pewien problem z modułem a mianowicie wyświetla on z bazy danych daną ilość artykułów z ilością komentarzy, oceny i wyświetleń od najwyższej do najniższej...

Wszystko wyświetla się prawidłowo w ilości komentarzy i ocenach jeśli jednak przejdę do wyświetlanie wg odwiedzin to pokazuje mi w wszystkich artykułach najwyższą liczbę odwiedzin z 1 art gdzie realna liczba jest całkiem inna...

Niżej podaję kod odpowiedzialny za wyświetlanie art wg wyświetleń/odwiedzin:
  1. if ($_GET['mode']=='views'){
  2. $cache = $dle_api->load_from_cache ( "top100views", 3600, $tpl->result['content'] );
  3. if( $cache === false ) {
  4. if ($top100_config['category'] != 0){
  5. $category_true = "AND category IN (".$top100_config['category'].")";
  6. } else {
  7. $category_true = "";
  8. }
  9. $sql_result = $db->query( "SELECT a.id, a.title, a.category, a.alt_name, b.news_read FROM " . PREFIX . "_post a INNER JOIN " . PREFIX . "_post_extras b WHERE approve=1 ".$category_true." ORDER BY news_read DESC LIMIT ".$top100_config['news_num'] );
  10.  
  11. $top100 = <<<HTML
  12. <thead>
  13. <tr>
  14. <td align="center">$top100_config[title_num]</td>
  15. <td align="center">$top100_config[title_name]</td>
  16. <td align="center">$top100_config[title_views_head]</td>
  17. </tr>
  18. </thead>
  19. HTML;
  20. $top100 .= <<<HTML
  21. <tbody>
  22. HTML;
  23. $i=1;
  24. while ( $row = $db->get_row($sql_result) ) {
  25. $row['category'] = intval( $row['category'] );
  26.  
  27. if( $config['allow_alt_url'] == "yes" ) {
  28.  
  29. if( $row['flag'] and $config['seo_type'] ) {
  30.  
  31. if( $row['category'] and $config['seo_type'] == 2 ) {
  32.  
  33. $full_link = $config['http_home_url'] . get_url( $row['category'] ) . "/" . $row['id'] . "-" . $row['alt_name'] . ".html";
  34.  
  35. } else {
  36.  
  37. $full_link = $config['http_home_url'] . $row['id'] . "-" . $row['alt_name'] . ".html";
  38.  
  39. }
  40.  
  41. } else {
  42.  
  43. $full_link = $config['http_home_url'] . date( 'Y/m/d/', $row['date'] ) . $row['alt_name'] . ".html";
  44. }
  45.  
  46. } else {
  47.  
  48. $full_link = $config['http_home_url'] . "index.php?newsid=" . $row['id'];
  49.  
  50. }
  51. $row['title']=strip_tags( stripslashes( $row['title'] ) );
  52. $row['news_read']=strip_tags( stripslashes( $row['news_read'] ) );
  53. $full_link=strip_tags( stripslashes( $full_link ) );
  54.  
  55. $top100 .='';
  56.  
  57. if ($row['news_read']!=0){
  58. $top100 .= <<<HTML
  59. <tr>
  60. <td align="center">&nbsp;&nbsp;$i&nbsp;&nbsp;</td>
  61. <td><a href="$full_link" title=""><strong>$row[title]</strong></a></td>
  62. <td align="center">$row[news_read]</td>
  63. </tr>
  64. HTML;
  65.  
  66. $i++;
  67. }
  68. }
  69.  
  70. $top100 .= <<<HTML
  71. </tbody>
  72. HTML;
  73. $tpl->load_template( 'top100.tpl' );
  74. $tpl->set( '{title}', $top100_config['title_views'] );
  75. $tpl->set( '{top100}', $top100 );
  76. $tpl->compile( 'content' );
  77. $dle_api->save_to_cache ( "top100views", $tpl->result['content'] );
  78. }
  79. else {
  80. var_dump($cache);
  81. }
  82. $tpl->clear();
  83. $db->free();
  84. }


Kod łączy ze sobą 2 tabele z których wyciąga dane:
- nazwa artykułu
- ilość wyświetleń
- id
- (rzekomo kategorię ale wycofałem tę funkcję)

Prawdopodobnie gdzieś w tym kodzie jest błąd ale już nie mam pomysłu gdzie.

Dla przykładu wyglądu podaję stronę testową:
http://djalexn.hol.es/?do=top100&mode=views

jak będzie potrzebny cały kod to chętnie podeślę i prosiłbym o jak najszybszą odpowiedź i najlepiej z podanym gotowym rozwiązaniem...


Z góry dziękuję i pozdrawiam
b4rt3kk
Zwróć uwagę na to zapytanie:

  1. $sql_result = $db->query( "SELECT a.id, a.title, a.category, a.alt_name, b.news_read FROM " . PREFIX . "_post a INNER JOIN " . PREFIX . "_post_extras b WHERE approve=1 ".$category_true." ORDER BY news_read DESC LIMIT ".$top100_config['news_num'] );


Brakuje nam tutaj warunku połączenia tabeli post z tabelą post_extras.

Prawidłowe zapytanie powinno wyglądać mniej więcej tak (mniej więcej, bo nie wiem na podstawie jakiego klucza jest stworzone dowiązanie):

  1. $sql_result = $db->query( "SELECT a.id, a.title, a.category, a.alt_name, b.news_read FROM " . PREFIX . "_post a INNER JOIN " . PREFIX . "_post_extras b ON a.id = b.id_post WHERE approve=1 ".$category_true." ORDER BY news_read DESC LIMIT ".$top100_config['news_num'] );
alkesz1718
Cytat
Prawidłowe zapytanie powinno wyglądać mniej więcej tak (mniej więcej, bo nie wiem na podstawie jakiego klucza jest stworzone dowiązanie):
  1. $sql_result = $db->query( "SELECT a.id, a.title, a.category, a.alt_name, b.news_read FROM " . PREFIX . "_post a INNER JOIN " . PREFIX . "_post_extras b ON a.id = b.id_post WHERE approve=1 ".$category_true." ORDER BY news_read DESC LIMIT ".$top100_config['news_num'] );


Ogólnie to to rozwiązanie pomogło ale musiałem zmienić:
ON a.id = b=id_post
na
ON a.id = b.eid
Tak jak mam w swojej bazie danych i problem się rozwiązał

Co do "braku warunku połączenia tabeli post z tabelą post_extras" to powiem ci że to nie do końca jest prawda (a przynajmniej tak mnie się wydaje) gdyż podobny kod mam na wyświetlanie innych danych... np:
  1. $sql_result = $db->query( "SELECT a.id, a.title, a.category, a.alt_name, b.rating FROM " . PREFIX . "_post a INNER JOIN " . PREFIX . "_post_extras b WHERE approve=1 ".$category_true." ORDER BY rating DESC LIMIT ".$top100_config['news_num'] );

no i tutaj o dziwo działa jak należy
b4rt3kk
Być może jest ok, albo myślisz, że jest ok, bo czegoś nie zauważasz, ale jako wynik takiego zapytania bez klauzuli ON otrzymujesz połączenie kartezjańskie, czyli każdy wpis z tabeli A z każdym wpisem z tabeli B.

Dla pewno zdebuguj to sobie.
alkesz1718
Hmmm rzeczywiście, po usunięciu ciasteczek itd. przestała działać inna funkcja... gdy użyłem klauzulę ON naprawiło się... chyba muszę bardziej się podszkolić w PHP i MySQL
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.