Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP的XML解析错误_Php_Xml_Apache_Api - Fatal编程技术网

PHP的XML解析错误

PHP的XML解析错误,php,xml,apache,api,Php,Xml,Apache,Api,我有一些php代码,它调用我在不同服务器/实例上的api并响应响应。每当我尝试在浏览器中运行下面的php时,我都会收到一个xml解析错误,在文档的末尾声明额外的内容。我无法找出我的代码中的错误在哪里,任何指针都将不胜感激 PHP: API PHP <?php error_reporting(E_ALL ^ E_NOTICE); // The following four statements allow AJAX style Javascript requests to get t

我有一些php代码,它调用我在不同服务器/实例上的api并响应响应。每当我尝试在浏览器中运行下面的php时,我都会收到一个xml解析错误,在文档的末尾声明
额外的内容。我无法找出我的代码中的错误在哪里,任何指针都将不胜感激

PHP:


API PHP

<?php

error_reporting(E_ALL ^ E_NOTICE);

// The following four statements allow AJAX style Javascript requests to get through by allowing certain headers
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: OPTIONS, HEAD, GET, POST');
header('Access-Control-Max-Age: 604800');
header('Access-Control-Allow-Headers: X-Requested-With,Content-Type, Content-Length, Authorization, Connection');


$valid_user = 'someuser';

//db host
define(DB_HOST,'192.168.1.116'); 
define(DB_USER,'DBUSER');
define(DB_PASSWORD,'DBPASS');
define(DB_DATABASE,'databasename');  
$dbConn=mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_DATABASE);

$query="select signature from api_keys where id='$valid_user'";
$result=mysqli_query($dbConn,$query);
$cnt=mysqli_num_rows($result);
if($cnt!=1)
        invalidRequest('001');

$row=mysqli_fetch_assoc($result);
$signature = $row["signature"];



$headers=apache_request_headers();
$digest=$headers["Authorization"];


if (is_null($digest))
{
        invalidRequest('002');
}

// Attempt to auth the request - grab the token and request date provided by the external API caller
$token=$_POST["token"];
$request_date=$_POST["timestamp"];

// No token or reqauest generates an error
if(!$token || !$request_date)
{
        invalidRequest('002');
}
// The page wasn't called right, so throw an error
if(!$_GET["action"])
{
    invalidRequest('002');
}



$hash_string=base64_encode(hash_hmac('sha256',$valid_user . ":" . $token . ":" . $request_date,$signature,1));
//echo $hash_string . ":" . $digest;
//exit();
// Compare the hash we generated with the one provided by the requester
// If they do not match, throw an error
if($hash_string!=$digest)
{
        invalidRequest('002');
}


$query="select token from api_tokens where id='$valid_user' and token='$token'";
$result=mysqli_query($dbConn,$query);
$cnt=mysqli_num_rows($result);
 ('$valid_user','$token','" . date("Y-m-d H:i:s") . "')";

// Get the information requested and return it as XML string.
if($_GET["action"]=='getAllAlbums')
{
    // This is a request for all the albums in the DB
    $query="select id,artist,name from albums order by id";
    $result=mysqli_query($dbConn,$query);
    if(mysqli_num_rows($result) < 1)
        invalidRequest('006');
    $xml_string="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
    $xml_string.="<music_inventory>\n";
    while($row=mysqli_fetch_assoc($result))
    {
        $xml_string.="<album id=\"" . $row["id"] . "\">\n";
        $xml_string.="<artist>" . htmlentities($row["artist"]) . "</artist>\n";
        $xml_string.="<name>" . htmlentities($row["name"]) . "</name>\n";
        $xml_string.="</album>\n";
    }
    $xml_string.="</music_inventory>";
}
else if($_GET["action"]=='getAlbum')
{
    // This was a request for a single album's full info
    $query="select id,type,albumart,artist,name,year,label,disc,totaldiscs from albums where id='" . $_POST["albumID"] . "'";
    $result=mysqli_query($dbConn,$query);
    if(mysqli_num_rows($result) < 1)
        invalidRequest('006');
    $xml_string="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
    $xml_string.="<music_inventory>\n";
    while($row=mysqli_fetch_assoc($result))
    {
        if($row["type"]=='F')
            $type='full length';
        else if($row["type"]=='E')
            $type='EP';
        else
            $type='unknown';
        $xml_string.="<album id=\"" . $row["id"] . "\" type=\"$type\" albumart=\"" . $row["albumart"] . "\">\n";
        $xml_string.="<artist>" . $row["artist"] . "</artist>\n";
        $xml_string.="<name>" . $row["name"] . "</name>\n";
        $xml_string.="<year>" . $row["year"] . "</year>\n";
        $xml_string.="<label>" . $row["label"] . "</label>\n";
        $xml_string.="<disc>" . $row["disc"] . "</disc>\n";
        $xml_string.="<totaldiscs>" . $row["totaldiscs"] . "</totaldiscs>\n";
    }
    $query="select id,track_number,track_title,track_artist from tracklist where id='" . $_POST["albumID"] . "' order by track_number";
    $result=mysqli_query($dbConn,$query);
    $xml_string.="   <tracklist>\n";
    while($row=mysqli_fetch_assoc($result))
    {
        $xml_string.="<track id=\"" . $row["track_number"] . "\">" . htmlentities($row["track_title"]) . "</track>\n";
    }
    $xml_string.="</tracklist>\n";
    $xml_string.="</album>\n";
    $xml_string.="</music_inventory>\n";
}
else if($_GET["action"]=='getTrackList')
{
    // This was a request for a specific album's track list
    $xml_string="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
    $query="select id,track_number,track_title,track_artist from tracklist where id='" . $_POST["albumID"] . "' order by track_number";
    $result=mysqli_query($dbConn,$query);
    $xml_string.="<music_inventory>";
    $xml_string.="<album id=\"" . $_POST["albumID"] . "\"></album>\n";
    $xml_string.="<tracklist>\n";
    while($row=mysqli_fetch_assoc($result))
    {
        $xml_string.="<track id=\"" . $row["track_number"] . "\">" . $row["track_title"] . "</track>\n";
    }
    $xml_string.="</tracklist>\n";
    $xml_string.="</music_inventory>";
}
else
{
    // This did not have a valid request attached to it
    invalidRequest('003');
}
// Echo out the result as XML
header('Content-Type: text/xml');
echo $xml_string;
exit();

function invalidRequest($error)
{
    // This is the error thrown in all cases above.
    $xml_string="<?xml version=\"1.0\"?>\n";
    $xml_string.="<systemerror>\n";
    $xml_string.=" <errorcode>$error</errorcode>\n";
    $xml_string.="</systemerror>\n";
    header('Content-Type: text/xml');
    echo $xml_string;
        exit();
}

?>

该错误消息表示您输出的XML字符串无效。您发布的PHP代码(可能)没有问题。查看源代码并确保每个元素都正确关闭和嵌套。API可能正在向您发送错误数据。如果API响应总是有相同的错误,您可以通过在将其传递到浏览器之前执行字符串操作(例如str_replace或preg_replace)或
simplexml_decode_string()

手动创建XML(字符串连接)来修复。这是一个容易出错的过程。这也是一个由经验不足的程序员完成的过程。两者的结合或多或少会导致错误情况,如您所描述的(“文档末尾的额外内容”)。请先联系我们网站上关于此错误的现有问答材料。在您的情况下,可能有许多具体的原因导致错误,但问答的目的是描述错误信息并提供一般解决方案。
<?php

error_reporting(E_ALL ^ E_NOTICE);

// The following four statements allow AJAX style Javascript requests to get through by allowing certain headers
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: OPTIONS, HEAD, GET, POST');
header('Access-Control-Max-Age: 604800');
header('Access-Control-Allow-Headers: X-Requested-With,Content-Type, Content-Length, Authorization, Connection');


$valid_user = 'someuser';

//db host
define(DB_HOST,'192.168.1.116'); 
define(DB_USER,'DBUSER');
define(DB_PASSWORD,'DBPASS');
define(DB_DATABASE,'databasename');  
$dbConn=mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_DATABASE);

$query="select signature from api_keys where id='$valid_user'";
$result=mysqli_query($dbConn,$query);
$cnt=mysqli_num_rows($result);
if($cnt!=1)
        invalidRequest('001');

$row=mysqli_fetch_assoc($result);
$signature = $row["signature"];



$headers=apache_request_headers();
$digest=$headers["Authorization"];


if (is_null($digest))
{
        invalidRequest('002');
}

// Attempt to auth the request - grab the token and request date provided by the external API caller
$token=$_POST["token"];
$request_date=$_POST["timestamp"];

// No token or reqauest generates an error
if(!$token || !$request_date)
{
        invalidRequest('002');
}
// The page wasn't called right, so throw an error
if(!$_GET["action"])
{
    invalidRequest('002');
}



$hash_string=base64_encode(hash_hmac('sha256',$valid_user . ":" . $token . ":" . $request_date,$signature,1));
//echo $hash_string . ":" . $digest;
//exit();
// Compare the hash we generated with the one provided by the requester
// If they do not match, throw an error
if($hash_string!=$digest)
{
        invalidRequest('002');
}


$query="select token from api_tokens where id='$valid_user' and token='$token'";
$result=mysqli_query($dbConn,$query);
$cnt=mysqli_num_rows($result);
 ('$valid_user','$token','" . date("Y-m-d H:i:s") . "')";

// Get the information requested and return it as XML string.
if($_GET["action"]=='getAllAlbums')
{
    // This is a request for all the albums in the DB
    $query="select id,artist,name from albums order by id";
    $result=mysqli_query($dbConn,$query);
    if(mysqli_num_rows($result) < 1)
        invalidRequest('006');
    $xml_string="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
    $xml_string.="<music_inventory>\n";
    while($row=mysqli_fetch_assoc($result))
    {
        $xml_string.="<album id=\"" . $row["id"] . "\">\n";
        $xml_string.="<artist>" . htmlentities($row["artist"]) . "</artist>\n";
        $xml_string.="<name>" . htmlentities($row["name"]) . "</name>\n";
        $xml_string.="</album>\n";
    }
    $xml_string.="</music_inventory>";
}
else if($_GET["action"]=='getAlbum')
{
    // This was a request for a single album's full info
    $query="select id,type,albumart,artist,name,year,label,disc,totaldiscs from albums where id='" . $_POST["albumID"] . "'";
    $result=mysqli_query($dbConn,$query);
    if(mysqli_num_rows($result) < 1)
        invalidRequest('006');
    $xml_string="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
    $xml_string.="<music_inventory>\n";
    while($row=mysqli_fetch_assoc($result))
    {
        if($row["type"]=='F')
            $type='full length';
        else if($row["type"]=='E')
            $type='EP';
        else
            $type='unknown';
        $xml_string.="<album id=\"" . $row["id"] . "\" type=\"$type\" albumart=\"" . $row["albumart"] . "\">\n";
        $xml_string.="<artist>" . $row["artist"] . "</artist>\n";
        $xml_string.="<name>" . $row["name"] . "</name>\n";
        $xml_string.="<year>" . $row["year"] . "</year>\n";
        $xml_string.="<label>" . $row["label"] . "</label>\n";
        $xml_string.="<disc>" . $row["disc"] . "</disc>\n";
        $xml_string.="<totaldiscs>" . $row["totaldiscs"] . "</totaldiscs>\n";
    }
    $query="select id,track_number,track_title,track_artist from tracklist where id='" . $_POST["albumID"] . "' order by track_number";
    $result=mysqli_query($dbConn,$query);
    $xml_string.="   <tracklist>\n";
    while($row=mysqli_fetch_assoc($result))
    {
        $xml_string.="<track id=\"" . $row["track_number"] . "\">" . htmlentities($row["track_title"]) . "</track>\n";
    }
    $xml_string.="</tracklist>\n";
    $xml_string.="</album>\n";
    $xml_string.="</music_inventory>\n";
}
else if($_GET["action"]=='getTrackList')
{
    // This was a request for a specific album's track list
    $xml_string="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
    $query="select id,track_number,track_title,track_artist from tracklist where id='" . $_POST["albumID"] . "' order by track_number";
    $result=mysqli_query($dbConn,$query);
    $xml_string.="<music_inventory>";
    $xml_string.="<album id=\"" . $_POST["albumID"] . "\"></album>\n";
    $xml_string.="<tracklist>\n";
    while($row=mysqli_fetch_assoc($result))
    {
        $xml_string.="<track id=\"" . $row["track_number"] . "\">" . $row["track_title"] . "</track>\n";
    }
    $xml_string.="</tracklist>\n";
    $xml_string.="</music_inventory>";
}
else
{
    // This did not have a valid request attached to it
    invalidRequest('003');
}
// Echo out the result as XML
header('Content-Type: text/xml');
echo $xml_string;
exit();

function invalidRequest($error)
{
    // This is the error thrown in all cases above.
    $xml_string="<?xml version=\"1.0\"?>\n";
    $xml_string.="<systemerror>\n";
    $xml_string.=" <errorcode>$error</errorcode>\n";
    $xml_string.="</systemerror>\n";
    header('Content-Type: text/xml');
    echo $xml_string;
        exit();
}

?>