БлогNot. Пишем простой конвертер величин на PHP

Пишем простой конвертер величин на PHP

Перед вами - "универсальный" конвертер величин на PHP, написанный в учебных целях на основе однострочного поля ввода и списка. Поэтому преобразуемых величин всего пара, а цель заметки - дать образец, но не продукт.

Для добавления новых величин их достаточно дописать в массив $convert элементами вида 'ключ'=>'значение', где ключом служит обычная строка текста, описывающие какие величины к каким преобразуются, а значение - это формула на PHP, описывающая нужное действие над вещественной или целой переменной $number, полученной от пользователя. Код формулы должен быть правильной записью на PHP части "формула" оператора

$result = формула;

(без "=" и точки с запятой). Существенно, что этот код никуда не передаётся, из пользовательской формы нужное преобразование "опознаётся" по ключу, который печатается и в видимом списке. Иначе можно бы было из отдельно подготовленной HTML-формы передать код на оценку функции eval и "завалить" сервер.

Вот полный исходник приложения:

<?php
 $params = array ('action','number','units');
 require_once 'params.php';
 $convert = array (
  'Из Фаренгейта в Цельсия'=>'($number-32)*5/9',
  'Из градусов в радианы'=>'$number*3.1415926/180' 
 );
 $result = '';
 if (isset($action)) {
  if (!is_numeric($number)) $number = 0;
  foreach ($convert as $key=>$value) if ($key == $units) { eval("\$result=$value;"); break; }
 }
?>
<!DOCTYPE html PUBLIC "–//W3C//DTD HTML 4.01//EN">
<html><head>
<meta http–equiv="Content–Type" content="text/html; charset=Windows–1251" /><title>Конвертер</title>
</head><body><h3>Конвертер</h3><form method="post">
 <p>Сколько: <input type="text" name="number" value="<?php echo $number; ?>" maxlength="10" size="11">
 из чего во что: <select name="units" size="1">
<?php 
 foreach ($convert as $key=>$value)
  echo '<option value="'.$key.'"'.($key==$units?' selected':'').'>'.$key;
?>  
 </select>
 <input type="submit" name="action" value="Посчитать"></p></form>
<?php 
 if (isset($action)) echo '<p>Ответ='.round($result,2).'</p>';
?>  	 
</body></html>

Подключаемый файл params.php, как и во многих других скриптах, служит для обработки списка параметров, разрешённых для передачи в массиве $params, вот его листинг:

<?php
 function trimall ($string) { 
  return preg_replace("/(^\s*)|(\s*$)/","",
   preg_replace("/\s+/"," ",trim($string)));
 }
 function magic($path) { 
  ini_set('magic_quotes_runtime', '0'); 
  ini_set('magic_quotes_sybase', '0');
  return (@get_magic_quotes_gpc()=='1'?stripslashes($path):$path);
 }
 if (isset($params) && !empty($params)) {
  foreach ($params as $num=>$var) {
   if (isset($_POST[$var])) $$var = trimall(htmlspecialchars(magic($_POST[$var])));
   else if (isset($_GET[$var])) $$var = trimall(htmlspecialchars(magic($_GET[$var])));
   else if (isset($_SESSION[$var])) {
    $$var = trimall(htmlspecialchars(magic($_SESSION[$var])));
    unset ($_SESSION[$var]);
   }
   else $$var = '';
  }
 }
?>

Вот как выглядит приложение в браузере:

вид приложения Простой конвертер на PHP
вид приложения Простой конвертер на PHP

 Пример в работе

Без модуля обработки параметров и с обрамлением HTML5 (кодировка Юникода UTF-8) мы могли бы переписать решение вот в таком виде (приведён полный документ .php):

<!doctype html>
<html lang="ru">
 <head>
  <meta charset="utf-8">
  <title>Конвертер</title>
 </head> 
 <body>
<?php
 $converter = array (
  'Из градусов в радианы' => '$n*pi()/180',
  'Из градусов Фаренгейта в Цельсия' => '($n-32)*5/9' ); 
 $res = $units = $n ='';
 if (isset($_POST['action'])) {
  $n = doubleval(htmlspecialchars(trim($_POST['n'])));
  if (!is_numeric($n)) $n = 0; 
  $units = htmlspecialchars(trim($_POST['units']));
  foreach ($converter as $key=>$value) 
   if ($key == $units) { eval("\$res = $value;"); break; }
 }
?>
  <form method="post">
   Величина: <input type="text" name="n" value="<?php echo $n; ?>"
  maxlength="10" size="10"> преобразовать: <select name="units">
<?php
  foreach ($converter as $key=>$value)
   echo '<option value="'.$key.
    '"'.($key==$units?' selected':'').'>'.$key;       
?>
   </select>
   <input type="submit" name="action" value="Преобразовать"></form>
   <p><?php echo round($res,2); ?></p>
 </body>
</html> 

05.10.2015, 17:52 [10291 просмотр]


теги: учебное php числа безопасность

К этой статье пока нет комментариев, Ваш будет первым