"Введены недопустимые символы"

Wladim

Новичок
При регистрации на сайте (registration.php) в обработчике (add_avtor.php) есть проверка:
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
$fam = trim($_POST['fam']);
$avt_name = trim($_POST['avt_name']);
$otch = trim($_POST['otch']);
$loga = trim($_POST['loga']);
}
if ($fam == '')
{
die("Поле 'Фамилия' не заполнено<br />\n");
// Фамилия может состоять из букв, цифр и подчеркивания
}
elseif (!preg_match("/^[а-яёА-ЯЁ_]{3,}$/", $fam))
{
die("В поле 'Фамилия' введены недопустимые символы<br />\n");
}
if ($avt_name == '')
{
die("Поле 'Имя' не заполнено<br />\n");
// Имя может состоять из букв, цифр и подчеркивания
}
elseif (!preg_match("/^[а-яёА-ЯЁ_]{3,}$/", $avt_name))
{
die("В поле 'Имя' введены недопустимые символы<br />\n");
}
if ($otch == '')
{
die("Поле 'Отчество' не заполнено<br />\n");
// Отчество может состоять из букв, цифр и подчеркивания
}
elseif (!preg_match("/^[а-яёА-ЯЁ_]{3,}$/", $otch))
{
die("В поле 'Отчество' введены недопустимые символы<br />\n");
}
if ($loga == '')
{
die("Поле 'Логин' не заполнено<br />\n");
// Логин может состоять из букв, цифр и подчеркивания
}
elseif (!preg_match("/^\w{3,}$/", $loga))
{
die("В поле 'Логин' введены недопустимые символы<br />\n");
}
И вот результат:
В поле 'Имя' введены недопустимые символы
И, естественно, регистрации не происходит.
Интересно, что в поле "Фамилия" - без проблем...
В чём причина?
 

hell0w0rd

Продвинутый новичок
в гавнокоде.
Напишите класс валидатор, или возьмите один из существующих.
 

Andkorol

Новичок
Wladim, кнопка "Код" находится слева от кнопки "Цитата", совсем рядом, и выглядит вот так:
 

vasinsky

Новичок
Напишите класс валидатор
угу, во всех не понятных ситуациях пишите классы)

Wladim - вы в юникоде работаете? если да, то модификатор u добавьте, а модификатор i - делает поиск регистроНЕзависимым
 

vasinsky

Новичок
я полгода-год назад писал класс для себя, но сейчас он мне видится по другому
класс я выложил не для навязывания его использования, просто - раз уж за классы начали говорить...

PHP:
  class Validate{
    public $mysqli;    //идентификатор коннекта с БД
    public $result;    //Результат обработки  
    private $messages; //Текст ошибки
    private $lenght;  //вспомогательная переменная
    public $salt = '&9fd%^a+';      //Соль для пароля
    public $capcha = null; //Сессия с кодом капчи
    //значения фильтров - по аналогии с строковыми функциями
    public $funcList = array('floatval', 'strval', 'intval', 'strip_tags', 'md5', 'sha1', 'trim', 'escape');
  
    public function __construct($data, $mysqli, $result = array(), $messages = array(), $lenght = array()){
        $this->data = $data;
        $this->messages = $messages;
        $this->lenght = $lenght;
        $this->result = $result;
        $this->mysqli = $mysqli;  
    }

    public function setParam($name, $value){
        return $this->$name = $value;
    }      
      
    private function message($label=null, $rule=null){
      
        $this->lenght = (isset($this->lenght[0]) || isset($this->lenght[1])) ? $this->lenght : $this->lenght = array('','');
      
        $this->messages = array(
                                'error' => 'Не правильный формат данных',
                                'empty' => 'Поле "'.$label.'" не заполнено',
                                'int' => 'Поле "'.$label.'" должно содержать только цифры',
                                'float'=> 'Поле "'.$label.'" должно содержать десятичную дробь',
                                'regexp'=>'Поле "'.$label.'" заполнено не верно',
                                'lenght-min'=> 'Поле "'.$label.'" должно содержать минимум '.$this->lenght[0].' символ(а|ов)',
                                'lenght-max'=> 'Поле "'.$label.'" должно содержать максимум '.$this->lenght[1].' символ(а|ов)',
                                'email' => 'Не правильный формат email',
                                'passconf' => 'Введённые пароли не совпадают',
                                'capcha' => 'Защитный код введён не верно',
                                );
                              
      return $this->messages[$rule];                      
    }
  
    private function v_upload($fieldName){
        //руки всё не доходят допилить))
    }
  
    private function v_int($value){
        return filter_var($value, FILTER_VALIDATE_INT) ? true :false;  
    }  
  
    private function v_float($value){
        $value = strtr($value, array(','=>'.'));
              
        return filter_var($value, FILTER_VALIDATE_FLOAT) ? true :false;      
          
    }
  
    private function v_regexp($pattern, $value){
        return (!preg_match($pattern, $value)) ? false : true;      
          
    }  
  
    private function v_lenght_min($size, $value){
        $this->lenght = explode(',',$size);
          
        return (mb_strlen($value, 'utf-8') < $this->lenght[0]) ? false : true;  
                                                        
    }

    private function v_lenght_max($size, $value){
        $this->lenght = explode(',',$size);
          
        return (mb_strlen($value, 'utf-8') > $this->lenght[1]) ? false : true;                                                          
    }
  
    private function v_email($value){
        return filter_var($value, FILTER_VALIDATE_EMAIL) ? true :false;  
    }    
  
    public function v_passconf($pass, $passconf){
        return ($pass == $passconf) ? true : false;
    }

    public function v_capcha($value, $sess_capcha){
        return ($value == $sess_capcha) ? true : false;
    }
  
  
    private function v_filter($value, $filter){
        $filters = explode('|', $filter);

        foreach($filters as $func){
          
            if(in_array($func, $this->funcList)){
          
              if($func == 'escape')
                  $value = $this->mysqli->escape_string($value);
              elseif($func == 'floatval'){
                  $value = strtr($value, array(','=>'.'));
              }  
              else        
                  $value = $func($value);
            }                  
        }

        return $value;  
    }
      
    public function combine(){
        if(!is_array($this->data) && !isset($data[0])){
            $this->result['errors']['data'] = $this->message(null, 'error');
          
            return $this->result;
        }
        else{
            foreach($this->data as $k=>$v){
                //Применение filter
                if(isset($v['filter'])){
                    if(isset($v['value_pass'])){
                        $v['value'] = $this->v_filter($v['value'], $v['filter']);
                        $v['value_pass'] = $this->v_filter($v['value_pass'], $v['filter']);
                    }
                    else
                        $v['value'] = $this->v_filter($v['value'], $v['filter']);
                }            
                                              
                if($v['empty'] == 1 || ($v['empty'] == 0 && !empty($v['value']))){
            
                  switch($v['rule']){
                        case 'int':
                            $temp = $this->v_int($v['value']);
                            break;
                        case 'float':
                            $temp = $this->v_float($v['value']);
                            break;
                        case 'regexp':
                            $temp = ($this->v_regexp($v['pattern'], $v['value']));
                            break;
                        case 'passconf':
                            $temp = ($this->v_passconf($v['value_pass'], $v['value']));
                            break;
                        case 'capcha':
                            $temp = ($this->v_capcha($v['value'], $this->capcha));
                            break;                              
                        case 'lenght':
                            if(!$this->v_lenght_min($v['size'], $v['value'])){
                                $temp = $this->v_lenght_min($v['size'], $v['value']);
                                $v['rule'] = 'lenght-min';
                            }
                            elseif(!$this->v_lenght_max($v['size'], $v['value'])){
                                $temp = $this->v_lenght_max($v['size'], $v['value']);
                                $v['rule'] = 'lenght-max';
                            }
                            else{
                                $temp = true;
                            }
                            break;
                        case 'email':
                            $temp = (!$this->v_email($v['value'])) ? false : true;
                            break;                                                                                                  
                    }
              
                    if($temp === true){
                        $this->result['success'][$v['field']]= array(
                                                      'value' => $v['value'],
                                                      'lenght' => mb_strlen($v['value'], 'utf-8')
                                                      );                
                    }
                    elseif($v['empty'] == 0 && empty($v['value'])){
                            $this->result['errors'][$v['field']] = array(
                                                          'value' => null,
                                                          'message'=>$this->message($v['label'], 'empty')
                                                          );                                                        
                    }
                    else{
                            $this->result['errors'][$v['field']] = array(
                                                          'value' => htmlspecialchars($v['value']),
                                                          'message'=>$this->message($v['label'], $v['rule'])
                                                          );
                      
                    }
              
              }
              elseif($v['empty'] == 0 && empty($v['value'])){
                        $this->result['errors'][$v['field']] = array(
                                                          'value' => null,
                                                          'message'=>$this->message($v['label'], 'empty')
                                                          );              
              }
                          
            }
        }
      
        return $this->result;
    }
  
    public function validate(){
        return (!empty($this->result['errors'])) ? false : true;
    }
  }
 

vasinsky

Новичок
использование

PHP:
  $data = array(
                array(
                      'field'=> 'login',
                      'label'=> 'Логин',
                      'value'=> 'phpforum',
                      'rule' => 'lenght',
                      'empty' => 0,
                      'size' => '3,5'
                      ),
                array(
                      'field'=> 'years',
                      'label'=> 'Полных лет',
                      'value'=> 23,
                      'rule' => 'int',
                      'empty' => 1
                      ),
                array(
                      'field'=> 'phone',
                      'label'=> 'Телефон',
                      'value'=> '<b>26512</b>',
                      'rule' => 'regexp',
                      'empty' => 1,
                      'filter'=> 'strip_tags',
                      'pattern' => '#\([0-9]{3,4}\)[0-9]{3}\-[0-9]{2}\-[0-9]{2}#iusU'
                     
                      ),                     
                array(
                      'field'=> 'price',
                      'label'=> 'Цена',
                      'value'=> '6,1<s>',
                      'rule' => 'float',
                      'empty' => 1,
                      'filter' => 'strip_tags|floatval'
                      ), 
                array(
                      'field'=> 'email',
                      'label'=> 'Мыло',
                      'value'=> '[email protected]',
                      'rule' => 'email',
                      'empty' => 1
                      ),
                array(
                      'field'=>'pass',
                      'label'=>'Пароль',
                      'value'=>'asdad12'.SALT,
                      'rule'=>'lenght',
                      'empty'=> 0,
                      'size'=>'6,41',
                      'filter'=>'sha1'
                      ),                       
                array(
                      'field'=>'passconf',
                      'label'=>'Повторите пароль',
                      'value'=>'asdad12'.SALT,
                      'value_pass'=>'asdad12'.SALT,
                      'rule'=>'passconf',
                      'empty'=> 0,
                      'filter'=>'sha1'
                      ),
                array(
                      'field'=>'code',
                      'label'=>'Защитный код',
                      'value'=>'qwerty',
                      'rule'=>'capcha',
                      'empty'=>0
                      )                                                                                                     
                ); 
   

  echo '<hr/>';             
  $form = new Validate($data, $mysqli);
  $form->setParam('capcha', 'qwerty');
  $res = $form->combine();
  var_dump($form->validate());
  var_dump($res);
 

vasinsky

Новичок
я не огорчился, но тебе нужно разобраться в конфликте внутри себя. я бы посоветовал обратиться за помощью к специалисту.

я слышал что русские в Москве отдали всё гостям с юга, бизнес, девок и всё остальное, это сильно понизило самооценку и по этому некоторые из них превращаются в бесстрашных клавиатурных терминаторов. это твой случай?

ты пиши в личку в след раз. не надо в темах гадить.
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
vasinsky, идея хорошая, но Вурдалак про абстракцию и внешние зависимости, про стиль и документацию, именование методов и доступ к аттрибутам класса, ну и //руки всё не доходят допилить)) а зачем светишь?
 

Вурдалак

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

Dez

Новичок
я не огорчился, но тебе нужно разобраться в конфликте внутри себя. я бы посоветовал обратиться за помощью к специалисту.

я слышал что русские в Москве отдали всё гостям с юга, бизнес, девок и всё остальное, это сильно понизило самооценку и по этому некоторые из них превращаются в бесстрашных клавиатурных терминаторов. это твой случай?
да, не, с ним там все намного проще. Вурдалак - это просто ребенок-дебиленок. :cool:
 

vasinsky

Новичок
руки всё не доходят допилить)) а зачем светишь?
ну может хоть у кого-то дойдут
$form = new Validate($data, $mysqli);
да здесь наследоваться можно было бы, я не помню почему 2й аргумент ставил наверно чтоб прозрачней общая картина была.
 

WMix

герр M:)ller
Партнер клуба
vasinsky, зачем такой класс допиливать? есть куча готовых решений, где думали о валидации как о валидации, очень абстрактно, не опираясь ни на какие базы данных, с реально важными валидаторами, которые легко подключить, которые протестированны, само допиливаюшиеся (только "composer update" напиши), у которых богатая документация в конце концов.

'floatval', 'strval', 'intval', 'strip_tags', 'md5', 'sha1', 'trim', 'escape' это одной строчкой без класса легко пишется

для примера http://framework.zend.com/manual/2.0/en/modules/zend.validator.set.html
 
Последнее редактирование:

vasinsky

Новичок
)) это оказывается древняя версия класса)
кое-как нашел тот который хотел запостить, но он тоже без комментов, но в нём нет ни слова об mysqli
и текст ошибки можно инициализировать, но тоже - всё в одной куче.
 
Сверху