通过PHP脚本将本地XML数据插入2个MySQL表

时间:2015-12-04 05:01:19

标签: php mysql xml xpath simplexml

我正在尝试从大型xml文件(每个单元的所有规格的船舶经销商的库存)中挑选元素,并将该数据推送到两个单独的表中。我不知道我是否需要两个Xpath来执行此操作,或者它是否可以压缩为一个。

XML文件包含大约50个元素,每个船只包含子元素,但我想一步一步这一步,直到我得到这样做,并在添加复杂性之前将其保留为三个。 / p>

到目前为止,我使用此previous answer对脚本进行建模并添加了我需要的内容:

<?php
$db = new mysqli('localhost', 'username', 'password', 'database');
$boats=simplexml_load_file("WinboatsWebXMLAllRevA.xml") or die ("Error: Cannot create object");
$values = <<<XPATH
(
    |element
    |element
    |element
    )
XPATH;
$pattern_custom = <<<SQL
 INSERT INTO pmb_rsdirectory_entries_custom
(
    column1, column2, column3
)
VALUES
(
    '%s', '%s', '%s'
)
SQL;
foreach ($boats as $boat)
{
    $data = $boat->xpath($values);
    $escaped = array_map('mysql_real_escape_string', $data);
    $query = vsprintf($pattern, $escaped);

$result - mysql_query($query);
if(mysql_errno())
{
    printf(
        '<h4 style="color: red;">Query Error:</h4>
        <p>(%s) - %s</p>
        <p>Query:
            <pre>%s</pre>
        </p>
        </hr />',
        mysql_errno(),
        htmlspecialchars(mysql_errno()),
        htmlspecialchars($query)
    );
  }
}
$values_custom = <<<XPATH
(
    |element3
    |element4
    |element5

 )
XPATH;
$pattern_custom = <<<SQL
INSERT INTO pmb_rsdirectory_entries
    (
        column3, column4, column5
    )
    VALUES
    (
    '%s', '%s', '%s'
)
SQL;
foreach ($boats as $boat)
{
    $data = $boat->xpath($values_custom);
    $escaped = array_map('mysql_real_escape_string', $data);
    $query = vsprintf($pattern_custom, $escaped);

$result - mysql_query($query);
if(mysql_errno())
{
    printf(
        '<h4 style="color: red;">Query Error:</h4>
        <p>(%s) - %s</p>
        <p>Query:
            <pre>%s</pre>
        </p>
        </hr />',
        mysql_errno(),
        htmlspecialchars(mysql_errno()),
        htmlspecialchars($query)
        );
     }
}

?>

如果有更好的方法来管理这个问题,我当然愿意接受建议。

更新(XML代码段):

<document>
 <node type="boat">
  <uniqueid>ID00004146</uniqueid>
  <category>Ski and Wakeboard Boat</category>
  <boatyear>2015</boatyear>
  <make>Malibu</make>
  <model>Wakesetter 22 VLX</model>
  <length units="feet">22.8</length>
  <total>89630.00</total>
  <engines>Single</engines>
  <enginetype>Other</enginetype>
  <fueltype>Gas</fueltype>
  <hulltype>Fiberglass reinforced</hulltype>
  <engine_manfacturer>Indmar</engine_manfacturer>
  <eng_model>Monsoon 350HP 5.7L CAT</eng_model>
  <eng_hp>350</eng_hp>
  <newused>New</newused>
  <availability>Out of Stock</availability>
  <options>
   <option>Ballast HI FLO - Bow Malibu Launch System</option>
   <option>Ballast HI FLO - Rear PNP Plumbing</option>
   <option>Pull Up Cleats - Two Pair</option>
   <option>Wakesurf Technology (Same Color as Swim Platform)</option>
  </options>
  <pictures>
   <picture>ID00004146_1.jpg</picture>
   <picture>ID00004146_2.jpg</picture>
   </pictures>
 </node>
</document>

1 个答案:

答案 0 :(得分:2)

我要做的是在一个foreach循环中获取每个XML行的所有信息,并为两个不同的表填充两个字符串或数组,其中包含INSERT INTO的VALUES子句的信息,然后从foreach运行带有所有行的两个INSERT INTO语句:

INSERT INTO pmb_rsdirectory_entries_custom
(
    column1, column2, column3
)
VALUES
(
    'value1', 'value2', 'value3'
),
(
    'value1', 'value2', 'value3'
) ...


INSERT INTO pmb_rsdirectory_entries
(
    column4, column5, column6
)
VALUES
(
    'value4', 'value5', 'value6'
),
(
    'value4', 'value5', 'value6'
) ...

如果你给我提供一个简短的XML作为例子,我可能会为你构建php代码,但是你很难弄清楚它。 :)

更新(我的PHP脚本版本):

抱歉,我花了一些时间来创建脚本花了我很长时间。这就是我要做的事。

我们假设您要将值uniqueid, category, boatyear, make, model保存在一个表中,将uniqueid, length, total, engines, enginetype保存在另一个表中。我已经为两个表添加了唯一ID,但您可能希望使用自动增量字段作为密钥来保持记录链接。这是你的家庭作业。 :)

<?php
$boats = simplexml_load_file( "WinboatsWebXMLAllRevA.xml" ) or die ( "Error: Cannot create object" );
$values = <<<XPATH
(
    uniqueid
    |category
    |boatyear
    |make
    |model
    |length
    |total
    |engines
    |enginetype
)
XPATH;

$valuesFirstTable = array(); //sql row values for the first table
$valuesSecondTable = array(); //sql row values for the second table

foreach ( $boats as $boat )
{
    $data = $boat->xpath( $values );
    $escaped = array_map( 'mysql_real_escape_string', $data );

    $valuesFirstTable[] = "('" . implode( "','", array_slice( $escaped, 0, 5 ) ) . "')"; //includes the uniqueid as first element
    $valuesSecondTable[] = "('" . $escaped[0] . "','" . implode( "','", array_slice( $escaped, 5 ) ) . "')";
}

//execute first sql
$values = implode( ',', $valuesFirstTable );
$query = (
    "INSERT INTO
    t_first_table
    (
        uniqueid,
        category,
        boatyear,
        make,
        model
    )
    VALUES
    {$values}"
);

//this can be a function
$result = mysqli_query( $query );
if ( mysqli_errno() )
{
    printf(
        '<h4 style="color: red;">Query Error:</h4>
        <p>(%s) - %s</p>
        <p>Query:
            <pre>%s</pre>
        </p>
        </hr />',
        mysqli_errno(),
        htmlspecialchars( mysqli_errno() ),
        htmlspecialchars( $query )
    );
}

//execute second sql
$values = implode( ',', $valuesSecondTable );
$query = (
    "INSERT INTO
    t_second_table
    (
        uniqueid,
        `length`,
        total,
        engines,
        enginetype,
    )
    VALUES
    {$values}"
);

//this can be a function
$result = mysqli_query( $query );
if ( mysqli_errno() )
{
    printf(
        '<h4 style="color: red;">Query Error:</h4>
        <p>(%s) - %s</p>
        <p>Query:
            <pre>%s</pre>
        </p>
        </hr />',
        mysqli_errno(),
        htmlspecialchars( mysqli_errno() ),
        htmlspecialchars( $query )
    );
}