За последние 24 часа нас посетили 22836 программистов и 1266 роботов. Сейчас ищут 767 программистов ...

Сделал небольшой скрипт опроса

Тема в разделе "PHP для новичков", создана пользователем Dimon2x, 20 окт 2017.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.199
    Симпатии:
    184
    Протестируйте пожалуйста http://dkakharov.000webhostapp.com/

    Иногда будет выдавать результат на +/- 1 процент от ста.

    Вот весь код

    db.php

    PHP:
    1. <?php
    2.     error_reporting(E_ALL);
    3.    
    4.     $host = 'localhost';
    5.     $user = 'root';
    6.     $password = '';
    7.     $db_name = 'quiz';
    8.  
    9.    
    10.     $link = mysqli_connect($host, $user, $password, $db_name) or die(mysqli_error($link));
    11.    
    12.     mysqli_query($link, "SET NAMES 'utf8'");
    13. ?>
    index.php

    PHP:
    1. <?php
    2.     require_once ('db.php');
    3.    
    4.     $sql = "SELECT * FROM question";
    5.    
    6.     $query = mysqli_query($link, $sql) or die(mysqli_error($link));
    7.    
    8.     for ($res = []; $row = mysqli_fetch_assoc($query); $res[] = $row);
    9.    
    10.     echo '<pre>';
    11.         //print_r($res);
    12.     echo '</pre>';
    13.    
    14. ?>
    15.  
    16. <!DOCTYPE html>
    17. <html>
    18.     <head>
    19.         <title>Опрос</title>
    20.         <meta charset="utf-8">
    21.         <link rel="stylesheet" href="style.css">
    22.     </head>
    23.     <body>
    24.         <div class="main">
    25.             <h1>Опрос</h1>
    26.            
    27.             <p class="result">Укажите Ваш возраст:</p>
    28.            
    29.             <form action="" method="get">
    30.                 <?php
    31.                     foreach($res as $key) {
    32.                         echo '<p style="font-weight: bold;"><label><input type="radio" name="age" value="'.$key['variant'].'">'.$key['titile'].'</label></p>';
    33.                     }
    34.                 ?>
    35.                 <input type="submit" class="btn-answer">
    36.             </form>
    37.            
    38.             <?php
    39.                 if(!empty($_GET['age'])) {
    40.                    
    41.                     $needAnswer = "SELECT * FROM answer WHERE question_id =" . $_GET['age'];
    42.                     $resultNeedAnswer = mysqli_query($link, $needAnswer) or die(mysqli_error($link));
    43.                     $result = mysqli_fetch_assoc($resultNeedAnswer);
    44.                    
    45.                     $oldCount = $result['count_answer'];
    46.                     $newCount = $oldCount + 1;
    47.                    
    48.                    
    49.                     echo '<pre>';
    50.                         //print_r($result);
    51.                     echo '</pre>';
    52.                    
    53.                    
    54.                     $sqlUpdate = "UPDATE answer
    55.                                SET count_answer = '".$newCount."'
    56.                                WHERE question_id = " . $_GET['age'];
    57.                                
    58.                     mysqli_query($link, $sqlUpdate) or die(mysqli_error($link));
    59.                    
    60.                    
    61.                    
    62.                     $allAnswer = "SELECT * FROM answer";
    63.                     $resultAllAnswer = mysqli_query($link, $allAnswer) or die(mysqli_error($link));
    64.                     for ($resAllAnswer = []; $rowAllAnswer = mysqli_fetch_assoc($resultAllAnswer); $resAllAnswer[] = $rowAllAnswer);
    65.                    
    66.                     echo '<pre>';
    67.                         //print_r($resAllAnswer);
    68.                     echo '</pre>';
    69.                    
    70.                     $allPeople = 0;
    71.                    
    72.                     foreach($resAllAnswer as $k) {
    73.                         $allPeople = $allPeople + $k['count_answer'];
    74.                     }
    75.                    
    76.                    
    77.                     $onePercent = $allPeople/100; //для погрешности
    78.                    
    79.                    
    80.                     $oneItem = round($resAllAnswer[0]['count_answer'] / $onePercent);
    81.                     $two = round($resAllAnswer[1]['count_answer'] / $onePercent);
    82.                     $three = round($resAllAnswer[2]['count_answer'] / $onePercent);
    83.                    
    84.                    
    85.                    
    86.                     echo '<p>Результат опроса</p>';
    87.                    
    88.                     echo '<div class="result">
    89.                        <p>Общее количество опрошенных: <span class="bold">'.$allPeople.'</span><p>
    90.                      
    91.                        <ol>
    92.                            <li>.   Ответили "'.$res[0]['titile'].'": <span class="bold">'.$resAllAnswer[0]['count_answer'].'</span> человек, <span class="bold">'.$oneItem.'%</span> опрошенных</li>
    93.                            <li>.   Ответили "'.$res[1]['titile'].'": <span class="bold">'.$resAllAnswer[1]['count_answer'].'</span> человек, <span class="bold">'.$two.'%</span> опрошенных</li>
    94.                            <li>.   Ответили "'.$res[2]['titile'].'": <span class="bold">'.$resAllAnswer[2]['count_answer'].'</span> человек, <span class="bold">'.$three.'%</span> опрошенных</li>
    95.                        </ol>
    96.                    </div>';
    97.                    
    98.                     echo '<br><br>';
    99.                    
    100.                     $left1 = ($oneItem / 2) - 2;
    101.                     $left2 = ($two / 2) - 2;
    102.                     $left3 = ($three / 2) - 2;
    103.                    
    104.                     echo '<div>
    105.                        <p style="font-weight: bold;">Ответ "'.$res[0]['titile'].'"</p>
    106.                        <p class="gradient" style="position: relative; background: linear-gradient(to right,  #1e5799 '.$oneItem.'%, #f5f5f5 '.$oneItem.'%);"><span style="position: absolute; top: 0; left:'.$left1.'%; color: white;">'.$oneItem.'%</span></p>
    107.                    </div>';
    108.                    
    109.                     echo '<div>
    110.                        <p style="font-weight: bold;">Ответ "'.$res[1]['titile'].'"</p>
    111.                        <p class="gradient" style="position: relative; background: linear-gradient(to right,  #1e5799 '.$two.'%, #f5f5f5 '.$two.'%);"><span style="position: absolute; top: 0; left:'.$left2.'%; color: white;">'.$two.'%</span></p>
    112.                    </div>';
    113.                    
    114.                     echo '<div>
    115.                        <p style="font-weight: bold;">Ответ "'.$res[2]['titile'].'"</p>
    116.                        <p class="gradient" style="position: relative; background: linear-gradient(to right,  #1e5799 '.$three.'%, #f5f5f5 '.$three.'%);"><span style="position: absolute; top: 0; left:'.$left3.'%; color: white;">'.$three.'%</span></p>
    117.                    </div>';
    118.                    
    119.                 }
    120.                
    121.                 /*
    122.                
    123.                     1. 130 человек = 100%
    124.                     2. 130/100=1,3 (один процент)
    125.                     3. 60/1,3 = 46% за первый пункт
    126.                     4. 30/1,3 = 23% за второй пункт
    127.                     5. 40/1,3 = 31% за третий пункт.
    128.                    
    129.                    
    130.                    
    131.                     1. 34 человека = 100%
    132.                     2. 34/100 = 0.34
    133.                     3. 3/0.34 = 0
    134.                     4. 2/0.34 = 100
    135.                     5. 0/0.34 = 0
    136.                    
    137.                 */
    138.             ?>
    139.         </div>
    140.     </body>
    141. </html>    
    style.css

    Код (CSS):
    1. .main {
    2.     width: 620px;
    3.     margin: 0 auto;
    4.     padding: 10px;
    5. }
    6.  
    7.  
    8. ol {
    9.     counter-reset: myCounter;
    10.     padding: 0;
    11. }
    12.  
    13. li {
    14.     list-style: none;
    15. }
    16.  
    17. li:before {
    18.     counter-increment: myCounter;
    19.     content:counter(myCounter);
    20.     color: #31708f;
    21.     font-weight: bold;
    22. }
    23.  
    24. .result {
    25.     background: #d9edf7;
    26.     border-radius: 5px;
    27.     padding: 15px;
    28.     color: #31708f;
    29. }
    30.  
    31. .btn-answer {
    32.     color: white;
    33.     background: #398439;
    34.     border-radius: 5px;
    35.     width: 100%;
    36.     border: 1px solid #255625;
    37.     padding: 6px 12px;
    38. }
    39.  
    40. .bold {
    41.     font-weight: bold;
    42.    
    43. }
    44.  
    45. .gradient {
    46.     width: 100%;
    47.     height: 20px;
    48.     background: #337AB7;
    49.     border-radius: 5px;
    50.     box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
    51. }
    база

    Код (Text):
    1. -- phpMyAdmin SQL Dump
    2. -- version 4.6.5.2
    3. -- https://www.phpmyadmin.net/
    4. --
    5. -- Хост: 127.0.0.1
    6. -- Время создания: Окт 20 2017 г., 14:50
    7. -- Версия сервера: 10.1.21-MariaDB
    8. -- Версия PHP: 7.1.1
    9.  
    10. SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
    11. SET time_zone = "+00:00";
    12.  
    13.  
    14. /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    15. /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    16. /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    17. /*!40101 SET NAMES utf8mb4 */;
    18.  
    19. --
    20. -- База данных: `quiz`
    21. --
    22.  
    23. -- --------------------------------------------------------
    24.  
    25. --
    26. -- Структура таблицы `answer`
    27. --
    28.  
    29. CREATE TABLE `answer` (
    30.   `id` int(11) NOT NULL,
    31.   `question_id` int(11) NOT NULL,
    32.   `count_answer` int(11) NOT NULL DEFAULT '0'
    33. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    34.  
    35. --
    36. -- Дамп данных таблицы `answer`
    37. --
    38.  
    39. INSERT INTO `answer` (`id`, `question_id`, `count_answer`) VALUES
    40. (1, 1, 0),
    41. (2, 2, 0),
    42. (3, 3, 0);
    43.  
    44. -- --------------------------------------------------------
    45.  
    46. --
    47. -- Структура таблицы `question`
    48. --
    49.  
    50. CREATE TABLE `question` (
    51.   `id` int(11) NOT NULL,
    52.   `titile` varchar(256) NOT NULL,
    53.   `variant` int(11) NOT NULL
    54. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    55.  
    56. --
    57. -- Дамп данных таблицы `question`
    58. --
    59.  
    60. INSERT INTO `question` (`id`, `titile`, `variant`) VALUES
    61. (1, 'до 20 лет', 1),
    62. (2, 'от 20 до 30', 2),
    63. (3, 'более 30', 3);
    64.  
    65. --
    66. -- Индексы сохранённых таблиц
    67. --
    68.  
    69. --
    70. -- Индексы таблицы `answer`
    71. --
    72. ALTER TABLE `answer`
    73.   ADD PRIMARY KEY (`id`);
    74.  
    75. --
    76. -- Индексы таблицы `question`
    77. --
    78. ALTER TABLE `question`
    79.   ADD PRIMARY KEY (`id`);
    80.  
    81. --
    82. -- AUTO_INCREMENT для сохранённых таблиц
    83. --
    84.  
    85. --
    86. -- AUTO_INCREMENT для таблицы `answer`
    87. --
    88. ALTER TABLE `answer`
    89.   MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
    90. --
    91. -- AUTO_INCREMENT для таблицы `question`
    92. --
    93. ALTER TABLE `question`
    94.   MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;
    95. /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    96. /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    97. /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
     
  2. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    #2 Zuldek, 20 окт 2017
    Последнее редактирование: 20 окт 2017
    Dimon2x нравится это.
  3. VGlad

    VGlad Новичок

    С нами с:
    20 мар 2017
    Сообщения:
    17
    Симпатии:
    2
    Проголосовал за стариков +500 раз, спасибо "Easy Auto Refresh" :)
    Делай привязку по IP :)
     
    Dimon2x нравится это.
  4. VGlad

    VGlad Новичок

    С нами с:
    20 мар 2017
    Сообщения:
    17
    Симпатии:
    2
    Конечно, теперь то кто угодно возьмет верх, я же не проверял инъекцию ;)
     
  5. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    чей та? ))
    [​IMG]