Собственно вот и обещанная мной функция для обработки данных, поступающих от пользователя. Для получения одной переменной вызываем так (какие аргументы передавать думаю и так ясно):
<?php
$var = import_var('var','G','INT',3);
?>
Для получения одновременно нескольких однотипных переменных вызов функции немного отличается:
<?php
extract(import_var(array('var1','var2','var3'),'G','INT',3));
echo $var1;
echo $var2;
echo $var3;
?>
Вот код функции:
<?php
function import_var($name,$source,$type,$maxlen=0) {
$retarr=array();
if(is_array($name)) { // если нужно обработать массив с именами
foreach($name as $v) {
$retarr[$v] = import_var($v,$source,$type,$maxlen);
// рекурсивно запускаем себя же
}
if(sizeof($retarr)>0) return $retarr; // возвращаем массив
}
// если нужно обработать одну переменную
switch($source) {
case 'G':
if (isset($_GET[$name])) {
$var=$_GET[$name]; // из GET
}
break;
case 'P':
if (isset($_POST[$name])) {
$var=$_POST[$name]; // из POST
}
break;
case 'C':
if (isset($_COOKIE[$name])) {
$var=$_COOKIE[$name]; // из Cookie
}
break;
}
if(!isset($var)) return false; // если переменная существует
if(is_array($var)) return false; // и если это не массив...
if(get_magic_quotes_gpc()) $var = stripslashes($var);
// убираем лишние бэкслэши
if(empty($var)) return false; // если переменная пуста
if ($maxlen>0) $var = substr($var,0,$maxlen); //обрубаем лишнее
switch($type) { // теперь обрабатываем в соответствии с типом
case 'INT' : // число integer
return is_integer($var) ? $var : intval($var);
break;
case 'NUM' : // число integer или float
return is_numeric($var) ? $var : false;
break;
case 'HTML' : // текст, в котором могут содержаться тэги
return trim(htmlspecialchars($var));
break;
case 'SQL' : // строка, которая попадет в SQL-запрос
return mysql_real_escape_string(htmlspecialchars($var));
break;
case 'MAIL' : // email-адрес
return preg_match('/^[\w\.\-]+@\w+[\w\.\-]*?\.\w{2,4}$/',$var) ? $var : false;
break;
case 'ALPHA' : // только буквенные символы
return preg_match("/^[а-яА-ЯёЁa-zA-Z]+$/",$var) ? $var : false;
break;
case 'ALPHANUM' : // числовые и буквенные символы
return preg_match("/^[а-яА-ЯёЁa-zA-Z0-9]+$/",$var) ? $var : false;
break;
case 'MD5' : // md5-хэш
return preg_match("/^[a-fA-F0-9]{32}+$/",$var) ? $var : false;
break;
case 'SHA1' : // sha1-хэш
return preg_match("/^[a-fA-F0-9]{40}+$/",$var) ? $var : false;
break;
case 'BOOL': // булева величина
return ($var=="1" || $var=="true" || $var=="on") ? true : false;
break;
}
}
?>
Хочу отметить, что данная функция не принимает массивы данных, так как их обработка весьма затруднительна, ввиду того, что элементы могут иметь разные типы данных, и одним вызовом функции корректно обработать весь массив никак не получится.
Жду Ваших комментариев с предложениями по поводу дополнительных типов данных, которые также могут быть востребованы.

Leave a Reply