Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z wyświetlaniem danych z MySQL
alkesz1718
post 16.08.2017, 17:36:57
Post #1





Grupa: Zarejestrowani
Postów: 98
Pomógł: 0
Dołączył: 8.12.2014
Skąd: Czernina

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


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
Go to the top of the page
+Quote Post
b4rt3kk
post 21.08.2017, 16:11:45
Post #2





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

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


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'] );


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
alkesz1718
post 21.08.2017, 16:47:55
Post #3





Grupa: Zarejestrowani
Postów: 98
Pomógł: 0
Dołączył: 8.12.2014
Skąd: Czernina

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


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
Go to the top of the page
+Quote Post
b4rt3kk
post 21.08.2017, 17:18:40
Post #4





Grupa: Zarejestrowani
Postów: 1 933
Pomógł: 460
Dołączył: 2.04.2010
Skąd: Lublin

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


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.


--------------------
Jeśli pomogłem, kliknij proszę 'pomógł'. Dzięki.
Go to the top of the page
+Quote Post
alkesz1718
post 21.08.2017, 20:28:03
Post #5





Grupa: Zarejestrowani
Postów: 98
Pomógł: 0
Dołączył: 8.12.2014
Skąd: Czernina

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


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
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 Wersja Lo-Fi Aktualny czas: 26.04.2024 - 12:02