2013-03-03 68 views
-3

我試圖從一個SQL數據庫中獲取一個簡單的PHP服務來爲iPhone應用程序生成XML。該數據庫具有多種文本源和字符,其中的一些似乎擺脫腳本併產生以下編碼錯誤:在柱6232當從數據庫生成XML時出現PHP編碼錯誤

在第1行錯誤:編碼誤差

的PHP是如如下:

<?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 2013-03-03 11:32:29

回答

0

你的問題甚廣,最好的答案我可以給的是,你應該使用一些現有的庫來編碼XML,而不是寫你自己的一個(因爲你明顯失敗了,所以XML編碼報告XML編碼錯誤)。

使用現有庫還可以讓您更早地指出問題。例如。對於以下代碼,確保從數據庫中返回的所有內容都是UTF-8編碼的字符串。

另外使用更現代的數據庫客戶端類也將幫助你大大簡單地寫下代碼。這裏是PDODOMDocument一個例子:

### 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來表示foreach語言結構可以對現代數據庫接口提供的操作進行操作。從技術上講,你可以用其他很多東西代替$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字符

路1

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

這樣,它根據任何行,如果沒有確保所有字符都是UTF8兼容,到UTF8然後被排除在外。

路2

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

路3

<xml> 
<![CDATA[ 

    ///Enter the Test here 


]]> 
</xml>