-3

SQLデータベースから調達してiPhoneアプリケーション用のXMLを生成するための単純なPHPサービスを取得しようとしています。データベースにはさまざまなテキストソースと文字があり、そのうちのいくつかはスクリプトを破棄し、次のエンコードエラーを生成しているようです。

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
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 に答える
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で最もよく表現されます。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 に答える
-1

XML形式をutf8として説明したように、XMLファイル内のすべての文字はutf8文字である必要があります。

UTF8以外の文字があるため、エラーが発生します。文字をUFT8形式に変更する必要があり、UTF8文字をチェックする方法は2つあります。

方法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>
于 2013-03-03T04:52:31.200 に答える