Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

PHP एन्कोडिंग त्रुटि डेटाबेस से 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 डेटाबेस से लौटाए गए यूटीएफ -8 स्ट्रिंग्स को ठीक से एन्कोड करने के लिए यहां देखभाल कर रहा है। <![CDATA[...]]> . की कोई आवश्यकता नहीं है (सामान्यतः) यहाँ अब और। जैसा कि आप कल्पना कर सकते हैं कि आपने वहां कुछ ऐसा डाल दिया है जो आपके एक्सएमएल एन्कोडिंग को तोड़ देता है।

इसके अलावा डेटाबेस इंटरैक्शन के लिए, आपका अधिकांश कोड या तो आवश्यक नहीं है, आप केवल पंक्तियों पर पुनरावृति कर सकते हैं, यदि कोई पंक्तियाँ नहीं हैं, तो कोई पुनरावृत्ति नहीं होगी। यह आमतौर पर 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>

यदि आपको अभी भी सीडीएटीए तत्व बनाने की आवश्यकता है, तो यह समान रूप से काम करता है (मैं यहां केवल स्क्रिप्ट का एक हिस्सा दिखाता हूं, जिसमें केवल एक मामूली संशोधन होता है जिसमें बच्चे के मूल्य के बजाय सीडीएटीए अनुभाग शामिल होते हैं):

### 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 सीडीएटीए अनुभाग को ठीक से एन्कोड करने का ख्याल रखता है। शायद कुछ ऐसा जो आपने नहीं किया।

संभावित समस्याएं जो आप अभी भी चला सकते हैं वे तालिका या पंक्ति नामों के साथ हैं जो हैं अमान्य XML नाम . लेकिन फिर DOMDocument वास्तव में आपको बताएगा ताकि आप एक्सएमएल उत्पन्न करते समय न केवल बाद में एन्कोडिंग त्रुटि के साथ जान सकें।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP और MySQL का उपयोग कर उपयोगकर्ता रेफ़रल सिस्टम

  2. innodb में इंडेक्स को डिसेबल कैसे करें

  3. स्थानीय परीक्षण के लिए MySQL इंस्टॉलेशन कैसे बनाएं

  4. MySQL 5.6 DATETIME मिलीसेकंड/माइक्रोसेकंड स्वीकार नहीं करता

  5. पेजिनेशन पेज नंबर सीमित करें