2016-09-03 15 views
0

私はこのページからいくつかのスクリプトを使用して私のwebshopに使用しようとしました。私はMySQLデータベースにXMLファイルをインポートしたいと思います。スクリプトは動作していますが、2番目の注文ラインだけがインポートされます。XMLをsimplexmlでMySQLにインポートする

これは私のXMLコードの例です:

<?xml version="1.0" encoding="UTF-8"?> 
<eWebBooking> 
    <OrderHead> 
     <Action>SendFromWarehouse</Action> 
     <OrderReference>5986-20193315</OrderReference> 
     <EarliestOrderDate/> 
     <OrderNumber>20193315</OrderNumber> 
     <SalesOrg>Web</SalesOrg> 
     <DistChannel>Parcel</DistChannel> 
     <InvoiceReference>Reknes</InvoiceReference> 
     <Orderer> 
     <Name>Ola Nordamann</Name> 
     <Telephone>22225555</Telephone> 
     <Email/> 
     <StreetName>Hackerstreet 46</StreetName> 
     <PostalCode>5986</PostalCode> 
     <Region>LEGOLAND</Region> 
     </Orderer> 
    </OrderHead> 


    <OrderLines> 
     <OrderLine>1</OrderLine> 
     <ArticleNo>10501</ArticleNo> 
     <ArticleDescription>MPOW Dunmer Earphone Blueth</ArticleDescription> 
     <ArticleBrand>MPOW</ArticleBrand> 
     <DlvDate>2016-09-09</DlvDate> 
     <NoOfPieces>1</NoOfPieces> 
     <DeliveryStore>eWeb</DeliveryStore> 
     <DeliveryCode>DELIVERY</DeliveryCode> 
     <Weight>0,2</Weight> 
     <Volume>70</Volume> 
     <ShipmentNo>73600698093661246</ShipmentNo> 
     <ParcelNo>373600596034663364</ParcelNo> 
    </OrderLines> 
    <OrderLines> 
     <OrderLine>2</OrderLine> 
     <ArticleNo>10528</ArticleNo> 
     <ArticleDescription>Mpow MBS5 Armor Bluetooth</ArticleDescription> 
     <ArticleBrand>MPOW</ArticleBrand> 
     <DlvDate>2016-09-07</DlvDate> 
     <NoOfPieces>1</NoOfPieces> 
     <DeliveryStore>eWeb</DeliveryStore> 
     <DeliveryCode>PICKUP</DeliveryCode> 
     <Weight>4</Weight> 
     <Volume>50</Volume> 
     <ShipmentNo>73600698093661246</ShipmentNo> 
     <ParcelNo>00373600698636066394</ParcelNo> 
    </OrderLines> 
</eWebBooking> 


私はforeachのコードの一部を変更する必要があることを推測?

<?php 

ini_set('display_errors','On'); 

$con2 = mysql_connect("databasehost","databaseuser","databasepass"); 
if (!$con2) { 
    die('Could not connect: ' . mysql_error()); 
} 

$selectdb = mysql_select_db("databasename", $con2); 
if (!$selectdb) { 
    die('Database not used: ; ' . mysql_error()); 
} 

$file_arr = array(); 

if ($handle = opendir('.')) { 
    while (false !== ($file = readdir($handle))) { 
     if (($file != ".") && ($file != "..")) { 
      if(substr($file, -4) == ".xml") 
      { 
       array_push($file_arr, $file); 
      } 
     } 
    } 
    closedir($handle); 
} 

    foreach($file_arr as $filename) 

{ 
    $xml = simplexml_load_file($filename); 

    $Action = mysql_real_escape_string($xml->OrderHead->Action); 
    $OrderReference = mysql_real_escape_string($xml->OrderHead->OrderReference);  
    $EarliestOrderDate = mysql_real_escape_string($xml->OrderHead->EarliestOrderDate); 
    $OrderNumber = mysql_real_escape_string($xml->OrderHead->OrderNumber); 
    $SalesOrg = mysql_real_escape_string($xml->OrderHead->SalesOrg); 
    $DistChannel = mysql_real_escape_string($xml->OrderHead->DistChannel); 
    $InvoiceReference = mysql_real_escape_string($xml->OrderHead->InvoiceRefernce); 
    $Name = mysql_real_escape_string($xml->OrderHead->Orderer->Name); 
    $Telephone = mysql_real_escape_string($xml->OrderHead->Orderer->Telephone); 
    $Email = mysql_real_escape_string($xml->OrderHead->Orderer->Email); 
    $StreetName = mysql_real_escape_string($xml->OrderHead->Orderer->StreetName); 
    $PostalCode = mysql_real_escape_string($xml->OrderHead->Orderer->PostalCode); 
    $Region = mysql_real_escape_string($xml->OrderHead->Orderer->Region); 


    $OrderLine = mysql_real_escape_string($xml->OrderLines->OrderLine); 
    $ArticleNo = mysql_real_escape_string($xml->OrderLines->ArticleNo); 
    $ArticleDescription = mysql_real_escape_string($xml->OrderLines->ArticleDescription); 
    $ArticleBrand = mysql_real_escape_string($xml->OrderLines->ArticleBrand); 
    $DlvDate = mysql_real_escape_string($xml->OrderLines->DlvDate); 
    $NoOfPieces = mysql_real_escape_string($xml->OrderLines->NoOfPieces); 
    $DeliveryStore = mysql_real_escape_string($xml->OrderLines->DeliveryStore); 
    $DeliveryCode = mysql_real_escape_string($xml->OrderLines->DeliveryCode); 
    $Weight = mysql_real_escape_string($xml->OrderLines->Weight); 
    $Volume = mysql_real_escape_string($xml->OrderLines->Volume); 
    $ShipmentNo = mysql_real_escape_string($xml->OrderLines->ShipmentNo); 
    $ParcelNo = mysql_real_escape_string($xml->OrderLines->ParcelNo); 
    $TimeWindowStart = mysql_real_escape_string($xml->OrderLines->TimeWindowStart); 
    $TimeWindowEnd = mysql_real_escape_string($xml->OrderLines->TimeWindowEnd); 


    mysql_query("INSERT INTO xml (Action, OrderReference, EarliestOrderDate, OrderNumber, SalesOrg, DistChannel, InvoiceReference, Name, Telephone, Email, StreetName, PostalCode, Region, OrderLine, ArticleNo, ArticleDescription, ArticleBrand, DlvDate, NoOfPieces, DeliveryStore, DeliveryCode, Weight, Volume, ShipmentNo, ParcelNo, TimeWindowStart, TimeWindowEnd) 
    VALUES ('$Action', '$OrderReference', '$EarliestOrderDate', '$OrderNumber', '$SalesOrg', '$DistChannel', '$InvoiceReference', '$Name', '$Telephone', '$Email', '$StreetName', '$PostalCode', '$Region', '$OrderLine', '$ArticleNo', '$ArticleDescription', '$ArticleBrand', '$DlvDate', '$NoOfPieces', '$DeliveryStore', '$DeliveryCode', '$Weight', '$Volume', '$ShipmentNo', '$ParcelNo', '$TimeWindowStart', '$TimeWindowEnd')") 
    or die(mysql_error()); 


    printf ("Records inserted: %d\n", mysql_affected_rows()); 
    echo " <p />--- --- --- --- --- --- --- --- ---<p />"; 
} 

mysql_close($con2); 

?> 
+3

'mysql_ *'関数を使用して停止してください。 PHP 5.5では廃止されました。古いものですから、セキュリティアップデートを受け取っていなくても、PHP 7では完全に削除されています。代わりにmysqli_ *やPDOを使用してください。 https://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php – Chris

+0

foreach($ xml-> OrderLines to $ order) 'を実行するとどうなりますか? –

+0

投稿されたXMLには、 ''または ''のノードがありません。 – Parfait

答えて

1

は、MySQLのLOAD XML LOCAL INFILE XMLドキュメントの一括インポートのためを考えてみます。
はここに私のPHPファイル/コードのコピーです。ただし、このコマンドを使用するには、データベースのフィールドと値に合わせてXMLを簡素化する必要があります。そして、そのようなインポートのために元の文書を再構成するには、XSLT(ソース文書を操作するために使用されるXML変換言語)を検討してください。 XSLTは元のXMLをデータベースアップロードのためのより単純で平らな構造に変換できます。 PHPはlibxsltエンジンを使用してXSLT 1.0プロセッサを維持します。

XSLTスクリプト(以下、PHPで読み取られるようの.xslファイルを保存)

<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="/eWebBooking"> 
    <xsl:copy> 
     <xsl:apply-templates select="OrderLines"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="OrderLines"> 
    <xsl:copy>   
     <xsl:copy-of select="ancestor::eWebBooking/OrderHead/*[not(local-name()='Orderer')]"/> 
     <xsl:copy-of select="ancestor::eWebBooking/OrderHead/Orderer/*"/> 
     <xsl:copy-of select="*"/> 
    </xsl:copy> 
    </xsl:template>  
</xsl:transform> 

PHPスクリプト(以下のMySQLに接続するためにPDOを使用して、あなたはphp_xslを有効にする必要があり伸長およびMYSQLに-local-INFILEを設定)

$file_arr = array(); 

if ($handle = opendir('.')) { 
    while (false !== ($file = readdir($handle))) { 
     if (($file != ".") && ($file != "..")) { 
      if(substr($file, -4) == ".xml") 
      { 
       array_push($file_arr, $file); 
      } 
     } 
    } 
    closedir($handle); 
} 

foreach($file_arr as $filename) { 

    // LOAD XML AND XSL SOURCES 
    $doc = simplexml_load_file($filename); 
    $xsl = simplexml_load_file('XSLTScript.xsl'); 

    // TRANSFORM SOURC 
    $proc = new XSLTProcessor; 
    $proc->importStyleSheet($xsl); 
    $newDoc = $proc->transformToXML($doc); 

    // SAVE OUTPUT TO FILE   
    $xmlfile = 'temp.xml'; 
    file_put_contents($xmlfile, $newDoc); 

    // RUN MYSQL COMMAND 
    try { 
     $db = new PDO('mysql:host=databasehost;dbname=databasename', 
         $databaseuser, $databasepwd); 
     $db->query("LOAD XML DATA INFILE 'path/to/temp.xml' 
        INTO TABLE xml 
        ROWS IDENTIFIED BY '<OrderLines>';"); 
    } catch(PDOException $e) { 
      echo $e->getMessage(); 
    } 
} 

トランsformed XML(DBにインポートするには、すべての要素名は、データベース名と一致する必要があります)

<?xml version="1.0" encoding="UTF-8"?> 
<eWebBooking> 
    <OrderLines> 
    <Action>SendFromWarehouse</Action> 
    <OrderReference>5986-20193315</OrderReference> 
    <EarliestOrderDate/> 
    <OrderNumber>20193315</OrderNumber> 
    <SalesOrg>Web</SalesOrg> 
    <DistChannel>Parcel</DistChannel> 
    <InvoiceReference>Reknes</InvoiceReference> 
    <Name>Ola Nordamann</Name> 
    <Telephone>22225555</Telephone> 
    <Email/> 
    <StreetName>Hackerstreet 46</StreetName> 
    <PostalCode>5986</PostalCode> 
    <Region>LEGOLAND</Region> 
    <OrderLine>1</OrderLine> 
    <ArticleNo>10501</ArticleNo> 
    <ArticleDescription>MPOW Dunmer Earphone Blueth</ArticleDescription> 
    <ArticleBrand>MPOW</ArticleBrand> 
    <DlvDate>2016-09-09</DlvDate> 
    <NoOfPieces>1</NoOfPieces> 
    <DeliveryStore>eWeb</DeliveryStore> 
    <DeliveryCode>DELIVERY</DeliveryCode> 
    <Weight>0,2</Weight> 
    <Volume>70</Volume> 
    <ShipmentNo>73600698093661246</ShipmentNo> 
    <ParcelNo>373600596034663364</ParcelNo> 
    </OrderLines> 
    <OrderLines> 
    <Action>SendFromWarehouse</Action> 
    <OrderReference>5986-20193315</OrderReference> 
    <EarliestOrderDate/> 
    <OrderNumber>20193315</OrderNumber> 
    <SalesOrg>Web</SalesOrg> 
    <DistChannel>Parcel</DistChannel> 
    <InvoiceReference>Reknes</InvoiceReference> 
    <Name>Ola Nordamann</Name> 
    <Telephone>22225555</Telephone> 
    <Email/> 
    <StreetName>Hackerstreet 46</StreetName> 
    <PostalCode>5986</PostalCode> 
    <Region>LEGOLAND</Region> 
    <OrderLine>2</OrderLine> 
    <ArticleNo>10528</ArticleNo> 
    <ArticleDescription>Mpow MBS5 Armor Bluetooth</ArticleDescription> 
    <ArticleBrand>MPOW</ArticleBrand> 
    <DlvDate>2016-09-07</DlvDate> 
    <NoOfPieces>1</NoOfPieces> 
    <DeliveryStore>eWeb</DeliveryStore> 
    <DeliveryCode>PICKUP</DeliveryCode> 
    <Weight>4</Weight> 
    <Volume>50</Volume> 
    <ShipmentNo>73600698093661246</ShipmentNo> 
    <ParcelNo>00373600698636066394</ParcelNo> 
    </OrderLines> 
</eWebBooking> 
+0

乾杯、私は今日何か新しいことを学んだ! –

+0

@IanBrindley - 恐ろしい!ソリューションがOP、特に将来の読者に役立つときはさらに優れています。 – Parfait

+0

これは私の問題を解決しましたが、MYSQL COMMANDを実行しているときにデータベースにデータを入力しません。 – Reknes

関連する問題