2010-12-07 5 views
-3

私のeコマースサイトから受け取った以下のXMLファイルを読んで、そのレコードをMySQLに挿入します。私はsimpleXMLを使って試しましたが、うまく動作していないようです。MySQLへのSimpleXML出力

<ACCOUNT NumCrds="1"> 
<ACCNO>HAA_00</ACCNO> 
<CURRCODE>CAD</CURRCODE> 
<ACCTYPE>00</ACCTYPE> 
<FINAMT>0.00</FINAMT> 
<BLKAMT>0.00</BLKAMT> 
<AMTAVL>0.00</AMTAVL> 
<CARD> 
<PANNU>1234567890208108</PANNU> 
<PRIMARY>Y</PRIMARY> 
<CRDPRODUCT>PCAD</CRDPRODUCT> 
<PROGRAMID>PTYCSH</PROGRAMID> 
<CUSTCODE>00000406</CUSTCODE> 
<STATCODE>02</STATCODE> 
<EXDATE>2013-03-31</EXDATE> 
<CRDACCNO>HAA_00</CRDACCNO> 
<CRDCURRCODE>CAD</CRDCURRCODE> 
</CARD> 
</ACCOUNT> 

<ACCOUNT NumCrds="1"> 
<ACCNO>XYZCESFULL9900</ACCNO> 
<CURRCODE>CAD</CURRCODE> 
<ACCTYPE>00</ACCTYPE> 
<FINAMT>0.00</FINAMT> 
<BLKAMT>0.00</BLKAMT> 
<AMTAVL>0.00</AMTAVL> 
<CARD> 
<PANNU>0987654321756990</PANNU> 
<PRIMARY>Y</PRIMARY> 
<CRDPRODUCT>PCAD</CRDPRODUCT> 
<PROGRAMID>PTYCSH</PROGRAMID> 
<CUSTCODE>00000520</CUSTCODE> 
<STATCODE>00</STATCODE> 
<EXDATE>2013-04-30</EXDATE> 
<CRDACCNO>XYZCESFULL9900</CRDACCNO> 
<CRDCURRCODE>CAD</CRDCURRCODE> 
</CARD> 
</ACCOUNT> 

期待通りに動作する次のコードを記述しました。

<?php 
$sxe = simplexml_load_file("balexp.xml"); 
foreach($sxe->ACCOUNT as $item) { 
$mysql="insert into test.mytable values ('".$item->ACCNO."','".$item->CURRCODE."')"; 
echo $mysql; 
} 
?> 

しかし、私には1つの質問があります。 1)同じACCOUNT句で2枚のカードを処理する必要がある場合があります。どのように私はそのような状況に対処しますか?

+0

アカウントに値を挿入する( '1'、 'HAA_00'、 'C​​AD'、 '00'、 '0.00'、 '0.00'、 '0.00'、 '1234567890208108'、 'Y'、 'PCAD'、 'PTYCSH '、' 00000406 '、' 02 '、' 2013-03-31 '、' HAA_00 '、' CAD '); #予想される出力 – shantanuo

+0

これはXMLではありません。ルートノードはありません。 – Quentin

+0

php -e xmlread.php | mysql#これは私がMySQLにレコードをプッシュする方法ですが、正しい方法を知りたいと思います。 – shantanuo

答えて

0

難しい方法です。

$dom = new DOMDocument(); 
$dom->loadXML('<root>'. $xmlstr .'</root>'); 
$xml = simplexml_import_dom($dom); 

$sql = 'INSERT INTO accounts VALUES'; 
foreach ($xml as $node) { 
    $data = array(
     (string) $node->attributes()->NumCrds, 
     (string) $node->ACCNO, 
     // ... 
     (string) $node->CARD->PANNU, 
     // ... 
    ); 
    $sql .= " ('". implode("', '", $data) ."'),"; 
} 
$sql = rtrim($sql, ','); 

print $sql; 

はINT、DECIMAL、DATEにデータベース内のいくつかの列の型を変更することを検討して $sql$dataを追加するために vsprintf()を使用しています。

+0

今朝の私の答えのように見える:D – Shikiryu