2015-07-30 2 views
-3

У меня есть файл php (register.php) с public function register($data), где ошибки проверяются. После того, как ошибки подсчитаны и если ошибок не обнаружено, проверка прошла.Переменная для другого php-файла

register.php:

class ARegister { 

    public function register($data) { 
     $user = $data['userData']; 

     //validate provided data 
     $errors = $this->validateUser($data); 

     if(count($errors) == 0) { 
     //first validation 
     } 
    } 

    public function validateUser($data, $botProtection = true) { 

    $id  = $data['fieldId']; 
    $user = $data['userData']; 
    $errors = array(); 
    $validator = new AValidator(); 

     if($validator->isEmpty($user['password'])) 

      $errors[] = array( 
      "id" => $id['password'], 
      "msg" => Lang::get('password_required') 
      ); 


     return $errors; 
    } 

Проблема заключается в том, что мне нужно, чтобы получить это подтверждение подтвержденных данных на мой другой PHP файл (othervalidation.php), где я сделал другую проверку:

othervalidation.php:

<?php 
require 'register.php'; 

if (!empty($action)) { 

    switch ($action) { 

     case 'process_payment': 

     try { 

      $instance = new ARegister(); 

      if($instance->validateUser($data, $errors)) { 
      throw new Exception('Validation error');  
      } 

     } catch (Exception $e) { 
      $status = false; 
      $message = $e->getMessage(); 
     } 
    } 

Как я могу отправить результат $ ошибок переменной в другой моей проверки (othervalidation.php)?

+0

Пожалуйста, покажите больше кода, ваша структура кода прямо сейчас неясно. Связаны ли 2 файла PHP? Или есть две разные страницы? –

+0

Нам действительно нужно больше вашего кода, чтобы быть в состоянии сказать. Где вы называете функцию регистрации? Не могли бы вы разместить полный код othervalidation.php? – BurningLights

+0

Я попытался отредактировать сообщение, чтобы сделать его более понятным. – Taq

ответ

0

Я посмотрел на свой новый дизайн кода и вот новые проблемы, которые я нашел.

Во-первых, в вашей функции register вы используете переменную ошибок как целое число, а функция validate возвращает массив. Здесь у вас есть две возможности.

Вы можете изменить метод регистра, чтобы проверить, если ваш массив ошибок пуст, как это:

if(empty($errors)) { 
     //first validation 
} 

Граф также действует, но я до сих пор предпочитаю пустой, так как это синтаксически яснее. Кроме того, функция count возвращает 1, если параметр не является массивом или счетным объектом, или 0, если параметр равен NULL. Как я уже сказал, это функциональное решение в вашем текущем случае, но в некоторых других контекстах это может привести к неожиданным результатам.

Здесь, в объявлении метода, я вижу, что вы ожидаете логическое (botProtection).

public function validateUser($data, $botProtection = true) { 

Но поставляют параметр ошибки

if($instance->validateUser($data, $errors)) { 

Вы не предоставляют мне декларацию ошибок переменных, но это, вероятно, не соответствующий параметр защиты бота ваша функция ожидает. PHP использует терять типизацию, это полезно, но, опять же, вы должны быть осторожны с ошибками, которые трудно найти.Для публичной функции вы всегда должны убедиться, что параметр, предоставленный вами, не приведет к сбою кода.

В вашем коде параметр данных представляется массивом. Вы можете использовать параметр намекая, чтобы заставить использовать массив как это:

public function register(array $data) { 
public function validateUser(array $data, $botProtection = true) { 

и даже определенный класс (как если вы где использование «экземпляр» в состоянии)

public function register(MyDataClass $data) { 
public function validateUser(MyDataClass $data, $botProtection = true) { 

Кроме того, вы» даже не используя параметр botProtection в вашем методе validateUser.

В тот же вызов функции:

if($instance->validateUser($data, $errors)) { 

вы ожидаете булево (истина или ложь), но этот метод возвращает массив. Если вы хотите использовать код так, как это в настоящее время разработано, вы должны использовать его как этот

if(!empty($instance->validateUser($data, $errors)) { 

Вот, я не так уверен, что необходимо использовать исключение. Разве не проще спроектировать ваш код?

if(!empty($instance->validateUser($data, $errors)) { 

     $message = 'Validation error'; 
} 

В функции валидации, является функция «IsEmpty» также проверки, если клиент предоставил пароль?

Если это так, вы можете проверить это следующим образом:

if(!in_array($user['password']) or empty($user['password'])) 

С этими поправками, ваш код должен быть функциональным.

Вот пример того, как я бы был создать свой код (учитывая пример кода в комплект поставки):

class ARegister { 

    public function register($data) { 

     $user = $data['userData']; //don't declare it here, all the user validations must be done in validateUser($data, &$errors) 

     $errors = array(); 

     if($this->validateUser($data, $errors)) { 
     //first validation 
     } 
    } 


    /** 
    * Note: If you are not returing more than one error at the time, $errors should be a string instead of an array. 
    */ 
    public function validateUser($data, array &$errors) { 

     $isValid = false; 

     if (in_array($data['fieldId']) and in_array($data['fieldId']['password']) and in_array($data['userData'])){ 

      if(!in_array($data['userData']['password']) or empty($data['userData']['password'])){ 

       $errors[$data['fieldId']['password']] = Lang::get('password_required'); 
      } 
      else{ 
       $isValid = true; 
      } 
}  
     else{ 

      //an invalid data array had been provided 
     } 

     return $isValid; 
    } 

Для следующей части, если код выполняется непосредственно в окне просмотра, и вы новичок, создать процедурный файл внешнего контроллера (все функции будут общедоступными ...). Если вы профессионал, вы ДОЛЖНЫ создать класс для инкапсуляции лечения.

Вы не должны делать лечение непосредственно на виду. Представление является немым заполнителем для представления данных и сбора вклада клиента. Единственное, что он должен сделать, это отобразить данные, отправленные контроллером, и отправить обратно клиентский ввод на контроллер.

Обработка данных является ответственностью диспетчера.

if (!empty($action)) { 

     $errors =array(); 

     switch ($action) { 

      case 'process_payment': 

       $instance = new ARegister(); 

       if($instance->validateUser($data, $errors)) { 

        //the user is valid, do the treatment 
       } 
       else 

        PageManager::dispayError($errors); 
       } 

       unset($instance); 
     } 
    } 

Вот пример того, как вы можете централизовать отображение ошибки

/** 
    * Can be more complexe than that, but I'm at my father's home at four hundred kms away from Montreal right now.. 
    */ 
    public static function dispayError($errors, $size = 4){ 

     if (is_numeric($size)){ 

      if ($size < 0){ 
       $size = 1; 
      } 
      elseif($size > 5){ 
       $size = 5; 
      } 
     } 
     else{ 
      $size = 4; 
     } 

     if (is_scalar($errors)){ 

      echo '<h' . $size . 'class="ERROR_MESSAGE">' . $errors . '</h' . $size . '><br>'; 
     } 
     elseif (is_array($errors)){ 

      foreach ($errors as $error){ 

       if (is_scalar($error)){ 

        echo '<h' . $size . 'class="ERROR_MESSAGE">' . $error . '</h' . $size . '><br>'; 
       } 
      } 
     } 
    } 

Конечно, вы можете также поддерживать многие виды сообщений:

public static function dispayError($errors, $size = 4){ 

    self::displayMessage("ERROR_MESSAGE", $errors, $size=4); 
} 

private static displayMessage($class, $messages, $size=4) 

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

Хороший успех,

Джонатан Родитель-Левек из Монреаля

0

Вы можете попробовать что-то вроде этого:

class ARegister { 

private $error = 0; 

public function register($data) { 

    if (!$this->validateUser($data)){ 

     $this->error++; 
    } 
} 

public function getErrorCount(){ 
    return $this->error; 
} 

public resetErrorCount(){ 
    $this->error = 0; 
} 

Или передать ошибку по ссылке:

public function register(&$error, $data) { 

    if (!$this->validateUser($data)){ 

     $error++; 
    } 
} 

Лично я хотел бы сделать все проверки в тот же метод (в классе для капсулирования), используйте параметр сообщения об ошибке (переданный по ссылке), чтобы вернуть причину неудачи проверки и использовать оператор return для возврата true или false.

class MyClass{ 

     public function validation(&$errorMessage, $firstParameter, $secondParameter){ 

      $success = false; 

      if (!$this->firstValidation($firstParameter)){ 

       $errorMessage = "this is not working pal."; 
      } 
      elseif (!this->secondeValidation($firstParameter)){ 

       $errorMessage = "Still not working buddy..."; 
      } 
      else{ 

       $success = true; 
      } 

      return $success; 
     } 

     private function firstValidation($firstParameter){ 

      $success = false; 

      return $success; 
     } 

     private function secondeValidation($secondParameter){ 

      $success = false; 

      return $success; 
     } 
    } 

В вашем другом файле:

<?php 
     $instance = new MyClass(); 

     $errorMessage = ""; 

     if ($instance->validation($errorMessage, $firstParameter, $secondParameter)){ 

      echo "Woot, it's working!!!"; 
     } 
     else{ 

      echo $errorMessage; 
     } 
    ?> 

Является ли один из этих кодовых решений соответствует вашим потребностям?

Джонатан Родитель-Левек из Монреаля

+0

Я просмотрел эту идею, и я согласен с ней. У меня есть публичная функция ValidateUser, но я все еще что-то пропускаю. Я думаю, что проблема заключается в вызове метода. Есть идеи? – Taq

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