2013-03-03 42 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>