2010-12-03 10 views
2

Je rencontre un problème lors de la manipulation de simplexml_load_file dans mon php. J'essaye d'analyser le xml de fox_sports, et stocke la date dans ma base de données. Mon code ressemble à ci-dessous:Traitement des erreurs dans "simplexml_load_file"

$foxs_url_breaking_news = 'http://feeds.news.com.au/public/rss/2.0/fs_breaking_news_13.xml'; 
    $foxs_xml_breaking_news = simplexml_load_file($foxs_url_breaking_news, 'SimpleXMLElement', LIBXML_NOCDATA); 
    foreach($foxs_xml_breaking_news->channel[0]->item as $item) 
    { 
     $date = date('Y-m-d H:i:s',strtotime($item->pubDate)); 
     $news->insert(array('source' => 'foxsports', 
          'headline' => addslashes($item->title), 
          'timestamp' => $date, 
          'description' => addslashes($item->description), 
          'category' => 'Breaking News', 
          'link' => addslashes($item->link)));    
    } 

Le code que j'ai fonctionne très bien. Mais le problème est que je veux en faire une solution à long terme. J'ai donc besoin d'un traitement d'erreur pour: 1. Si le lien pour le xml n'est plus disponible. 2. Si le fichier simplexml_load_file ne peut pas charger le fichier xml à partir du lien. 3. Si simplexml_load_file ne peut pas charger le fichier xml, foreach ne doit pas non plus être exécuté, car il donnera "Argument invalide fourni pour foreach()"

Ou si vous pensez que je dois m'occuper d'autre chose aussi, pour en faire une solution permanente, faites le moi savoir aussi.

Répondre

2

Couple de choses qui m'a aidé à résoudre mon problème:

$foxs_url_breaking_news = 'http://feeds.news.com.au/public/rss/2.0/fs_breaking_news_13.xml'; 
$foxs_xml_breaking_news = @simplexml_load_file($foxs_url_breaking_news, 'SimpleXMLElement', LIBXML_NOCDATA); 
if(@simplexml_load_file($foxs_url_breaking_news, 'SimpleXMLElement', LIBXML_NOCDATA)) 
{ 
    foreach($foxs_xml_breaking_news->channel[0]->item as $item) 
    { 
     $date = date('Y-m-d H:i:s',strtotime($item->pubDate)); 
     $news->insert(array('source' => 'foxsports', 
          'headline' => addslashes($item->title), 
          'timestamp' => $date, 
          'description' => addslashes($item->description), 
          'category' => 'Breaking News', 
          'link' => addslashes($item->link)));    
    } 
} 

Alors: Je l'ai utilisé @ devant simplexml_load_file pour éviter un message d'erreur dans le cas où il est impossible de charger le fichier Et deuxième: j'ai l'ensemble "@simplexml_load_file ($ foxs_url_breaking_news, 'SimpleXMLElement', LIBXML_NOCDATA)" dans mon instruction IF, au lieu de $ foxs_xml_breaking_news. Je n'ai pas une idée de pourquoi cela fonctionne et pas quand j'ai $ foxs_xml_breaking_news dans mon IF ne fonctionnait pas.

J'ai même essayé if ($ foxs_xml_breaking_news === FALSE) mais même cela n'a pas fonctionné pour moi.

+0

J'ai le même problème – illinois

2

La fonction renvoie false en cas d'échec; par conséquent, avant votre boucle, vérifiez si $foxs_xml_breaking_news est false.

$foxs_xml_breaking_news = @simplexml_load_file($foxs_url_breaking_news, 'SimpleXMLElement', LIBXML_NOCDATA); 
if($foxs_xml_breaking_new === false) 
{ 
    //cannot fetch file 
} 
else 
{ 
    // foreach loop... 
} 
+0

Merci, cela peut être fait, mais je voudrais quand même obtenir une erreur « simplexml_load_file ($ foxs_url_breaking_news » et le lien est rompu, ou simplexml_load_file est incapable de charger le xml. Comment puis-je prendre soin de cela. –

+0

place un '@' avant l'appel de la fonction Je vais mettre à jour ma réponse –

+0

Placer @ va dans l'instruction else pour moi, et donne une erreur dans ma boucle foreach –