2010-09-07 6 views
3

Je reçois occasionnellement des problèmes de décalage non définis lors de l'analyse d'un fichier volumineux dans PHP.Comment afficher les variables en cas d'erreur?

Comment puis-je afficher les variables SEULEMENT lorsque l'erreur se produit, pour voir quel est le problème?

L'erreur est INTERVENUES à ce point de mon php

list($export_date, $application_id, $language_code, $title, $description, $release_notes, $company_url, $suppport_url, $screenshot_url_1, $screenshot_url_2, $screenshot_url_3, $screenshot_url_4, $screenshot_width_height_1, $screenshot_width_height_2, $screenshot_width_height_3, $screenshot_width_height_4,$ipadscreenshot_url_1, $ipadscreenshot_url_2, $ipadscreenshot_url_3, $ipadscreenshot_url_4, $ipadscreenshot_width_height_1, $ipadscreenshot_width_height_2, $ipadscreenshot_width_height_3, $ipadscreenshot_width_height_4) = explode($delimiter, $line); 

Je voudrais donc faire écho à toutes les variables de l'erreur de décalage, si aucune erreur, il suffit de déplacer sur le prochain album sans faire quoi que ce soit.

Répondre

0

l'erreur se produit si explode($delimiter, $line) ne sont pas retournés en tant que paramètres autant que la déclaration exige la liste, vous pouvez vérifier si tel est le cas comme celui-ci:

$parts = explode($delimiter, $line); 
if(count($parts)!=20) { //say your list needs 20 elements 
    echo '20 parts expected, got '. count($parts). '<br />';//consider using error_log than echoing data 
    var_dump($line, $parts); 
} else { 
    list($export_date, $application_id, $language_code /*fill others*/) = $parts; 
} 
+0

merci ce si parfait, si elle les erreurs, cela signifie que mes données d'entrée est corrompu, donc je veux l'ignorer. – kitenski

0

Avez-vous essayé set_error_handler? Il vous permet d'écrire une fonction qui sera exécutée lorsqu'une erreur ou un avertissement se produit. Le paramètre errcontext contient toutes les variables. Vous pouvez par exemple enregistrer $line lorsque cela se produit, puis passer à la ligne suivante. Voir le lien pour des exemples.

0

La solution d'aularon est une excellente solution rapide, mais si vous cherchez une solution à long terme, essayez de définir le gestionnaire d'erreurs. Je suppose que vous ne recevez pas vraiment d'erreur, mais plutôt un avertissement. Vous pouvez faire quelque chose comme ceci:

(voir http://us2.php.net/manual/en/function.set-error-handler.php)

function myErrorHandler($errno, $errstr, $errfile, $errline, $symbols) 
{ 
    if (!(error_reporting() & $errno)) { 
    // This error code is not included in error_reporting 
    return; 
    } 

    switch ($errno) { 

    case E_USER_WARNING: 
     echo "<b>My WARNING</b> [$errno] $errstr<br />\n"; 
     vardump($symbols['line']); // untested but this should give you the line as set when the error was raised 
     break; // maybe die or exit here instead 
    } 

    /* Don't execute PHP internal error handler */ 
    return true; 
} 

Vous pouvez set_error_handler() juste avant de commencer votre boucle, puis restore_error_handler() juste après que vous ne finissent pas avec un gestionnaire d'erreur floue pour l'application entière ou le script.

0

J'ai deux approches pour vous:

Première:

Vous pouvez stocker ces valeurs dans un tableau temporaire et compter les éléments, s'il y a moins de 24 ans, quelque chose a mal tourné!

$tmp_arr = explode($delimiter, $line); 
if(count($tmp_arr) < 24) { 
    print_r($tmp_arr); // gives you a nice output 
} 
else 
{ 
    list($export_date, $application_id, $language_code, $title, $description, $release_notes, $company_url, $suppport_url, $screenshot_url_1, $screenshot_url_2, $screenshot_url_3, $screenshot_url_4, $screenshot_width_height_1, $screenshot_width_height_2, $screenshot_width_height_3, $screenshot_width_height_4,$ipadscreenshot_url_1, $ipadscreenshot_url_2, $ipadscreenshot_url_3, $ipadscreenshot_url_4, $ipadscreenshot_width_height_1, $ipadscreenshot_width_height_2, $ipadscreenshot_width_height_3, $ipadscreenshot_width_height_4) = explode($delimiter, $tmp_arr); 
} 

Si vous ne souhaitez pas le tableau temporaire, vous pouvez compter les délimiteurs (pas aussi bon à mon avis)

if(substr_count($line, $delimiter) < 23) { 
    // less than 24 fields! 
    print_r(explode($delimiter, $tmp_arr)); 
} 
else 
{ 
    // everything alright! 
    list($export_date, $application_id, $language_code, $title, $description, $release_notes, $company_url, $suppport_url, $screenshot_url_1, $screenshot_url_2, $screenshot_url_3, $screenshot_url_4, $screenshot_width_height_1, $screenshot_width_height_2, $screenshot_width_height_3, $screenshot_width_height_4,$ipadscreenshot_url_1, $ipadscreenshot_url_2, $ipadscreenshot_url_3, $ipadscreenshot_url_4, $ipadscreenshot_width_height_1, $ipadscreenshot_width_height_2, $ipadscreenshot_width_height_3, $ipadscreenshot_width_height_4) = explode($delimiter, $line); 
} 

Attention! vous avez seulement 23 délimiteurs pour 24 champs! ;)

Deuxième approche:

Depuis le Undefined offset question est juste un « avis » de PHP, vous pouvez écrire un gestionnaire d'erreur qui attire l'avis.

Voir: http://www.codeunit.co.za/2009/09/09/php-how-to-catch-a-script-warning-or-notice/

Mais celui-ci peut-être un peu exagéré;)

Cordialement

Simon

Questions connexes