Проверка входящих переменных делается в 2 этапа:
1.
validfilter() - Проверяем входные переменные от пользователей на валидность через Regex.
2.
mysql_escape_mimic() - Экранируем перед помещением в выражение запроса к БД.
(код рабочий!)
//----------------------
function mysql_escape_mimic($inp) {
//from: http://php.net/manual/en/function.mysql-real-escape-string.php#101248
if(is_array($inp))
return array_map(__METHOD__, $inp);
if(!empty($inp) && is_string($inp)) {
return str_replace(array('\\', "\0", "\n", "\r", "'", '"', "\x1a"), array('\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z'), $inp);
}
return $inp;
}
function validfilter($value,$regexp,$flags='usi') {
if (preg_match('/'.$regexp.'/'.$flags, $value,$result)
&& $result[0]===$value) return $value;
else return false;
}
$charset=array(
'bad'=>'\x00-\x09\x0B\x0C\x0E-\x1F\x80-\xFF',
'sql'=>'\x00\x0a\x0c\x1a\x22\x27\x5c',
'en'=>'a-zA-Z',
'ru'=>'а-яА-ЯёЁ',
'digits'=>'0-9',
'num'=>'0-9-.',
'space'=>'\s',
);
$filter=array(
//login - любой символ, кроме непечатных, sql-"опасных" и пробелов; от 3 до 20 знаков.
'login'=>"^"."([^".$charset['bad'].$charset['sql'].$charset['space']."]{3,20})$",
);
//----------------------
$login = validfilter($_REQUEST['login'],$filter['login']);
Затем (при необходимости), для безопасной работы с базой, используем: mysql_escape_mimic()
В данном случае, в $login экранировать будет нечего, т.к. мы сразу проверили это через добавление набора $charset['sql'] в фильтр проверки.
Поэтому, $login можно сразу использовать в sql-запросе без каких либо опасений.