За последние 24 часа нас посетили 63176 программистов и 1742 робота. Сейчас ищут 1055 программистов ...

Как изготовить калькулятор?

Тема в разделе "PHP для новичков", создана пользователем Валерий Е, 1 ноя 2015.

  1. Валерий Е

    Валерий Е Активный пользователь

    С нами с:
    26 авг 2015
    Сообщения:
    67
    Симпатии:
    0
    Учусь PHP. Условие задачи - сделать калькулятор: https://cloud.mail.ru/public/D6tj/Wd4Q3xSPU Получилось так:
    Код (PHP):
    1. // Функция отображения формы ввода.
    2.     function show_form1()
    3.     {
    4.         echo '<html>';
    5.         echo '<head>';
    6.         echo "<title>Калькулятор</title>";
    7.         echo '</head>';
    8.         echo '<body>';
    9.         echo '<form action="calc.php" method="post" >';
    10.         echo '<input type="text" name="a" />';
    11.         echo ' + ';
    12.         echo '<input type="text" name="b" />';
    13.         echo ' <input type="submit" value="=" />';
    14.         echo '</p>';
    15.         echo '<p>';
    16.         echo '<input type="text" name="c" />' . ' ';
    17.         echo ' - ';
    18.         echo '<input type="text" name="d" />';
    19.         echo ' <input type="submit" value="=" />';
    20.         echo '</p>';
    21.         echo '<p>';
    22.         echo '<input type="text" name="e" />';
    23.         echo ' x ';
    24.         echo '<input type="text" name="f" />';
    25.         echo ' <input type="submit" value="=" />';
    26.         echo '</p>';
    27.         echo '<p>';
    28.         echo '<input type="text" name="a" />' . ' ';
    29.         echo ' : ';
    30.         echo '<input type="text" name="b" />';
    31.         echo ' <input type="submit" value="=" />';
    32.         echo '</form>';
    33.         echo '</p>';
    34.         echo '</body>';
    35.         echo '</html>';
    36.     }
    37.     
    38.     // Функция вывода результата.
    39.     function show_result($a, $b, $c, $d, $e, $f, $q, $g)
    40.     {
    41.         $resultz = $a + $b;
    42.         $result_ = $c - $d;
    43.         $resultx = $e * $f;        
    44.         if ($g != 0)
    45.         {
    46.             $result_division = $q / $g;
    47.         }
    48.         else ($result_division = 'Делить на 0 нельзя!');
    49.         
    50.         echo '<html>';
    51.         echo '<head>';
    52.         echo "<title>Калькулятор</title>";
    53.         echo '</head>';
    54.         echo '<body>';
    55.         echo '<form action="calc.php" method="post" >';
    56.         echo '<p>';
    57.         echo '<input type="text" name="a" />';
    58.         echo ' + ';
    59.         echo '<input type="text" name="b" />';
    60.         echo ' <input type="submit" value="=" />';
    61.         echo " <b>$resultz</b>";
    62.         echo '</p>';
    63.         echo '<p>';
    64.         echo '<input type="text" name="c" />' . ' ';
    65.         echo ' - ';
    66.         echo '<input type="text" name="d" />';
    67.         echo ' <input type="submit" value="=" />';
    68.         echo " <b>$result_</b>";
    69.         echo '</p>';
    70.         echo '<p>';
    71.         echo '<input type="text" name="e" />';
    72.         echo ' x ';
    73.         echo '<input type="text" name="f" />';
    74.         echo ' <input type="submit" value="=" />';
    75.         echo " <b>$resultx</b>";
    76.         echo '</p>';
    77.         echo '<p>';
    78.         echo '<input type="text" name="q" />' . ' ';
    79.         echo ' : ';
    80.         echo '<input type="text" name="g" />';
    81.         echo ' <input type="submit" value="=" />';
    82.         echo " <b>$result_division</b>";
    83.         echo '</p>';
    84.         echo '</form>';
    85.         echo '</body>';
    86.         echo '</html>';
    87.     }
    88.     // Точка входа.
    89.     
    90.     // Показываем результат операции или форму ввода.
    91.     if (isset($_POST['a']) && isset($_POST['b'])) 
    92.     {
    93.         echo show_result($_POST['a'], $_POST['b'], $_POST['c'], $_POST['d'], $_POST['e'], $_POST['f'], $_POST['q'], $_POST['g']);    
    94.     }
    95.     elseif (isset($_POST['c']) && isset($_POST['d'])) 
    96.     {
    97.         echo show_result($_POST['a'], $_POST['b'], $_POST['c'], $_POST['d'], $_POST['e'], $_POST['f'], $_POST['q'], $_POST['g']);
    98.     }
    99.     elseif (isset($_POST['e']) && isset($_POST['f'])) 
    100.     {
    101.         echo show_result($_POST['a'], $_POST['b'], $_POST['c'], $_POST['d'], $_POST['e'], $_POST['f'], $_POST['q'], $_POST['g']);
    102.     }
    103.     elseif (isset($_POST['q']) && isset($_POST['g'])) 
    104.     {
    105.         echo show_result($_POST['a'], $_POST['b'], $_POST['c'], $_POST['d'], $_POST['e'], $_POST['f'], $_POST['q'], $_POST['g']);
    106.     }
    107.     else
    108.     {
    109.         show_form1();    
    110.     } 
    На экран выводится корявый результат: https://cloud.mail.ru/public/3Nz5/69vqFRbFg
    Во-первых, при выводе результата во всех полях input по умолчанию стоят нули и при выполнении одной операции выводятся результаты и остальных операций с нулями.
    Во-вторых, самое главное неудобство: при выводе результата операции в полях input исчезают введенные числа и поэтому не видно с какими числами производилось вычисление. После отправки формы не сохраняются на экране введенные данные, а выводится только результат вычислений.
    Можно-ли устранить и как эти недостатки? При условии, что урок по кукам и сессиям еще не пройден.
     
  2. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    Формируете новую форму, подставляете в инпуты значения из $_POST
     
  3. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    да, можно, выше сказали как.
    Все полученные данные от пользователя пропускай через https://secure.php.net/manual/ru/function.htmlentities.php чтобы избежать XSS.
    http://phpfaq.ru/tech/safety
     
  4. joshadow

    joshadow Активный пользователь

    С нами с:
    24 фев 2015
    Сообщения:
    10
    Симпатии:
    1
    в коде в комментариях описал свои мысли
    Код (PHP):
    1. // Функция вывода результата.
    2.     function show_result($a, $b, $c, $d, $e, $f, $q, $g)
    3.     {
    4.                 // это вывод всего, что пришло по POST запросу в похожем на объявление массива виде
    5.                 // так удобно отлаживать работу. Вы ему переменную, он Вам - тип и содержимое.
    6.                 // Присмотритесь к ниму по внимательнее :-)
    7.                 var_dump($_POST);
    8.                 
    9.         $resultz = $a + $b;
    10.         $result_ = $c - $d;
    11.         $resultx = $e * $f;        
    12.         if ($g != 0)
    13.         {
    14.             $result_division = $q / $g;
    15.         }
    16.         else ($result_division = 'Делить на 0 нельзя!');
    17.         
    18.         echo '<html>';
    19.         echo '<head>';
    20.         echo "<title>Калькулятор</title>";
    21.         echo '</head>';
    22.         echo '<body>';
    23.         echo '<form action="calc.php" method="post" >';
    24.         echo '<p>';
    25.                 // я сделал подстановку для двух полей, дальше можно развить по аналогии
    26.                 // в input есть поле value - оно задаёт стартовое значение для элемента управления
    27.                 // теги html терпят использование как ' ', так и " ". Только желательно что-то одно
    28.         echo "<input type='text' name='a' value='$a'/>"; // !!!!!!!!!!!!
    29.         echo ' + ';
    30.         echo "<input type='text' name='b' value='$b'/>"; // !!!!!!!!!!!!
    31.         echo ' <input type="submit" value="=" />';
    32.         echo " <b>$resultz</b>";
    33.         echo '</p>';
    34.         echo '<p>';
    35.         echo '<input type="text" name="c" />' . ' ';
    36.         echo ' - ';
    37.         echo '<input type="text" name="d" />';
    38.         echo ' <input type="submit" value="=" />';
    39.         echo " <b>$result_</b>";
    40.         echo '</p>';
    41.         echo '<p>';
    42.         echo '<input type="text" name="e" />';
    43.         echo ' x ';
    44.         echo '<input type="text" name="f" />';
    45.         echo ' <input type="submit" value="=" />';
    46.         echo " <b>$resultx</b>";
    47.         echo '</p>';
    48.         echo '<p>';
    49.         echo '<input type="text" name="q" />' . ' ';
    50.         echo ' : ';
    51.         echo '<input type="text" name="g" />';
    52.         echo ' <input type="submit" value="=" />';
    53.         echo " <b>$result_division</b>";
    54.         echo '</p>';
    55.         echo '</form>';
    56.         echo '</body>';
    57.         echo '</html>';
    58.     }
    59.     // Точка входа.
    60.     
    61.         // это расскажет о том, что переменная, в данном случае, есть всегда, но в ней ничего нет.
    62.         // стоит подумать использовать empty вместо isset
    63.         if (isset($_POST['a'])) {
    64.             echo "EEEEEE MMMM AAAAA EEEE !!!!";
    65.         };
    66.         
    67.     // Показываем результат операции или форму ввода.
    68.     if (isset($_POST['a']) && isset($_POST['b'])) 
    69.     {
    70.         echo show_result($_POST['a'], $_POST['b'], $_POST['c'], $_POST['d'], $_POST['e'], $_POST['f'], $_POST['q'], $_POST['g']);    
    71.     }
    72.     elseif (isset($_POST['c']) && isset($_POST['d'])) 
    73.     {
    74.         echo show_result($_POST['a'], $_POST['b'], $_POST['c'], $_POST['d'], $_POST['e'], $_POST['f'], $_POST['q'], $_POST['g']);
    75.     }
    76.     elseif (isset($_POST['e']) && isset($_POST['f'])) 
    77.     {
    78.         echo show_result($_POST['a'], $_POST['b'], $_POST['c'], $_POST['d'], $_POST['e'], $_POST['f'], $_POST['q'], $_POST['g']);
    79.     }
    80.     elseif (isset($_POST['q']) && isset($_POST['g'])) 
    81.     {
    82.         echo show_result($_POST['a'], $_POST['b'], $_POST['c'], $_POST['d'], $_POST['e'], $_POST['f'], $_POST['q'], $_POST['g']);
    83.     }
    84.     else
    85.     {
    86.         show_form1();    
    87.     } 
     
  5. Валерий Е

    Валерий Е Активный пользователь

    С нами с:
    26 авг 2015
    Сообщения:
    67
    Симпатии:
    0
    joshadow, большое спасибо за помощь! Все конкретно и понятно. Я ведь сам пробовал в теги input устанавливать в качестве атрибута значения переменные. Но у меня это не работало из-за неправильного использования кавычек.
    Оказывается формировать новую форму и не требуется, а достаточно и этих двух форм, если внести изменения в существующую форму!
    Мне кажется функция isset здесь уместна. if (isset($_POST['a']) означает: если системная переменная $_POST содержит параметр a. Попробовал использовать вместо isset и empty и !empty. Тогда некорректно выводится при первой загрузке калькулятора show_form1(): эта форма ввода загружается с предыдущими данными и результатами вычислений.