2016-12-01 5 views
1

Я создаю систему проверки для своего сайта. На самом деле, мой код работает, если я не поставил никаких параметров в свой $_POST (например, $_POST['Login']). Если я ставлю любой параметр в моем $_POST, он возвращает ошибку:Незаконное смещение строк и проверка не работают в PHP

Warning: Illegal string offset: 'username' in C:\ ...

Мой образец формы аутентификации:

<form action="" method="post"> 
    <div class="field"> 
    <label for="username">Username: </label> 
    <input type="text" name="username" id="username" autocomplete="off" /> 
    </div> 

    <div class="field"> 
    <label for="Password">Password: </label> 
    <input type="password" name="password" id="password" autocomplete="off" /> 
    </div> 

    <div class="field"> 
    <label for="remember"> 
     <input type="checkbox" name="remember" id="remember" value="on"/> Remember Me 
    </label> 
    </div> 

    <input type="hidden" name="token" value="<?php echo Token::generate(); ?>" /> 
    <input type="submit" value="Login" name="Login"/> 
</form> 

скрипт, который будет обрабатываться, если форма была отправлена:

<?php 
    require_once 'init.php'; 
    $user = new User(); 
    if($user->isLoggedIn()){ 
     Redirect::to('index.php'); 
    } 
    $validate = new Validate(); 
    if(Input::exists()) { 
     if(Token::check(Input::get('token'))) { 
      $validation = $validate->check($_POST["Login"], array(
       'username' => array('required' => true), 
       'password' => array('required' => true) 
      )); 
     } 
    } 
?> 

Подтверждение класс:

<?php 
    class Validate { 

     # Set the variables 
     private $_passed = false, 
       $_errors = array(), 
       $_db = null; 

     # Construct or establish connection to the database 
     public function __construct(){ 
      $this->_db = Database::getInstance(); 
     } 

     # The validation/checking code or the main brain of the code 
     public function check($source, $items = array()){ 
      # Run a ` for each ` for each item in the fields 
      foreach($items as $item => $rules) { 
       # Run a ` for each ` for every rule in the items 
       foreach($rules as $rule => $rule_value) { 
        # Set the variables of `value` and `item` 
        $value = $source[$item]; 
        $item = sanitize($item); 

        if($rule === 'required' && empty($value)) { 
         $this->addError("{$item} is required"); 
        } else if (!empty($value)) { 
         switch($rule) { 
          # Case: Minimum 
          case 'min': 
           if(strlen($value) < $rule_value) { 
            $this->addError("{$item} must be a minimum of {$rule_value} characters."); 
           } 
           break; 

          # Case Maximum 
          case 'max': 
           if(strlen($value) > $rule_value) { 
            $this->addError("{$item} must be a maximum of {$rule_value} characters."); 
           } 
           break; 

          # Case: Match 
          case 'matches': 
           if($value != $source[$rule_value]) { 
            $this->addError("{$rule_value} must match {$item}."); 
           } 
           break; 

          # Case: Unique 
          case 'unique': 
           $check = $this->_db->get($rule_value, array($item, '=', $value)); 

           if($check->count()) { 
            $this->addError("{$item} already exists."); 
           } 
           break; 
          # Case: Not match 
          case 'notmatch': 
           if($value === $source[$rule_value]) { 
           $this->addError("{$rule_value} must not match {$item}."); 
           } 
          break; 
         } 
        } 
       } 
      } 

      if(empty($this->_errors)) { 
       $this->_passed = true; 
      } 
     } 

     # ~ ADD ~ and error 
     public function addError($error) { 
      $this->_errors[] = $error; 
     } 

     # ~ RETURN ~ the errors 
     public function errors() { 
      return $this->_errors; 
     } 

     # ~ CHECK ~ if it is passed 
     public function passed() { 
      return $this->_passed; 
     } 

    } 
+0

Существует файл, и номер правила в сообщении об ошибке. Можете ли вы сказать мне, что это правило (а не номер правила)? – DevNiels

+0

Вот ссылка (ссылка) на следующую ошибку: [link] (http://imgur.com/a/S5aoA) – astronomicalXoom

ответ

0

Вы вызываете $ validate-> проверить и передать ему $ _POST [ «Войти»] в качестве первого аргумента, но на основе вашего HTML вы должны передать только $ _POST. Когда вы передаете $ _POST ["Login"], то входы формы должны иметь имя атрибута как name = "Login [username]".

Прямо сейчас, когда вы передаете $ _POST [ «Войти»] его фактически пустой массив, так что может быть причиной, почему вы получаете Illegal строку смещения

+0

Я пытался «умереть» (var_dump ($ _ POST ['Login;])); он отображает: значение: Вход, который является значением кнопки ввода для отправки формы? Есть ли шанс исправить это? – astronomicalXoom

Смежные вопросы