-3

我正在尝试获取一个简单的 PHP 服务来为 iPhone 应用程序生成 XML,从 SQL 数据库中获取。该数据库有多种文本源和字符,其中一些似乎与脚本无关并产生以下编码错误:

第 1 行第 6232 列的错误:编码错误

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;
?>

有些文章会导致整个页面失败,有些则不会。任何帮助将不胜感激。

4

3 回答 3

0

您的问题非常广泛,我能给出的最佳答案是您应该使用一些现有的库来编码 XML,而不是编写自己的库(因为您显然无法完成这项工作,因此 XML 消费者报告了 XML 编码错误)。

使用现有库还可以让您更早地指出问题。例如,对于以下代码,请确保您从数据库中返回的所有内容都是 UTF-8 编码的字符串。

此外,使用更现代的数据库客户端类也将极大地帮助您编写代码。这是一个带有PDO and的示例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的语言结构来表达。foreach从技术上讲,您可以用许多其他东西替换$rows这里,例如一个接一个地遍历多个表的迭代器。

此外,使用异常错误模式确实可以让您在die整个代码库中放置检查和 s。

示例性输出是:

<?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 部分。一些你可能没有做过的事情。

您仍然可能遇到的潜在问题是无效 XML 名称的表名或行名。但DOMDocument实际上会告诉您,这样您就知道在生成 XML 时,而不仅仅是在之后出现编码错误。

于 2013-03-03T18:39:08.433 回答
0
mysql_connect($config['mysql_host'],$config['mysql_user'],$config['mysql_pass']);
mysql_set_charset('utf8');
mysql_select_db($config['db_name']);
于 2013-03-03T04:40:28.743 回答
-1

正如您将 XML 格式描述为 utf8 一样,因此 XML 文件中的所有字符都必须是 utf8 字符。

由于存在非 UTF8 字符,您会收到错误消息。您必须将字符更改为 UFT8 格式,检查 UTF8 字符有两种方法

方式一

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

这样可以确保所有字符都与 UTF8 兼容,并且如果任何行不符合 utf8 则省略。

方式二

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>
于 2013-03-03T04:52:31.200 回答