Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Metoda zwiększająca ilość głosów.
Forum PHP.pl > Forum > PHP > Object-oriented programming
Jediii
Witam Was wszystkich bardzo serdecznie, gdyż jest to mój pierwszy post.

W ramach ćwiczeń OOP (jestem początkującym w OOP) zacząłem robić sobie taki prosty "system" oceniania artykułów. Pojawił mi się taki problem, że gdy chcę zmienić w tabelce za pomocą "update" ilość głosów, to ilość oczywiście się zmienia, jednak nie tak jak powinno. Mam nadzieję, że będę mógł liczyć na Waszą pomoc. Kod przedstawiam poniżej.

Klasa artykuły:
  1. <?php
  2. class Articles
  3. {
  4. private $article_id;
  5. private $title;
  6. private $content;
  7. private $date;
  8. private $author;
  9.  
  10. public static function getAllArticles()
  11. {
  12. $articles = DatabaseManager::query("SELECT * FROM Articles");
  13. return $articles;
  14. }
  15. }
  16. ?>


Klasa Voter:

  1. <?php
  2. class Voter
  3. {
  4. public static function getArticleVoteQuantity($article_id)
  5. {
  6. $quantity = DatabaseManager::queryBySQL('SELECT vote_quantity FROM Votes WHERE article_id = '.$article_id);
  7. return $quantity[0]['vote_quantity'];
  8. }
  9.  
  10. public static function setVoteQuantity($article_id, $quantity)
  11. {
  12. //$quantity = self::getArticleVoteQuantity($article_id, $quantity);
  13. $update = DatabaseManager::updateTable('UPDATE Votes SET vote_quantity = \''.$quantity.'\' WHERE article_id = '.$article_id);
  14. return $update;
  15. }
  16. }
  17. ?>


Klasa DatabaseManager:
  1. <?php
  2. class DatabaseManager
  3. {
  4. public static function getConnection()
  5. {
  6. $connection = new mysqli(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
  7.  
  8. if (mysqli_connect_errno())
  9. {
  10. echo "Nie połączono!";
  11. }
  12. else
  13. {
  14. $connection->query('SET NAMES \'uft8\'');
  15. return $connection;
  16. }
  17. }
  18.  
  19. public static function updateTable($query)
  20. {
  21. $conn = self::getConnection();
  22.  
  23. $conn->query($query);
  24.  
  25. if ($conn->affected_rows)
  26. {
  27. return true;
  28. }
  29. else
  30. {
  31. return false;
  32. }
  33.  
  34. mysqli_close($conn);
  35. }
  36. }
  37. ?>


index.php:
  1. <?php
  2. include_once 'resources/config.php';
  3. ?>
  4. <!DOCTYPE html>
  5. <html>
  6. <head>
  7. <title></title>
  8. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  9. <link rel="stylesheet" type="text/css" href="css/style.css" />
  10. <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
  11. <script type="text/javascript" src="js/scripts.js"></script>
  12. </head>
  13. <body>
  14. <?php
  15.  
  16. $allArticles = new Articles;
  17. $articles = $allArticles -> getAllArticles();
  18.  
  19. foreach ($articles as $article)
  20. {
  21. echo $article['title'];
  22. echo "<br />";
  23. echo $article['content'];
  24. echo '
  25. <div class="gwiazdki">
  26. <a href="index.php?article_id='.$article['article_id'].'&vote=1">1</a>
  27. <a href="index.php?article_id='.$article['article_id'].'&vote=2">3</a>
  28. <a href="index.php?article_id='.$article['article_id'].'&vote=3">3</a>
  29. <a href="index.php?article_id='.$article['article_id'].'&vote=4">4</a>
  30. <a href="index.php?article_id='.$article['article_id'].'&vote=5">6</a>
  31. </div>
  32. ';
  33. $votes = Voter::getArticleVoteQuantity($article['article_id']);
  34. echo 'Liczba głosów: '.$votes;
  35.  
  36. if (isset($_GET['article_id']))
  37. {
  38. Voter::setVoteQuantity($_GET['article_id']);
  39. }
  40.  
  41. echo "<br /><br />";
  42. }
  43. ?>
  44.  
  45. </body>
  46. </html>
Sephirus
Po 1. Nie używaj [code] tylko [php] - to pomaga w czytaniu tego co napisałeś wink.gif
Po 2. Mógłbyś zabezpieczać zmienne wrzucane do SQL'a przez SQL injection - na forum masz sporo na ten temat.
i po 3. w twoim kodzie nie widzę błędu żadnego - napisz więcej jak to liczy - co dajesz, czego się spodziewasz a co wychodzi
wink.gif
Jediii
Cytat(Sephirus @ 3.11.2011, 15:18:15 ) *
Po 1. Nie używaj [code] tylko [php] - to pomaga w czytaniu tego co napisałeś wink.gif
Po 2. Mógłbyś zabezpieczać zmienne wrzucane do SQL'a przez SQL injection - na forum masz sporo na ten temat.
i po 3. w twoim kodzie nie widzę błędu żadnego - napisz więcej jak to liczy - co dajesz, czego się spodziewasz a co wychodzi


1. Już poprawiłem. Rzeczywiście, lepiej wygląda. smile.gif
2. Tak, wiem o tym, jednak gdy mam jakieś problemy, pracuję na jak najmniejszej ilości kodu, dlatego tego tutaj nie umieściłem.
3. Właśnie ja tak samo nic w nim nie widzę, jednak coś jest raczej nie tak, bo gdy klikam na na jakikolwiek link w klasie gwiazdki, by zagłosować, to zamiast zwiększyć ilość głosów o 1 robi to o 5 i nie mam pojęcia dlaczego.
Uriziel01
Skoro licznik zwięszka się o 5 no to jasno widać że coś wykonuje się w tej pętli foreach()

Wyrzuć fragment
  1. if (isset($_GET['article_id']))
  2. {
  3. Voter::setVoteQuantity($_GET['article_id']);
  4. }


poza tę pętlę i wszystko powinno być już ok.
Jediii
Cytat(Uriziel01 @ 3.11.2011, 23:52:31 ) *
Wyrzuć fragment
  1. if (isset($_GET['article_id']))
  2. {
  3. Voter::setVoteQuantity($_GET['article_id']);
  4. }


poza tę pętlę i wszystko powinno być już ok.


Bardzo dziękuję za pomoc. Rozwiązało to mój problem.
Crozin
Taka mała uwaga: jak na OOP strasznie nadużywasz metod statycznych, przez co ten kod de facto z OOP mało ma wspólnego.
Jediii
Cytat(Crozin @ 4.11.2011, 14:53:59 ) *
Taka mała uwaga: jak na OOP strasznie nadużywasz metod statycznych, przez co ten kod de facto z OOP mało ma wspólnego.


Gdy bliżej przyjrzałem się temu kodowi też to zauważyłem i wprowadziłem zmiany, np klasa "Article" nie jest już statyczna . Dziękuję za zwrócenie mi uwagi. Szczerze mówiąc, to nie bardzo niekiedy wiem, jakiej użyć metody, statycznej czy nie.
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.