Пишем простой конвертер величин на 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
Без модуля обработки параметров и с обрамлением 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 [10423 просмотра]