За последние 24 часа нас посетили 59257 программистов и 1841 робот. Сейчас ищут 894 программиста ...

Задание при приеме на работу

Тема в разделе "Прочие вопросы по PHP", создана пользователем rash012, 9 апр 2015.

  1. rash012

    rash012 Новичок

    С нами с:
    9 апр 2015
    Сообщения:
    9
    Симпатии:
    0
    Задание по PHP 1

    Реализовать скрипт, выполняющий следующие действия:

    Пользователь вводит число в форму на странице и нажимает кнопку «Ввод». После этого на страницу выводится таблица. В первом столбце – числа от 1 до 10, во втором – результат сложения числа из первого столбца с введенным, в третьем – результат умножения, в четвертом – результат деления.

    Предусмотреть защиту от ввода некорректных данных (например, строк) выводить соответствующее предупреждение и предложение повторить ввод. Предусмотреть вывод в ячейках таблицы соответствующего сообщения «На 0 делить нельзя», если введен ноль.

    файл form.html
    Код (PHP):
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4.   <meta charset="windows-1251">
    5.   <title></title>
    6.   <script>
    7.     function validate(){
    8.       if(isNaN(document.getElementById('number').value)){
    9.         alert('Не число. Введите число.');
    10.         return false;
    11.       }
    12.       return true;
    13.     }
    14.   </script>
    15. </head>
    16. <body>
    17.   <form method="post" action="form.php" onsubmit="return validate()">
    18.     <label>Число
    19.     <input type="text" id="number" name="number">
    20.     </label>
    21.     <input type="submit" value="Ввод">
    22.   </form>
    23. </body>
    24. </html>
    файл form.php
    Код (PHP):
    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4.   <meta charset="windows-1251">
    5.   <title></title>
    6. </head>
    7. <body>
    8.   <?php
    9.     $number=$_POST['number'];
    10.     function division($number1,$number2){
    11.       if($number2==0){
    12.         return 'На 0 делить нельзя';
    13.       }
    14.       return $number1/$number2;
    15.     }
    16.  
    17.     echo '<table border="1">';
    18.     for($i=1;$i<=10;$i++){
    19.       echo '<tr><td>'.$i.'</td><td>'.($i+$number).'</td><td>'.$i*$number.'</td>';
    20.       echo '<td>'.division($i,$number).'</td></tr>';
    21.     }
    22.     echo '</table>';
    23.   ?>
    24. </body>
    25. </html>
    Прислали замечания по коду

    Недостатки:
    1) Нет валидации на стороне сервера - есть только на стороне клиента
    2) Два файла именно таким образом - неоправданно. Можно (и нужно!) разделить html и php. Но точка входа в приложение (обработки входящего запроса) должна быть одна.


    Как сделать сделать валидацию на php с предложением повторить ввод?
    и что имеется ввиду во втором пункте недостатков?
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А на работу тоже мы устроимся твою? :)
    Давай так, никакой конкретики, я просто выделю, что тебе надо самому поискать, ок?
    В пхп есть функции проверки типов.
    Во втором файле у тебя всякие head и body рогом не вперлись. Просто инклудь одно в другое.
     
  3. rash012

    rash012 Новичок

    С нами с:
    9 апр 2015
    Сообщения:
    9
    Симпатии:
    0
    Исправил. Есть замечания?
    Код (Text):
    1. <html>
    2. <body>
    3. <form method="post" action="form.php">
    4.     <input type="text" id="number" name="number">
    5.   <input type="submit" value="Ввод">
    6. </form>
    7. <?php
    8. $number = $_POST['number'];
    9.  
    10. function division($number1, $number2)
    11. {
    12.   if ($number2 == 0) {
    13.     return 'На 0 делить нельзя';
    14.   }
    15.   return $number1 / $number2;
    16. }
    17.  
    18. if (is_numeric($number)) {
    19.   echo '<table border="1">';
    20.   for ($i = 1; $i <= 10; $i++) {
    21.     echo '<tr><td>' . $i . '</td><td>' . ($i + $number) . '</td><td>' . $i * $number . '</td>
    22.     <td>' . division($i, $number) . '</td></tr>';
    23.   }
    24.   echo '</table>';
    25. }
    26. else if(empty($number)){
    27.   echo 'Введите число';
    28. }
    29. else {
    30.   echo 'Не число. Введите число.';
    31.  
    32. }
    33. ?>
    34. </body>
    35. </html>
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А если я передам в качестве $number2 строку? Мне тоже выдаст, что на ноль делить нельзя, но...я же не ноль передал. Ошибка деления на ноль меня, как глупого неподготовленного пользователя удивит и испугает.

    Нагромождения elseif лично я не люблю. И не только я. Это можно развязать более красиво в 99% случаев.

    Ну и да, html и php, который вам "можно и нужно разделить" у вас не разделены. Я вам про инклуд, вы про копипасту из файла в файл.. Мержить их не нужно было :)
     
  5. rash012

    rash012 Новичок

    С нами с:
    9 апр 2015
    Сообщения:
    9
    Симпатии:
    0
    строку передать не получится, ибо есть проверка на is_numeric.
    else if имеется ввиду лучше заменить на switch?
    я так и не понял, что и куда нужно инклюдить?
     
  6. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Забавно написано конечно :)
    Возникло ощущение, что тот, кто писал задание и тот кто его проверял разные люди
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Свитч у тебя там не нарулится.

    html-обертку над твоим генератором таблички инклюдить в него. Половину сверху, половину снизу.
     
  8. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну мои замечания бы ещё включали:
    • Зачем здесь POST-запрос?
    • А если уж POST, то надо делать редирект, чтоб не вылезало окошко о повторной отправке данных
    • Вывод ошибки лучше сделать прямо в форму (ну это ИМХО)

    А ещё, дабы разделить логику и вывод, можно собрать все рассчитанные данные в массив, и только после этого их показывать