2011-06-22 4 views
1

J'utilise ce code, mais je sais que ce n'est pas très efficace. Il y a un autre moyen? plus efficace ?façon plus efficace .php

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);} 
... 

grâce

+0

Pas vraiment si c'est le flux logique et tout * inefficacité * du point de vue de la performance est trivial. –

+0

Pourquoi avez-vous {} en dehors des instructions d'affectation? – Dogbert

+0

vouliez-vous dire cela? {$ data ['livre'] = $ val-> validate_age ($ form);}? – user773961

Répondre

1

C'est ce que exceptions sont pour:

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. 
    // 
} 

Bien sûr, cela implique que les méthodes de la classe validateur jet exceptions au lieu de retourner booleans:

class Validator { 

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

    // 
    // .. etc .. 
    // 
} 
0

envelopper dans une fonction, tournez tous les contrôles aux résultats négatifs et de retour de la fonction, si le résultat est négatif. En outre, vous pouvez utiliser l'exception à l'intérieur des méthodes $ val, de sorte que vous interrompez l'exécution chaque fois qu'il y a une erreur, sans vérifier chaque opération.

1

Vous pouvez quitter tôt .. Je ne sais pas exactement ce qui se passe dans votre code quand il y a un échec, mais si ce serait en fonction .. vous pourriez faire au lieu de ceci:

if(condition1) { 

    if (condition2) { 

    return true; 

    } 

} 

return false; 

vous pouvez faire:

if (!condition1) { 
    return false; 
} 

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

donc vous gérer essentiellement le cas 'autre' abord ..

.. En outre cela peut aussi fonctionner:

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

ou:

if (
    condition1 && 
    condition2 && 
    condition3 && 
    condition4 
) { 
    return true; 
} else { 
    return false; 
} 
+0

J'ai besoin de vérifier pour chaque fonction l'erreur return $, et arrête le processus. – user773961

0

Vous pouvez vérifier tout votre validation dans une condition extérieure, ouvrez une transaction de base de données à l'intérieur de cela. Mettez tous vos inserts à l'intérieur d'un essai et une annulation de transaction à l'intérieur d'une capture.

quelque chose comme ceci:

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'); 
    } 
} 

Vous avez juste besoin d'avoir vos inserts jeter une exception si elles échouent.

1

Dans ce cas très précis, vous pourriez être en mesure de le comprimer dans une expression à l'aide and Enchaînement:

$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); 

qui semble très approprié puisque vous assigments vraiment doubles et if chèques autrement.

Cela fonctionne parce que and a une précision inférieure à celle de l'opérateur d'affectation =. Vos chèques ===true sont redondants. Et si vous le souhaitez, vous pouvez reconditionner toute cette chaîne de conditions en tant que prédicat if().

1

Il ressemble à tous vos appels de fonction retour un bool. Ce code devrait fonctionner. Si l'un des appels renvoie false, $ data ['livre'] sera faux.

$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); 
Questions connexes