Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][SQL]Ranking
Forum PHP.pl > Forum > Przedszkole
RoysoN
Witam! Jestem początkujący w PHP. Stworzyłem taki ranking filmów:
WYŚWIETLANIE & GŁOSOWANIE:
Wyświetla rekordy(w tym przypadku filmy): id | nazwa | tematyka | lwys. lwys to tutaj głosy, które użytkownik może dodawać lub ujmować.
  1. <?php
  2.  
  3. require "connection.php";
  4. connection();
  5.  
  6.  
  7. $wynik = mysql_query("SELECT * FROM filmy ORDER BY lwys DESC LIMIT 10")
  8. or die('Błąd');
  9.  
  10. if(mysql_num_rows($wynik) > 0) {
  11. echo "<table width='168px'>";
  12. while($r = mysql_fetch_assoc($wynik)) {
  13. if (isset($_POST["bob".$r['id']])) {
  14. mysql_query("UPDATE filmy SET lwys=lwys + 1 where id = ".$r['id'].";");
  15. echo "głos dodany";
  16. } else if(isset($_POST["bob2".$r['id']])){
  17. mysql_query("UPDATE filmy SET lwys=lwys - 1 where id = ".$r['id'].";");
  18. echo "głos ujety";
  19. } else {
  20. echo "<tr><div id='wiersz'>";
  21. echo "<td>".$r['id']."</td>";
  22. echo "<td>".$r['nazwa']."</td>";
  23. echo "<td>".$r['tematyka']."</td>";
  24. echo "<td>".$r['lwys']."</td>";
  25. echo "<td> <form action='' method='POST'><input type='submit' name='bob".$r['id']."' value='' style='background:url(grafika/tak.gif); border:0; height:15px; width:15px''><input type='submit' name='bob2".$r['id']."' value='' style='background:url(grafika/nie.gif); border:0; height:15px; width:15px'></form></td>";
  26. echo "</div></tr>";
  27.  
  28. }
  29.  
  30.  
  31. }
  32. echo "</table>";
  33. }
  34. ?>
  35.  


DODAWANIE FILMÓW:
  1. <html>
  2. <body>
  3.  
  4. <form action="dodajfilm.php" method="post">
  5. nazwa:<br />
  6. <input type="text" name="nazwa" /><br />
  7. tematyka:<br />
  8. <select name='tematyka'>
  9.  
  10. <option>Motoryzacja</option>
  11. <option>Muzyka</option>
  12. <option>Wydarzenia</option>
  13. <option>Inne</option>
  14.  
  15. </select>
  16. <input type="submit" value="dodaj" />
  17. </form>
  18.  
  19. <?php
  20. $nazwa = $_POST['nazwa'];
  21. $tematyka = $_POST['tematyka'];
  22.  
  23. if($nazwa and $tematyka) {
  24.  
  25. $connection = @mysql_connect('localhost', 'root', '')
  26. or die('Brak połączenia z serwerem MySQL');
  27. $db = @mysql_select_db('webserv', $connection)
  28. or die('Błąd');
  29.  
  30. $ins = @mysql_query("INSERT INTO filmy SET id=null, nazwa='$nazwa', tematyka='$tematyka', lwys=0");
  31.  
  32. if($ins) echo "OK";
  33. else echo "error";
  34.  
  35. mysql_close($connection);
  36. }
  37.  
  38. ?>
  39.  
  40. </body>
  41. </html>

Gdyby ktoś chciał to ma tu gotowiec.
Ale mam pytanie odnośnie, jaki sposób polecali byście do zabezpieczenia przed powtórnym głosowaniem? Słyszałem, że tworzy się bazę danych z numerami IP, ale kolega wspomniał coś o ciasteczkach...
bialko0019
Najczęściej zabezpiecza się poprzez ciasteczka winksmiley.jpg ALE problem w ciasteczkach jest przecież taki, że jak ktoś jest uparty zagłosować jeszcze raz, sprawdzi właśnie ciasteczka i usunie i powtórnie zagłosuje winksmiley.jpg

Osobiście na stronie mam możliwość odpowiadania w ankietach. Rozwiązałbym to w taki sposób ( nie wiem czy najodpowiedniejszy ale.. ) , że dodajesz nową tabelę np. głosujący. W niej, gdy ktoś zagłosuje dodajesz nr IP gościa i w drugiej kolumnie ID danego rankingu winksmiley.jpg Podczas wysyłania opini, sprawdzasz czy istnieje już do tego rankingu rekord z tym IP i juz winksmiley.jpg NO JEŚLI ktoś dalej uparty to i zmieni IP i dalej zagłosuje ;p

Można było by się jeszcze pokusić, do sprawdzania przeglądarki usera a nie tylko IP winksmiley.jpg ALE na to też jest obejście....
sadistic_son
Na wszystko jest obejscie. Sprawdzanie po IP nie daje prawie zadnej gwarancji, jak ktos korzysta np. z DSLa to IP mu sie zmienia automatycznie co kilka-kilkanascie godzin.
RoysoN
tak myśle, że przecietny użytkownik nie będzie raczej wgłębiać się w cookiesy, ip itd wiec takie podstawowe zabezpieczenia starcza, kolega mi właśnie polecał ciasteczka, ale nigdy wcześniej nie bawiłem się nimi (mama mi powtarzała żebym nie bawił się jedzeniem biggrin.gif haha.gif). tak serio to z ciasteczkami bym spróbował, może to będzie lepsze rozwiązanie niż od razu baza danych. tak mi się zdaje, że przy tym jest więcej dłubania.
sadistic_son
Przy bazie wiecej dlubania?
Tabela IP-ranking
id
id_filmy
ip

I gotowe. Potem przy glosowaniu sprawdzasz czy to id filmu nie jest w jednym rekordzie z IP i juz.
  1. $sql="SELECT * FROM ip_ranking WHERE id_film = ".$id_filmu." AND ip = ' ".$_SERVER['REMOTE_ADDR']." ' ";

Najlepiej zrob sprawdzenie i po IP i po ciachach.
bialko0019
no dokładnie, zrób lepiej po bazie danych i ciasteczkach, bo każdy jeden użytkownik - a przynajmniej najczęsciej - umie kasować ciasteczka, albo też spora część użytkowników usuwa co jakiś czas automatycznie. Bezpieczniejsze będzie wyjście z bazą danych i ciasteczkami. Z bazą wiesz jak zrobić, podał kolega powyżej, a ciasteczka również prosto, nawet Twój kolega Ci podpowiedział winksmiley.jpg

Pozdrawiam!
RoysoN
dzieki stary! jestes wielki!
  1. <?php
  2.  
  3. require "connection.php";
  4. connection();
  5.  
  6.  
  7. $wynik = mysql_query("SELECT * FROM filmy ORDER BY lwys DESC LIMIT 10")
  8. or die('Błąd zapytania');
  9.  
  10. if(mysql_num_rows($wynik) > 0) {
  11. echo "<table width='168px'>";
  12. while($r = mysql_fetch_assoc($wynik)) {
  13. if (isset($_POST["bob".$r['id']])) {
  14. $ipuz = mysql_query("SELECT * FROM iprank WHERE idfilm = ".$r[id]." AND ip = ' ".$_SERVER['REMOTE_ADDR']." ' ;");
  15. if ($ipuz) {
  16. echo "Głosowałeś już!";
  17. } else {
  18. mysql_query("UPDATE filmy SET lwys=lwys + 1 where id = ".$r['id'].";");
  19. echo "Głos dodano!";
  20. mysql_query("insert into iprank set id=null, idfilm='$r[id]', ip='$_SERVER[REMOTE_ADDR]'"); //IP ADD
  21. }
  22. } else if(isset($_POST["bob2".$r['id']])){
  23. $ipuz = mysql_query("SELECT * FROM iprank WHERE idfilm = ".$r[id]." AND ip = ' ".$_SERVER['REMOTE_ADDR']." ' ;");
  24. if ($ipuz) {
  25. echo "Głosowałeś już!";
  26. } else {
  27. mysql_query("UPDATE filmy SET lwys=lwys - 1 where id = ".$r['id'].";");
  28. echo "Głos obniżony!";
  29. mysql_query("insert into iprank set id=null, idfilm='$r[id]', ip='$_SERVER[REMOTE_ADDR]'"); //IP ADD
  30. }
  31. } else {
  32. echo "<tr><div id='wiersz'>";
  33. echo "<td>".$r['id']."</td>";
  34. echo "<td>".$r['nazwa']."</td>";
  35. echo "<td>".$r['tematyka']."</td>";
  36. echo "<td>".$r['lwys']."</td>";
  37. echo "<td> <form action='' method='POST'><input type='submit' name='bob".$r['id']."' value='' style='background:url(grafika/tak.gif); border:0; height:15px; width:15px''><input type='submit' name='bob2".$r['id']."' value='' style='background:url(grafika/nie.gif); border:0; height:15px; width:15px'></form></td>";
  38. echo "</div></tr>";
  39.  
  40. }
  41.  
  42.  
  43. }
  44. echo "</table>";
  45. }
  46. ?>
Alson
Jak już było powiedziane IP jest zmienne i bardzo łatwo jest obejść takie coś -> Netia/Neostrada -> Reconnect + Czyszczenie Ciasteczek.

Zamiast dodawać IP do bazy może lepiej zrobić możliwość oceniania tylko dla zalogowanych i sprawdzać po nicku czy nie głosował oceniał danego filmu. Moim zdaniem tak jest najbezpieczniej.

Pozdrawiam Alson.
RoysoN
Szczerze mówiąc jeszcze nigdy nie pisałem systemu logowania z możliwością rejestracji.
Sprawdzanie IP to tymczasowy sposób, Aż nie nauczę się sesji . Przy następnej modernizacji serwisu wprowadzę system logowania. 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.