sql >> データベース >  >> RDS >> Mysql

データベースからXMLを生成する際のPHPエンコーディングエラー

    あなたの質問は本当に広いです、私が与えることができる最良の答えはあなたがあなた自身のものを書く代わりに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の生成中にもわかります。



    1. 高度なphp/mysqlページネーションスクリプトの検索

    2. MySQL挿入行、重複時:サフィックスを追加して再挿入

    3. Laravel4で生のSQLクエリをエスケープする

    4. DebianJessieにMariaDB10.1をインストールし、さまざまなMariaDBクエリを実行する