2016-09-02 19 views
0

データベースにXMLデータを挿入しようとする際に問題が発生します。私は過去2日間googleで研究してきましたが、私はまだ苦労しています。誰かがそれが最も高く評価されるのを助けることができたら。どうもありがとうございました。データベースへのXMLデータの挿入に失敗する

私はデータを挿入しようとすると、私は次のエラーメッセージが出ます:

<?php 

$db = new PDO('mysql:host=localhost;dbname=data', 'root', ''); 

$xmldoc = new DOMDocument(); 
$xmldoc->load('data.xml'); 

$xmldata = $xmldoc->getElementsByTagName('group'); 
$xmlcount = $xmldata->length; 

for ($i=0; $i < $xmlcount; $i++) { 
    $id = $xmldata->item($i)->getElementsByTagName('id')->item(0)->childNodes->item(0)->nodeValue; 
    $group = $xmldata->item($i)->getElementsByTagName('group')->item(0)->childNodes->item(0)->nodeValue; 
    $category = $xmldata->item($i)->getElementsByTagName('category')->item(0)->childNodes->item(0)->nodeValue; 
    $question = $xmldata->item($i)->getElementsByTagName('question')->item(0)->childNodes->item(0)->nodeValue; 
    $a = $xmldata->item($i)->getElementsByTagName('a')->item(0)->childNodes->item(0)->nodeValue; 
    $b = $xmldata->item($i)->getElementsByTagName('b')->item(0)->childNodes->item(0)->nodeValue; 
    $c = $xmldata->item($i)->getElementsByTagName('c')->item(0)->childNodes->item(0)->nodeValue; 
    $d = $xmldata->item($i)->getElementsByTagName('d')->item(0)->childNodes->item(0)->nodeValue; 
    $stmt = $db->prepare("insert into xml values(?,?,?,?,?,?,?,?)"); 
    $stmt->bindParam(1,$group); 
    $stmt->bindParam(2,$category); 
    $stmt->bindParam(3,$question); 
    $stmt->bindParam(4,$a); 
    $stmt->bindParam(5,$b); 
    $stmt->bindParam(6,$c); 
    $stmt->bindParam(7,$d); 
    $stmt->execute(); 
    printf($name.'<br />'); 
} 

?> 
insert_into_database.php

Notice: Trying to get property of non-object in insert_into_database.php on line 13

Fatal error: Call to a member function item() on null in insert_into_database.php on line 13

data.xmlに

<?xml version="1.0" encoding="UTF-8"?> 

<questions> 
<group name="Question Group 1"> 
    <id>1</id> 
    <category>Category A</category> 
    <question name="Question 1" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question name="Question 2" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question name="Question 3" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question name="Question 4" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question name="Question 5" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
</group> 
<group name="Question Group 2"> 
    <id>2</id> 
    <category>Category B</category> 
    <question name="Question 1" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question name="Question 2" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question name="Question 3" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question name="Question 4" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question name="Question 5" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
</group> 
<group name="Question Group 3"> 
    <id>3</id> 
    <category>Category C</category> 
    <question name="Question 1" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question name="Question 2" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question name="Question 3" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question name="Question 4" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question name="Question 5" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
</group> 
</questions> 
+0

ことができます。ほとんどのデータは、最初の構造に変換するXSLT(文字列として埋め込まれたが、外部ファイルにすることができます)の下に、属性に常駐しているのであなたはエラーが発生した回線を隔離しますか?それは少し簡単に従うことになります –

+0

こんにちは、私はどのように行を分けているのか分かりませんが、行13は "$ group = $ xmldata-> item($ i) - > getElementsByTagName( 'group') - > item(0) - > childNodes-> item(0) - > nodeValue; " – ToCode

+0

これは '$ xmldoc-> load( 'data.xml');や' $ xmldata = $ xmldoc-> getElementsByTagName( 'group'); 'のように思われます。彼らは値を持っている場合? –

答えて

0

あなただけしたい場合はグループを取得してから、これを実行してください:

$group = $xmldata->item($i)->getAttribute('name'); 

全体的には、次のようなコードを変更する必要があります。

$db = new PDO('mysql:host=localhost;dbname=data', 'root', ''); 

$xmldoc = new DOMDocument(); 
$xmldoc->load('data.xml'); 

$xmldata = $xmldoc->getElementsByTagName('group'); 
$xmlcount = $xmldata->length; 

for($i = 0; $i < $xmlcount; ++$i){ 
    $id = $xmldata->item($i)->getElementsByTagName('id')->item(0)->nodeValue; 
    $group = $xmldata->item($i)->getAttribute('name'); 
    $category = $xmldata->item($i)->getElementsByTagName('category')->item(0)->nodeValue; 
    $questioncount = $xmldata->item(0)->getElementsByTagName('question')->length; 

    for($j = 0; $j < $questioncount; ++$j){ 
     $question = $xmldata->item($i)->getElementsByTagName('question')->item($j)->getAttribute('name'); 
     $a = $xmldata->item($i)->getElementsByTagName('question')->item($j)->getAttribute('a'); 
     $b = $xmldata->item($i)->getElementsByTagName('question')->item($j)->getAttribute('b'); 
     $c = $xmldata->item($i)->getElementsByTagName('question')->item($j)->getAttribute('c'); 
     $d = $xmldata->item($i)->getElementsByTagName('question')->item($j)->getAttribute('d'); 

     // Do your database operations 

    } 
} 
0

は、XMLドキュメントの一括インポート用のMySQLのLOAD XML LOCAL INFILEコマンドを使用することを検討してください。これにより、ループが回避されます。しかし、この構造は、次の種類に従う必要があります。

<row column1="value1" column2="value2" .../> 

<row> 
    <column1>value1</column1> 
    <column2>value2</column2> 
</row> 

<row> 
    <field name='column1'>value1</field> 
    <field name='column2'>value2</field> 
</row> 

したがって、(様々な最終用途構造へのXML文書を操作するための変換言語)もXSLTを検討してください。

// LOAD XML AND XSL SOURCES 
$doc = new DOMDocument(); 
$doc->load('data.xml'); 

$xsl = new DOMDocument; 
$xslstr = '<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
      <xsl:output version="1.0" encoding="UTF-8" indent="yes" /> 
      <xsl:strip-space elements="*"/> 

       <xsl:template match="/questions"> 
       <xsl:copy> 
        <xsl:apply-templates select="group"/> 
       </xsl:copy> 
       </xsl:template> 

       <xsl:template match="group">  
       <xsl:apply-templates select="question"/>  
       </xsl:template> 

       <xsl:template match="question"> 
       <xsl:copy> 
        <xsl:attribute name="id"><xsl:value-of select="ancestor::group/id"/></xsl:attribute> 
        <xsl:attribute name="group"><xsl:value-of select="ancestor::group/@name"/></xsl:attribute> 
        <xsl:attribute name="category"><xsl:value-of select="ancestor::group/category"/></xsl:attribute> 
        <xsl:attribute name="question"><xsl:value-of select="@name"/></xsl:attribute> 
        <xsl:copy-of select="@a|@b|@c|@d"/> 
       </xsl:copy> 
       </xsl:template>  
      </xsl:transform>'; 

$xsl->loadXML($xslstr); 

// CONFIGURE TRANSFORMER (ENABLE .php_xsl EXTENSION) 
$proc = new XSLTProcessor; 
$proc->importStyleSheet($xsl); 

// TRANSFORM SOURCE 
$newXml = $proc->transformToXML($doc); 

// SAVE TO FILE 
$xmlfile = 'output.xml'; 
file_put_contents($xmlfile, $newXml); 

// RUN MYSQL COMMAND (MAY NEED TO ALLOW --local-infile IN SETTINGS) 
try { 
    $db = new PDO('mysql:host=localhost;dbname=data', 'root', ''); 
    $db->execute("LOAD XML DATA INFILE 'path/to/output.xml' 
       INTO TABLE xml 
       ROWS IDENTIFIED BY '<question>';"); 
} catch(PDOException $e) { 
    echo $e->getMessage(); 
} 

変換されたXML (属性名は、データベースフィールドと一致する必要があります)

<?xml version="1.0" encoding="UTF-8"?> 
<questions> 
    <question id="1" group="Question Group 1" category="Category A" question="Question 1" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question id="1" group="Question Group 1" category="Category A" question="Question 2" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question id="1" group="Question Group 1" category="Category A" question="Question 3" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question id="1" group="Question Group 1" category="Category A" question="Question 4" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question id="1" group="Question Group 1" category="Category A" question="Question 5" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question id="2" group="Question Group 2" category="Category B" question="Question 1" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question id="2" group="Question Group 2" category="Category B" question="Question 2" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question id="2" group="Question Group 2" category="Category B" question="Question 3" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question id="2" group="Question Group 2" category="Category B" question="Question 4" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question id="2" group="Question Group 2" category="Category B" question="Question 5" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question id="3" group="Question Group 3" category="Category C" question="Question 1" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question id="3" group="Question Group 3" category="Category C" question="Question 2" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question id="3" group="Question Group 3" category="Category C" question="Question 3" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question id="3" group="Question Group 3" category="Category C" question="Question 4" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
    <question id="3" group="Question Group 3" category="Category C" question="Question 5" a="Answer 1" b="Answer 2" c="Answer 3" d="Answer 4"/> 
</questions> 
関連する問題