2013-03-03 2 views
-3

Я пытаюсь получить простой PHP-сервис для создания XML для приложения iPhone, источника из базы данных SQL. База данных содержит множество источников и символов текста, некоторые из которых, кажется, сбросив сценарий и производит следующее сообщение об ошибке кодирования:Ошибка кодирования PHP при создании XML из базы данных

ошибку на линии 1 в колонке 6232: Кодирование ошибки

РНР, как следует:

<?php 
    //database configuration 
    $config['mysql_host'] = "XXX.XXX.XXX.XXX"; 
    $config['mysql_user'] = "XXXX"; 
    $config['mysql_pass'] = "XXXX"; 
    $config['db_name'] = "XXXX"; 
    $config['table_name'] = "articles"; 

    //connect to host 
    mysql_connect($config['mysql_host'],$config['mysql_user'],$config['mysql_pass']); 
    //select database 
    @mysql_select_db($config['db_name']) or die("Unable to select database"); 

$xml   = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"; 
$root_element = $config['table_name']."s"; 
$xml   .= "<$root_element>"; 

$sql = "SELECT * FROM ".$config['table_name']; 

$result = mysql_query($sql); 
if (!$result) { 
    die('Invalid query: ' . mysql_error()); 
} 

if(mysql_num_rows($result)>0) 
{ 
    while($result_array = mysql_fetch_assoc($result)) 
    { 
     $xml .= "<".$config['table_name'].">"; 

     //loop 
     foreach($result_array as $key => $value) 
     { 

      $xml .= "<$key>"; 


      $xml .= "<![CDATA[$value]]>"; 

      //and close the element 
      $xml .= "</$key>"; 
     } 

     $xml.="</".$config['table_name'].">"; 
    } 
} 


$xml .= "</$root_element>"; 

//send xml 
header ("Content-Type:text/xml"); 


echo $xml; 
?> 

Некоторые статьи приводят к сбою всей страницы, а некоторые нет. Любая помощь будет принята с благодарностью.

+0

Если вам нужна помощь, вам нужно задать конкретный вопрос. Это начинается с выяснения того, что именно вызывает ошибку кодирования. Если вы не в состоянии, мы не можем вам помочь. (вы видите, что с различными ответами, которые, скорее всего, будут догадками, которые, как вы можете себе представить, вам не помогут). – hakre

ответ

0

Ваш вопрос действительно широк, лучший ответ, который я могу дать, что вы должны использовать некоторые существующие библиотеки для кодирования XML вместо написания (поскольку вы, очевидно, не выполняете работу, следовательно, ошибка XML-кодирования, о которой сообщает XML-консумент).

Использование существующей библиотеки также позволит вам указывать проблемы ранее. Например. для следующего кода убедитесь, что все, что вы вернетесь из своей базы данных, - это кодированные строки UTF-8.

Также, используя более современный клиентский класс базы данных, вы также сможете значительно списать код. Вот пример с PDO и DOMDocument:

### configuration values 

$config = array(
    'Database'  => array(
     'dsn' => 'mysql:dbname=test;host=localhost;charset=utf8', 
     'user' => 'testuser', 
     'pass' => 'test', 
    ), 
    'table_name' => 'config', 
    'table_fields' => '*', 
); 

### implement database access 

class Database extends PDO 
{ 
    public function __construct(array $config = null) 
    { 
     $config = $config ? : $GLOBALS['config'][__CLASS__]; 
     parent::__construct($config['dsn'], $config['user'], $config['pass']); 
     $this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     $this->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE); 
     $this->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 
    } 
} 

### setup the datasource ($rows) 

$db = new Database(); 
$rows = $db->query("SELECT $config[table_fields] FROM $config[table_name]"); 

### setup the XML encoder ($doc) 

$doc    = new DOMDocument(); 
$doc->formatOutput = true; 
$doc->loadXML("<$config[table_name]s/>"); 
$doc->encoding = 'utf-8'; 

### fetch data from the datasource and encode the XML 

foreach ($rows as $row) { 
    $child = $doc->createElement($config['table_name']); 
    $child = $doc->documentElement->appendChild($child); 
    foreach ($row as $key => $value) { 
     $child->appendChild($doc->createElement($key, $value)); 
    } 
} 

### output XML 

header("Content-Type:text/xml"); 
echo $doc->saveXML(); 

Смотрите, что DomDocument ухаживают здесь правильное кодирование строк UTF-8, которые возвращаются из базы данных. Существует (обычно) нет необходимости в <![CDATA[...]]> здесь. Как вы можете себе представить, вы, вероятно, положили что-то там, что сломало вашу XML-кодировку.

Также для взаимодействия с базой данных большая часть вашего кода также не нужна, вы можете просто перебирать строки, если строк нет, не было бы итерации. Обычно это лучше всего выражается с помощью Iterator, который может работать на языке, который может работать на основе современных интерфейсов баз данных. Технически вы можете заменить $rows здесь многими другими вещами, такими как итератор, который перебирает несколько таблиц один за другим.

Кроме того, использование режима ошибок исключает возможность размещения чеков и die по всей вашей кодовой базе.

Примерный выход:

<?xml version="1.0" encoding="utf-8"?> 
<configs> 
    <config> 
    <id>1</id> 
    <option>value for option with ID1</option> 
    </config> 
    <config> 
    <id>2</id> 
    <option>value for option with ID2</option> 
    </config> 
    ... 
</configs> 

Если вы после этого нужно создать CDATA элементов, она работает так же (я показываю только часть сценария здесь, который содержит только небольшую модификацию добавление секций CDATA вместо о стоимости ребенка):

### fetch data from the datasource and encode the XML 

foreach ($rows as $row) { 
    $child = $doc->createElement($config['table_name']); 
    $child = $doc->documentElement->appendChild($child); 
    foreach ($row as $key => $value) { 
     $child->appendChild($doc->createElement($key)) 
       ->appendChild($doc->createCDATASection($value)) 
     ; 
    } 
} 

Здесь так же, DOMDocument заботится о правильном кодировании раздел CDATA. Что-то, вероятно, вы этого не сделали.

Возможные проблемы, с которыми вы все еще можете столкнуться, - это имена таблиц или строк, которые являются invalid XML names. Но тогда DOMDocument на самом деле скажет вам, что вы знаете, генерируя XML, а не только после этого с ошибкой кодирования.

0
mysql_connect($config['mysql_host'],$config['mysql_user'],$config['mysql_pass']); 
mysql_set_charset('utf8'); 
mysql_select_db($config['db_name']); 
-1

Как вы описали формат XML как utf8, таким образом, все символы в XML-файле должны быть символами utf8.

Вы получаете сообщение об ошибке, так как есть символы UTF8. Вы должны изменить характер в формат UFT8 и есть два пути для проверки UTF8 символов

Way 1

if (mb_check_encoding(file_get_contents($file), 'UTF-8')) { 
    // yup, all UTF-8 
} 

Таким образом, это убедиться, что все символы UTF8 совместимы и если строка не соответствует к utf8, затем опустили.

Way 2

mysql_connect($config['mysql_host'],$config['mysql_user'],$config['mysql_pass']); 
mysql_set_charset('utf8'); 
mysql_select_db($config['db_name']); 

Way 3

<xml> 
<![CDATA[ 

    ///Enter the Test here 


]]> 
</xml> 
Смежные вопросы