1

cURLを使用して、同じサイトのあるページから別のページにXMLを投稿しています。

配列からXMLを生成します(このビットは正常に機能します):

$xml = new SimpleXMLElement('<test/>');
array_walk_recursive($arr, array ($xml, 'addChild'));
$xmlxml = $xml->asXML()

次に、cURLを使用して別のページに投稿します。

$url = "http://www.test.com/feedtest.php";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlxml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
echo $output;

これにより、エラーが発生します。

警告:simplexml_load_file()[function.simplexml-load-file]:I / O警告: "xxxxx /の外部エンティティ"<?xml version = "1.0"?><test>[....]"を読み込めませんでした16行目のfeedtest.php"

私は何が間違っているのですか?

私はこれが他のページで起こっていることを追加する必要があります:

if ( $_SERVER['REQUEST_METHOD'] === 'POST' ){ 
    $postFile = file_get_contents('php://input'); 
}
$xml = simplexml_load_file($postFile);

この最後の行は、エラーをトリガーする行です。

4

1 に答える 1

1

これは非常に些細なエラーであり、見逃しがちです。

$postFile = file_get_contents('php://input'); 
            ^^^^^^^^^^^^^^^^^

これにより、XML文字列が$postFileすでにに配置されます。しかし、それをファイル名として使用します。

$xml = simplexml_load_file($postFile);
                      ^^^^

代わりに、次のようにロードできます。

$postFile = 'php://input';

これは完全に有効なファイル名です。したがって、後のコードは機能するはずです。

$xml = simplexml_load_file($postFile);

または、文字列をロードすることもできます。

$postFile = file_get_contents('php://input'); 
...
$xml = simplexml_load_string($postFile);
于 2012-12-21T01:21:16.353 に答える