1

これについてあなたの助けに感謝します。基本的に、ユーザーが都市名を (そのコードで) 選択する PHP Web ページがあり、これがスクリプトに送信され、データベース内の都市が検索され、それに関連付けられた XML ファイルが取得され、現在の天気が含まれます。をクリックして表示します。ユーザーが存在しないコードを選択した場合を除いて、すべて正常に機能します。次に何が起こるかというと、次のメッセージが表示されます。

Warning: SimpleXMLElement::__construct() [simplexmlelement.--construct]: Entity: line 1: parser error : Start tag expected, '<' not found in ...

これに関する主な問題は、すべての読み込みが停止するため、ユーザーに表示されるだけでなく、HTML を含むページの残りの部分やすべてが読み込まれないことです。

私が望むのは、ファイルの構造が間違っていることが見つからない場合に、「エラー、都市が見つかりません」などのメッセージを単にエコーし、残りのスクリプトをスキップして、残りをロードするという、ある種のチェックを行うことです。ウェブページ、その HTML などの

インターネットでいくつかの解決策を見つけましたが、うまく実装できませんでした。

実際の xml をロードするコードは次のようになります。

public function __construct($query, $units = 'imperial', $lang = 'en', $appid = ''){

$xml = new SimpleXMLElement(OpenWeatherMap::getRawData($query, $units, $lang, $appid, 'xml'));

$this->city = new _City($xml->city['id'], 
$xml->city['name'], 
$xml->city->coord['lon'], 
$xml->city->coord['lat'], 
$xml->city->country);

etc.

都市が見つからない場合、プログラムは XML の代わりに次のように取得します。

http://api.openweathermap.org/data/2.5/weather?id=123456

見つかった場合は、次のようになります。

http://api.openweathermap.org/data/2.5/weather?q=ロンドン&モード=xml

4

2 に答える 2

0

これを試すことができます: http://php.net/manual/en/language.exceptions.php

ところで、ユーザーにエラーがスローされるのを避けるために、これらの php オプションのいくつかを設定して、エラーが apache サーバー ログまたは別のファイルに記録されますが、ユーザーには表示されないようにすることをお勧めします。これは、セキュリティの観点からも優れています: http://php.net/manual/en/errorfunc.configuration.php

更新:エラー ログ オプションを設定するための優れたガイドが表示されます。

于 2013-07-17T20:58:55.393 に答える
0

SimpleXMLElement のドキュメントによると、ファイルを解析できなかった場合、コンストラクターは例外をスローします。私はそれをtry-catchでラップしようとします:

try {
  $xml = new SimpleXMLElement(...);
  // The xml loaded, so display the proper information.
} catch (Exception $e) {
  // If it gets here, the xml could not load, so print your 'city not found' message and continue loading the page.
}

何が起こるかというと、新しい SimpleXMLElement オブジェクトを構築しようとしますが、コンストラクターはエラーを「スロー」します。通常、スローはそのトラック内のすべてを停止しますが、それを「キャッチ」しているため、「ねえ、問題が発生した場合は、コントロールを私に戻して、それについて何をすべきかを決めさせてください」と明示的に言っています.

于 2013-07-17T21:00:24.967 に答える