Задание по PHP

rash012

Новичок
Дали задание. Заметны ли косяки?
как можно иначе реализовать подсветку невалидных данных?
я так понимаю когда форма отправилась и пришла таблица, при обновлении страницы должна приходить изначальная форма, а она не приходит. как сделать полный сброс при обновлении?

Задание по PHP 2

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

1) Фамилия, имя — текстовое поле — только русские буквы, пробелы — обязательное поле

2) Возраст — строго целое положительное число

3) Адрес электронной почты (строго по шаблону [email protected], где b-латинские буквы) - обязательное поле

4) Пол — выбор из списка Мужской, Женский

5) «Я курю» - чекбокс (галочка)

При допущенных ошибках система должна сообщать, какие ошибки допустил пользователь, и предлагать их исправить, показывая ту же форму с введенными данными. Необходимо подсвечивать поля с ошибками красной рамочкой.

В случае удачного ввода выводить в браузер введенные данные в виде таблицы и кнопку "Ввести"

файл validate.php

Код:
<html>
<style>
  .red{
    border-color: #ffa5ad;
  }
  p{
    color:red;
  }
</style>
<body>

<?php
if(isset($_POST['submit'])) {
  $name = $_POST['name'];
  $age = $_POST['age'];
  $mail = $_POST['mail'];
  $gender = $_POST['gender'];
  $smoking = (empty($_POST['smoking']))?"нет":"да";
  $is_valid = true;


  if (!preg_match('/[А-я]+\s[А-я]+$/msix', $name)) {
    $is_valid = false;
    $name_red = "red";
    echo '<p>Поле "фамилия,имя" должно содержать русские буквы и пробел</p>';
  }
  if ($age<=0 && !empty($age)){
    $is_valid = false;
    $age_red="red";
    echo '<p>Поле возраст должно содержать положительное число</p>';
  }
  if(!preg_match('/^[a-zA-Z]+@[a-zA-Z]+\.[a-zA-Z]+$/', $mail)){
    $is_valid = false;
    $mail_red="red";
    echo '<p>Электронная почта введена неверно</p>';
  }

}
?>
<? if(!$is_valid){?>
  <form method="post" action="validation.php">
    <label>Фамилия, имя
      <input type="text" name="name" id="name" value="<?=$name?>" class="<?=$name_red?>">
    </label>
    <br>
    <label>Возраст
      <input type="text" name="age" id="age" value="<?=$age?>" class="<?=$age_red?>">
    </label>
    <br>
    <label>Адрес электронной почты
      <input type="text" name="mail" id="mail" value="<?=$mail?>" class="<?=$mail_red?>">
    </label>
    <br>
    <label>Пол
      <select name="gender" id="gender" value="<?=$gender?>">
        <option>Мужской</option>
        <option>Женский</option>
      </select>
    </label>
    <br>
    <label>Я курю
      <input type="checkbox" name="smoking" id="smoking" <?=(empty($_POST['smoking']))?"":"checked"?>>
    </label>
    <br>
    <input type="submit" value="оправить" id="submit" name="submit">
  </form>
<? } ?>

<?if($is_valid){?>

  <table border="1">
    <tr>
      <td>Фамилия, имя</td>
      <td><?= $name ?></td>
    </tr>
    <tr>
      <td>Возраст</td>
      <td><?= $age ?></td>
    </tr>
    <tr>
      <td>Адрес электронной почты</td>
      <td><?= $mail ?></td>
    </tr>
    <tr>
      <td>Пол</td>
      <td><?= $gender ?></td>
    </tr>
    <tr>
      <td>Я курю</td>
      <td><?= $smoking ?></td>
    </tr>
  </table>
  <br>
  <input type="submit" value="ввести">

<? } ?>
</body>
</html>
 

WMix

герр M:)ller
Партнер клуба
стиль написания заметен сразу, а так, если это работает (не проверял), скромненько и со вкусом!
а почему кнопка за формой? линком делай!
 

scorpion-ds

Новичок
При обновлении страницы (F5), наверно форма отправляется заново, браузер обычно еще переспрашивает "отправить данные повторно?", так что в блоке "$is_valid" следует, сделать ссылку на форму, в этом случае на саму себя.
 

WMix

герр M:)ller
Партнер клуба
подумав, вот смущает большое количество глобальных переменных, чтоль массив сделай типа,
PHP:
$person = array(
  'name' => $_POST['name'],
  'age' => $_POST['age'],
  'mail' => $_POST['mail'],
  'gender' => $_POST['gender'],
  'smoking' => (empty($_POST['smoking']) ? "нет" : "да")
);
хотя там явно обьектик ожидают
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
WMix, а тебя не смущает, что переменных может и не быть (вдрук хакер придет) и будет notice?)
 

scorpion-ds

Новичок
c0dex, ну тогда еще можно ввести массив с допустимыми POST параметрами и сверять с ним. :cool:
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
scorpion-ds
Такое нужно, к примеру, если ты БД апдейтишь и ожидаешь определенные значения, например в - ENUM поле. Здесь это нафик не нужно.
 

scorpion-ds

Новичок
c0dex, ну, а как же хакер?

На самом деле это была шутка, но с долей правды, как я помню по своим лабам по программированию, преподаватели тащились от подобных фишек, +0,5 балла. :)
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
scorpion-ds, допустимые параметры для email, имени, фамилии? Сам понял что написал?) Для пола я еще понимаю, но это...
 

scorpion-ds

Новичок
c0dex, я имел ввиду проверку только ключа, допустим ли параметр $_POST['fiestName'] или нет, без валидации.
 

WMix

герр M:)ller
Партнер клуба
меня много что смущает, я так за минималистичность ) чтоб оригинал не портить
 

Absinthe

жожо
Читать PSR про именование переменных.
При использовании внешних данных проверять их наличие.
Использовать UTF-8. Регулярки поправить.
 
Сверху