более эффективный способ .php - PullRequest
1 голос
/ 22 июня 2011

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

  if ($val-> check($form) === true) {
        {$data['livre'] = $val-> validate_age($form);}

        if ($val->validate_age($form) === true) {
            {$data['livre'] = $val->insertData($db, $form, $id);}

            if ($val->insertData($db, $form, $id) === true) {
                {$data['livre'] = $val->insertLanguages($db, $form, $id);}

                if ($val->insertLanguages($db, $form, $id) === true) {
                    {$data['livre'] = $val->val($form);}

                    if ($val->val($form) === true) {
                        {$data['livre'] = $val->valexp($form);}

                        if ($val->valexp($form) === true ) {
                            {$data['livre'] = $val->insertWorker($db, $form, $id);}

                            if ($val->insertWorker($db, $form, $id) === true) {
                                {$data['livre'] = $val->univAndCourse($form);}
...

спасибо

Ответы [ 6 ]

1 голос
/ 22 июня 2011

Похоже, все ваши вызовы функций возвращают bool.Этот код должен работать.Если какой-либо из вызовов вернет false, $ data ['livre'] будет false.

$data['livre'] = $val->check($form) &&
                 $val->validate_age($form) &&
                 $val->insertData($db, $form, $id) && 
                 $val->insertLanguages($db, $form, $id) && 
                 $val->val($form) &&
                 $val->valexp($form) && 
                 $val->insertWorker($db, $form, $id) && 
                 $val->univAndCourse($form);
1 голос
/ 22 июня 2011

Вот для чего исключения для:

try {
   $data['livre'] = $val->validate_age($form);
   $data['livre'] = $val->insertData($db, $form, $id);
   $data['livre'] = $val->insertLanguages($db, $form, $id);
   $data['livre'] = $val->val($form);
   $data['livre'] = $val->valexp($form);
   $data['livre'] = $val->insertWorker($db, $form, $id);
   $data['livre'] = $val->univAndCourse($form);
} catch (Exception $e) {
   // 
   // Do what ever necessary to process the interrupted logic.
   //
}

Конечно, это означает, что методы класса валидатора выдают exceptions вместо возврата booleans:

class Validator {

   function validate_age($form) {
      if (!is_numeric($form['age'])) throw new Exception('Invalid age.');
   }

   // 
   // .. etc ..
   //
}
1 голос
/ 22 июня 2011

В этом очень специфическом случае вы можете сжать его в выражение, используя and цепочку:

$val-> check($form)
AND
    $data['livre'] = $val-> validate_age($form)
AND
    $data['livre'] = $val->insertData($db, $form, $id)
AND
    $data['livre'] = $val->insertLanguages($db, $form, $id)
AND
    $data['livre'] = $val->val($form)
AND
    $data['livre'] = $val->valexp($form)
AND        
    $data['livre'] = $val->insertWorker($db, $form, $id);

Что кажется очень подходящим, поскольку вы действительно удваиваете назначения, а if проверяет иначе.

Это работает, потому что and имеет меньший приоритет, чем оператор присвоения =. Ваши ===true чеки явно избыточны. И если бы вы хотели, вы могли бы упаковать всю цепочку условий обратно в предикат if ().

1 голос
/ 22 июня 2011

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

if(condition1) {

  if (condition2) {

     return true;

  }

}

return false;

вы могли бы сделать:

if (!condition1) {
  return false;
}

if (!condition2) {
  return false;
}
return true;

Таким образом, вы в основном сначала обрабатываете случай 'else' ..

Кроме того .. это также может работать:

if (condition1 && condition2 && condition3 && condition4) {
    return true;
}

или:

if (
     condition1 && 
     condition2 && 
     condition3 && 
     condition4
  ) {
    return true;
} else {
    return false;
}
0 голосов
/ 22 июня 2011

Вы можете проверить всю свою проверку в одном внешнем условии, открыть транзакцию базы данных внутри нее. Поместите все свои вставки внутри попытки и отката транзакции внутри улова.

как то так:

if ($val-> check($form) === true && $val->validate_age($form) === true && $val->val($form) === true && $val->valexp($form) === true) {
    //begin your transaction here.  Depending on your framework it could be different.
    mysql_query('start transaction');
    try {
        $val->insertData($db, $form, $id);
        $val->insertLanguages($db, $form, $id);
        $val->insertWorker($db, $form, $id);

        //... blah blah blah  more inserts here

        //commit your transaction here
        mysql_query('commit');
    } catch (Exception $e) {
        //Roll back the transaction here
        mysql_query('rollback');
    }
}

Вам просто нужно, чтобы ваши вставки генерировали исключение, если они терпят неудачу.

0 голосов
/ 22 июня 2011

Оберните его в функцию, поверните все проверки на отрицательные и верните из функции, если результат отрицательный. Кроме того, вы можете использовать исключение внутри методов $ val, поэтому вы будете прерывать выполнение при возникновении ошибки, не проверяя каждую операцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...