1. <?php
  2. header('Content-Type: text/html; charset=utf-8');
  3. /**
  4.  * проверить, что данные переданы методом POST
  5.  *
  6.  * @return bool
  7.  */
  8. function is_post()
  9. {
  10. if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  11. return true;
  12. } else {
  13. return false;
  14. }
  15. }
  16.  
  17. /**
  18.  * проверить, что $_POST содержит соответствующий элемент
  19.  *
  20.  * @param string $var_name
  21.  * @return bool
  22.  */
  23. function checkPostVar($var_name)
  24. {
  25. if (isset($_POST[$var_name]) && !empty($_POST[$var_name])) {
  26. return true;
  27. } else {
  28. return false;
  29. }
  30. }
  31.  
  32. /**
  33.  * прогнать данные через htmlspecialchars
  34.  *
  35.  * @param mixed $var
  36.  * @return mixed
  37.  */
  38. function htmlsc($var)
  39. {
  40. if (is_array($var)) {
  41. $res = array();
  42. foreach ($var as $k => $v) {
  43. $res[$k] = htmlsc($v);
  44. }
  45. }
  46. else {
  47. $res = htmlspecialchars($var, ENT_QUOTES);
  48. }
  49.  
  50. return $res;
  51. }
  52.  
  53. // массив возможных ошибок, если поле не заполнено
  54. $error_text = array(
  55. 'f_name' => 'Заполните поле «Имя»',
  56. 'f_password' => 'Заполните поле «Пароль»',
  57. 'f_mail' => 'Заполните поле «E-mail»',
  58. 'f_country' => 'Заполните поле «Страна»',
  59. 'f_gender' => 'Заполните поле «Пол»',
  60. 'f_like' => 'Заполните поле «Интересы»'
  61. );
  62.  
  63. $additional_errors = array(
  64. 'f_password' => 'Минимальная длина пароля — 6 символов',
  65. 'f_mail' => 'Введите e-mail адрес',
  66. );
  67.  
  68. $values = array(
  69. 'f_name' => '',
  70. 'f_password' => '',
  71. 'f_mail' => '',
  72. 'f_country' => '',
  73. 'f_gender' => '',
  74. 'f_like' => array()
  75. );
  76.  
  77. $errors = array();
  78.  
  79. // просто данные для списков
  80. $countries = array(
  81. 'BWA' => 'Ботсвана',
  82. 'MAR' => 'Марокко',
  83. 'TZA' => 'Танзания',
  84. );
  85.  
  86. $i_like = array(
  87. 'read' => 'Читать',
  88. 'walk' => 'Гулять',
  89. 'smoke' => 'Курить',
  90. 'drink' => 'Пить',
  91. 'teach' => 'Учить',
  92. );
  93.  
  94. $gender = array(
  95. 'male' => 'Мужчина',
  96. 'female' => 'Женщина',
  97. );
  98.  
  99.  
  100. if (is_post()) {
  101.  
  102. // поверяем, что поля заполнены
  103. foreach ($values as $k => $v) {
  104. if (checkPostVar($k)) {
  105. $values[$k] = $_POST[$k];
  106. } else {
  107. // если поле не заполнено, то сохраняем ошибку
  108. $errors[$k] = $error_text[$k];
  109. }
  110. }
  111.  
  112. // проверяем длину пароля
  113. if (!array_key_exists('f_password', $errors) &&
  114. strlen($values['f_password']) < 6) {
  115. $errors['f_password'] = $additional_errors['f_password'];
  116. }
  117.  
  118. // проверяем e-mail на соответствие шаблону
  119. $pattern = '~^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$~i';
  120. if (!array_key_exists('f_mail', $errors) &&
  121. !preg_match($pattern, $values['f_mail'])) {
  122. $errors['f_mail'] = $additional_errors['f_mail'];
  123. }
  124.  
  125. // проверим необязательный параметр
  126. if (checkPostVar('f_subscribe')) {
  127. $values['f_subscribe'] = true;
  128. } else {
  129. $values['f_subscribe'] = false;
  130. }
  131.  
  132. if (empty($errors)) {
  133. $values = htmlsc($values);
  134. ?>
  135. <p>Вы ввели:</p>
  136. <ul>
  137. <li>Имя: <?php echo $values['f_name']?></li>
  138. <li>Пароль: <?php echo $values['f_password']?></li>
  139. <li>E-mail: <?php echo $values['f_mail']?></li>
  140. <li>Страна: <?php echo $countries[$values['f_country']]?></li>
  141. <li>Пол: <?php echo $gender[$values['f_gender']]?></li>
  142. <li>Мне нравится:
  143. <?php
  144. foreach ($values['f_like'] as $v):
  145. $l[] = $i_like[$v];
  146. endforeach;
  147. echo implode(',', $l);
  148. ?>
  149. </li>
  150. <li>И ещё Вы <?php echo $values['f_subscribe']?'':' не '?> подписались на рассылку</li>
  151. </ul>
  152. <p><a href="/test/form/">Вернуться</a> к форме</p>
  153. <?php
  154. } else {
  155. // выводим ошибки
  156. $e = implode('<br />', $errors);
  157. foreach ($values as $k => $v) {
  158. $values[$k] = htmlsc($v);
  159. }
  160. }
  161. }
  162. if (isset($e) || !is_post()) {
  163. ?>
  164. <link rel="stylesheet" href="formstyle.css" type="text/css" />
  165. <form action="/test/form/" method="POST">
  166. <fieldset>
  167. <legend>Регистрация</legend>
  168. <?php if(isset($e)):?>
  169. <p><?php echo $e?></p>
  170. <?endif?>
  171. <div>
  172. <label for="name">Имя:</label>
  173. <input type="text" name="f_name" value="<?php echo $values['f_name']?>" id="name"/>
  174. </div>
  175. <div>
  176. <label for="password">Пароль:</label>
  177. <input type="password" name="f_password" value="<?php echo $values['f_password']?>" id="password"/>
  178. </div>
  179. <div>
  180. <label for="mail">E-mail:</label>
  181. <input type="text" name="f_mail" value="<?php echo $values['f_mail']?>" id="mail"/>
  182. </div>
  183. <div>
  184. <label for="country">Страна:</label>
  185. <select name="f_country" id="country">
  186. <?php foreach($countries as $k => $v):?>
  187. <option value="<?php echo $k?>" <?php echo ($k == $values['f_country'])?'selected="selected"':''?>><?php echo $v?></option>
  188. <?php endforeach?>
  189. </select>
  190. </div>
  191. <div>
  192. Я
  193. <?php foreach($gender as $k => $v):?>
  194. <label class="small"><input type="radio" name="f_gender" value="<?php echo $k?>" <?php echo ($k == $values['f_gender'])?'checked="checked"':''?>/> <?php echo $v?></label>
  195. <?php endforeach?>
  196. </div>
  197. <div>
  198. <label for="like">Мне нравится</label>
  199. <select name="f_like[]" id="like" multiple="multiple">
  200. <?php foreach($i_like as $k => $v):?>
  201. <option value="<?php echo $k?>" <?php echo in_array($k, $values['f_like'])?'selected="selected"':''?>><?php echo $v?></option>
  202. <?php endforeach?>
  203. </select>
  204. </div>
  205. <div>
  206. <label for="subscribe" class="full">Подписаться на рассылку
  207. <input type="checkbox" name="f_subscribe" <?php echo (isset($values['f_subscribe']) && $values['f_subscribe'])?'checked="checked"':''?>/></label>
  208. </div>
  209. <div>
  210. <input type="submit" name="send" value="Отправить" />
  211. </div>
  212. </fieldset>
  213. </form>
  214. <?php }