PHP脚本的任何类型的输入都需要在继续之前进行正确的验证。
在您的情况下,一个更详细的变体
能够
看起来像这样:
try {
if (!isset($_POST['xml'])) {
throw new Exception('Missing Parameter Attribute "xml"');
}
$mode = libxml_use_internal_errors(true);
$xml = new SimpleXMLElement($_POST['xml']);
} catch (Exception $e) {
$code = 400;
$phrase = 'Bad Request';
header(sprintf('HTTP/ %d %s', $code, $phrase), true, $code);
$response = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><response/>');
$response->status->phrase = $phrase;
$response->status->code = $code;
$response->message = $e->getMessage();
if ($errors = libxml_get_errors()) {
$responseErrors = $response->addChild('errors');
foreach($errors as $error) {
$responseError = $responseErrors->addChild('error');
foreach($error as $name => $value) {
$value && $responseError->$name = rtrim($value);
}
}
}
header('Content-Type: application/my-app-response-bucket+xml; charset=utf-8');
$response->asXML('php://STDOUT');
return;
}
foreach ($xml->DATA as $entry) {
$data = array(
'currency_code_travco' => $entry->attributes()->CURRENCY_CODE,
'currency_name' => $entry->CURRENCY_NAME,
'created' => date('Y-m-d H:i:s'),
'modified' => date('Y-m-d H:i:s'),
);
$this->db->insert('currency_travco', $data);
echo '<br>';
}
...
对于为丢失或无效数据的请求提供服务的错误情况(
错误的请求
)则返回适当的响应。它甚至有一个由XML突出显示错误组成的响应体,例如缺少数据:
<?xml version="1.0" encoding="UTF-8"?>
<response>
<status>
<phrase>Bad Request</phrase>
<code>400</code>
</status>
<message>Missing Parameter Attribute "xml"</message>
</response>
或者在XML格式不正确的情况下(
<?xml ?><fa ke></fa>blurb
)提供:
<?xml version="1.0" encoding="UTF-8"?>
<response>
<status>
<phrase>Bad Request</phrase>
<code>400</code>
</status>
<message>String could not be parsed as XML</message>
<errors>
<error>
<level>3</level>
<code>96</code>
<column>6</column>
<message>Malformed declaration expecting version</message>
<line>1</line>
</error>
</errors>
<errors>
<error>
<level>3</level>
<code>41</code>
<column>13</column>
<message>Specification mandate value for attribute ke</message>
<line>1</line>
</error>
</errors>
<errors>
<error>
<level>3</level>
<code>5</code>
<column>16</column>
<message>Extra content at the end of the document</message>
<line>1</line>
</error>
</errors>
</response>