I am trying to give the option to get either a JSON or XML response.
JSON works fine but when I view the XML, I get an error.
http://lmsapi.com/?api_key=fba9e59d7af86b239e82581780ff987e&format=json http://lmsapi.com/?api_key=fba9e59d7af86b239e82581780ff987e&format=xml
I'm not sure what is going wrong. I have searched and the only thing I see is to make sure that I don't have any extra whitespace or even have spaces in my element names, which I don't.
index.php
<?php
require_once('includes/inc.settings.php');
if(${'Response'}['format'] == 'json'){
print_r(${'Results'});
}elseif(${'Response'}['format'] == 'xml'){
header('Content-type: application/xml');
echo "<?xml version=\"1.0\"?>";
echo ${'Results'};
}
?>
inc.settings.php
<?php
// ****************************************
// Require other includes
// ****************************************
require('Excel/PHPExcel.php');
require('inc.variables.php');
require('inc.functions.php');
require('inc.browser.php');
require('class.phpmailer.php');
// ****************************************
// Initial page setup
// ****************************************
// Set our Error Handling
if($debug == true){
error_reporting(E_ALL);
ini_set('display_errors', 1);
} else {
error_reporting(E_ERROR);
ini_set('display_errors', 1);
}
// Set our timeout limit
set_time_limit(30);
// Set our memory limit
ini_set('memory_limit', '128M');
// Start our PHP session
session_start();
// Set our charset to UTF-8
mb_internal_encoding('UTF-8');
// Get our browser information
$browser = new Browser;
// ****************************************
// Connect to mySQL
// ****************************************
mysql_connect(MYSQL_HOST.':'.MYSQL_PORT, MYSQL_USER, MYSQL_PASS) or die('Could not establish a connection to the MySQL Engine.');
mysql_select_db(MYSQL_DB) or die('Could not locate the specified database');
// ****************************************
// Sanitize our possible api data
// ****************************************
if(isset($_GET['api_key'])) { ${'API KEY'} = inputCleanSQL($_GET['api_key']); } else { ${'API KEY'} = ''; }
if(isset($_GET['format'])){ ${'Format'} = inputCleanSQL($_GET['format']); } else { ${'Format'} = ''; }
if(isset($_GET['act'])){ ${'Action'} = inputCleanSQL($_GET['act']); } else { ${'Action'} = ''; }
if(isset($_GET['phone_numer'])){ ${'Phone Number'} = inputCleanSQL(removeCHARSphone($_GET['phone_number'])); } else { ${'Phone Number'} = ''; }
if(isset($_GET['limit'])){ ${'Limit'} = inputCleanSQL($_GET['limit']); } else { ${'Limit'} = ''; }
// ****************************************
// Begin the Response Array
// ****************************************
${'Response'} = array();
${'Response'}['status'] = '';
${'Response'}['reason'] = array();
${'Format Type'} = true;
// Check the API Key
if(isset(${'API KEY'})){
${'API Key Check'} = mysql_result(mysql_query('SELECT count(0) FROM `api`.`api_keys` WHERE `api_key` = "'.${'API KEY'}.'"'),0);
if(!${'API Key Check'}) {
${'Response'}['status'] = 'failed';
${'Response'}['reason'][] = 'invalid api key';
} else {
// Log the API hit
mysql_query('INSERT INTO `api`.`api_log` (`api_key`) VALUES ("'.${'API KEY'}.'")');
// Check the format request
if(${'Format'} != '' && ${'Format'} != 'json' && ${'Format'} != 'xml'){
${'Response'}['status'] = 'failed';
${'Response'}['reason'][] = 'invalid format specified (&format=)';
${'Format Type'} = false;
}
// Check the action request
if(${'Action'} != '' && ${'Action'} != 'get' && ${'Action'} != 'details'){
${'Response'}['status'] = 'failed';
${'Response'}['reason'][] = 'invalid action type (&act=)';
}
if(${'Response'}['status'] != 'failed'){
${'Response'}['status'] = 'success';
unset(${'Response'}['reason']);
}
}
} else {
${'Response'}['status'] = 'failed';
${'Response'}['reason'][] = 'api key required';
}
if(isset(${'Format'}) && ${'Format Type'}){
if(${'Format'} == 'json'){
${'Response'}['format'] = 'json';
${'Results'} = json_encode(${'Response'});
} elseif(${'Format'} == 'xml'){
${'Response'}['format'] = 'xml';
${'Results'} = arrayToXML(${'Response'});
}
} else {
${'Response'}['format'] = 'json';
${'Results'} = json_encode(${'Response'});
}
?>
Any help would be much appreciated!
The most common cause is encoding errors. There are several basic approaches to solving this: escaping problematic characters ( < becomes < , & becomes & , etc.), escaping entire blocks of text with CDATA sections, or putting an encoding declaration at the start of the feed.
XML can only have one "document entity" or "root", you're trying to use two (status
and format
). Wrap your two elements in a single one, so that your XML document only has one root element.
Bad
<?xml version="1.0"?>
<status>success</status>
<format>xml</format>
Good
<?xml version="1.0"?>
<response>
<status>success</status>
<format>xml</format>
</response>
Make sure you also triple check for a duplicate urlset declaration at the top of your document. This was my problem. It was a very careless oversight.
<urlset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9"
url="http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With