Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Sonda
Forum PHP.pl > Forum > Przedszkole
dg2001
Witam, jako ze pierwszy raz wrzucam swój kod na te forum, proszę o wyrozumiałość.

Ostatnio potrzebny był mi skrypt sondy, jednak wszystkie skrypty dostępne w internecie nie za bardzo mnie zadowoliły, wiec postanowiłem napisać sam coś swojego.

Więc tu moja prośba, o ocenę mojego skryptu smile.gif

  1. <?php
  2. //@autor: Dominik Gawenda
  3. //@wersja: 1.0 | 2010-07-20
  4. //@skrypt sondy
  5. if($mod_sonda !=0) {
  6. if(isset($_POST['glosuj'])) {
  7. $sonda_id = $_POST['sonda_id'];
  8. $pozycja_sondy = $_POST['sonda'];
  9.  
  10. $sSql = mysql_query("SELECT id,ilosc_glosow FROM sonda WHERE id = '".$sonda_id."' ");
  11. $sDane = mysql_fetch_assoc($sSql);
  12. $nowa_ilosc_glosow = $sDane['ilosc_glosow'] + 1;
  13.  
  14. $ssSql = mysql_query("SELECT id,ilosc_glosow FROM sonda_dane WHERE id = '".$pozycja_sondy."' ");
  15. $ssDane = mysql_fetch_assoc($ssSql);
  16. $nowa_ilosc_glosow_pozycja = $ssDane['ilosc_glosow'] + 1;
  17.  
  18. setcookie('sonda'.$sDane['id'], $sDane['id'], time()+60*60*24*365);
  19.  
  20. $update1 = mysql_query("UPDATE sonda SET ilosc_glosow = '".$nowa_ilosc_glosow."' WHERE id=".$sDane['id']." ");
  21. $update2 = mysql_query("UPDATE sonda_dane SET ilosc_glosow = '".$nowa_ilosc_glosow_pozycja."' WHERE id = '".$ssDane['id']."' ");
  22.  
  23. header('Location: '.$config_url);
  24. exit();
  25. }
  26. $sSql = mysql_query("SELECT * FROM sonda WHERE aktywny = '1' ");
  27. $sIle = mysql_num_rows($sSql);
  28. if($sIle != 0) {
  29. while ($sDane = mysql_fetch_assoc($sSql)) {
  30. echo '<div class="box1">';
  31. echo '<div style="text-align:center;padding-bottom:10px;"><b>'.$sDane['nazwa'].'</b><br />'.$sDane['opis'].'</div>';
  32. $ssSql = mysql_query("SELECT * FROM sonda_dane WHERE id_sonda = '".$sDane['id']."' ");
  33. if(isset($_COOKIE['sonda'.$sDane['id']])) {
  34. while ($ssDane = mysql_fetch_assoc($ssSql)) {
  35. $procent = @round(($ssDane['ilosc_glosow'] / $sDane['ilosc_glosow']) * 100);
  36. echo '<div><b>'.$ssDane['pytanie'].'</b> ('.$procent.'%)<div style="background:#ff7e01;width:'.$procent.'%;height:10px;margin:5px 0px 5px 0px;"></div></div>';
  37. }
  38. } else {
  39. echo '<form action="'.$SCRIPT_NAME.'" method="post" name="sonda">';
  40. while ($ssDane = mysql_fetch_assoc($ssSql)) {
  41. echo '<div style="padding:5px;"><input type="hidden" name="sonda_id" value="'.$sDane['id'].'" /><input type="radio" name="sonda" value="'.$ssDane['id'].'" /> <b>'.$ssDane['pytanie'].'</b></div>';
  42. }
  43. echo '<input type="submit" name="glosuj" value="GŁOSUJ" class="sz_buton"><br style="clear:both" /></form>';
  44. }
  45. echo '<div style="text-align:center;padding-top:10px;">Głos oddało: '.$sDane['ilosc_glosow'].' '.Osoby($sDane['ilosc_glosow']).'</div></div>';
  46. }
  47. }
  48. }
  49. ?>


Powyżej skrypt sondy, bez panelu administracyjnego, gdyż jeszcze nie zrobiłem go biggrin.gif
Poniżej prezentacja tabel bazy

Tabela SONDA
  1.  
  2. --
  3. -- Struktura tabeli dla `sonda`
  4. --
  5.  
  6. CREATE TABLE IF NOT EXISTS `sonda` (
  7. `id` tinyint(4) NOT NULL AUTO_INCREMENT,
  8. `nazwa` varchar(250) CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL,
  9. `opis` text CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL,
  10. `ilosc_glosow` int(11) NOT NULL,
  11. `autor` varchar(250) CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL,
  12. `data_od` date NOT NULL,
  13. `data_do` date NOT NULL,
  14. `aktywny` tinyint(1) NOT NULL,
  15. PRIMARY KEY (`id`)
  16. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;


i dla tabeli SONDA_DANE
  1. CREATE TABLE IF NOT EXISTS `sonda_dane` (
  2. `id` tinyint(4) NOT NULL AUTO_INCREMENT,
  3. `id_sonda` tinyint(4) NOT NULL,
  4. `pytanie` varchar(250) CHARACTER SET utf8 COLLATE utf8_polish_ci NOT NULL,
  5. `ilosc_glosow` int(11) NOT NULL,
  6. `aktywny` tinyint(1) NOT NULL,
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC AUTO_INCREMENT=9 ;


Ktoś zapyta dlaczego w dwóch tabelach? Dla tego gdyż skrypt przygotowany dla więcej niże 1 sondy, dlatego opis sondy jest trzymany w osobnej tabeli niż dane dla sondy.

Proszę o ocenę mojego skryptu i ewentualne uwagi co by poprawić. Zastanawiam się jeszcze jak by można mocniej zabezpieczyć sondę, gdyż aktualnie korzysta wyłącznie z ciasteczek. Myślałem jeszcze od zapisywaniu adresów IP w pliku (nie chce zaśmiecać tym bazy) i ewentualnie również sprawdzać czy z takiego IP już głosowano w przypadku ręcznego usunięcia ciastka smile.gif

Pozdrawiam
krzysztof_kf
Podatne na sql injection możesz dodać po if takie coś .


  1.  
  2. else {
  3.  
  4. $sonda_id = mysql_real_escape_string($sonda_id);
  5. $pozycja_sondy = mysql_real_escape_string($pozycja_sondy);
dg2001
Czyli zrobić np tak?

  1. $sonda_id = mysql_real_escape_string($_POST['sonda_id']);
  2. $pozycja_sondy = mysql_real_escape_string($_POST['sonda']);
thomson89
Ale skoro to sonda, to ja nie widzę możliwości przeprowadzenia ataku z poziomu inputa typu radio. Ale mogę się mylić.
krzysztof_kf
Podałem ci już gotowa formułkę .
dg2001
A jakby sprawdzać czy wysłane wartości w $_POST są to wartości numeryczne ? Gdyż za pośrednictwem tych wartości przekuje się tylko ID sondy i ID wpisu w sondzie, nic więcej.

Więc może takie coś:
  1. if(isset($_POST['glosuj'])) {
  2. if(is_numeric($_POST['sonda_id']) && is_numeric($_POST['sonda'])) { //sprawdza czy $_POST jest liczbą
  3. $sonda_id = mysql_real_escape_string($_POST['sonda_id']);
  4. $pozycja_sondy = mysql_real_escape_string($_POST['sonda']);
  5.  
  6. $sSql = mysql_query("SELECT id,ilosc_glosow FROM sonda WHERE id = '".$sonda_id."' ");
  7. $sDane = mysql_fetch_assoc($sSql);
  8. $nowa_ilosc_glosow = $sDane['ilosc_glosow'] + 1;
  9.  
  10. $ssSql = mysql_query("SELECT id,ilosc_glosow FROM sonda_dane WHERE id = '".$pozycja_sondy."' ");
  11. $ssDane = mysql_fetch_assoc($ssSql);
  12. $nowa_ilosc_glosow_pozycja = $ssDane['ilosc_glosow'] + 1;
  13.  
  14. setcookie("sonda".$sDane['id'], $sDane['id'], time()+60*60*24*365);
  15.  
  16. $update1 = mysql_query("UPDATE sonda SET ilosc_glosow = '".$nowa_ilosc_glosow."' WHERE id=".$sDane['id']." ");
  17. $update2 = mysql_query("UPDATE sonda_dane SET ilosc_glosow = '".$nowa_ilosc_glosow_pozycja."' WHERE id = '".$ssDane['id']."' ");
  18.  
  19. header("Location: index.php");
  20. exit();
  21. } else {
  22. header("Location: index.php");
  23. exit();
  24. }
  25. }
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.