sql >> Database teknologi >  >> RDS >> Mysql

indsæt XML-data i mysql med php

Til de XML-data, du har, ville jeg foretrække SimpleXML-udvidelsen, den leveres med alt, hvad du behøver, og det er ikke så meget kode at skrive (det er DOMDocuments lillesøster).

Så for hver kunde i inputdataene, vil du hente dine 9 eller deromkring værdier. Du kan formulere disse værdier som en xpath:

$values = <<<XPATH
(
    name
    |address
    |city
    |state
    |zip
    |phone
    |buyerinfo/shippingaddress/name
    |buyerinfo/shippingaddress/address
    |shippingDetail/saletax/saletaxamount
)
XPATH;

Dette fungerer på samme måde som med en databaseforespørgsel. Du opretter en streng, der indeholder forespørgslen, til XML i Xpath-sproget.

Og vi gør det samme for SQL, da begge skal gå hånd i hånd sammen, så her er det tilsvarende SQL-mønster:

$pattern = <<<SQL
INSERT INTO customer
  (
    name, address, city, state, zip, phone, shipto, shipadderss, tax
  )
  VALUES
  (
    '%s','%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s'
  )
SQL;

Alt dette behov nu er at åbne XML og specificere de kundeelementer, der skal arbejdes på:

$customers = simplexml_load_string($test)->customer; // "test.xml"

Så behøver du kun at foregribe over hver kunde, indhente værdierne, undslippe dem, indsætte dem i forespørgslen og køre SQL-forespørgslen (eller oprette en større forespørgsel, der indeholder mere end én post):

foreach ($customers as $customer) 
{
    $data = $customer->xpath($values);
    $escaped = array_map('mysql_real_escape_string', $data);
    $query = vsprintf($pattern, $escaped);

    // you can now run the query now
    // ...
}

Ja, det er allerede din kode. Som du kan se, ved at bruge arrays, xpath og SQL, kan du forenkle dette meget.

Til den første kunde i din sample-XML genererer dette derefter følgende forespørgsel:

INSERT INTO customer
  (
    name, address, city, state, zip, phone, shipto, shipadderss, tax
  )
  VALUES
  (
    'customer 1','address 1', 'city 1', 'state 1', 'zip 1', 'phone 1', 'ship to', 'Ship address1', '2'
  )

Hele kodeeksemplet:

$values = <<<XPATH
(
    name
    |address
    |city
    |state
    |zip
    |phone
    |buyerinfo/shippingaddress/name
    |buyerinfo/shippingaddress/address
    |shippingDetail/saletax/saletaxamount
)
XPATH;

$pattern = <<<SQL
INSERT INTO customer
  (
    name, address, city, state, zip, phone, shipto, shipadderss, tax
  )
  VALUES
  (
    '%s','%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s'
  )
SQL;

$customers = simplexml_load_string($test)->customer; // "test.xml"

foreach ($customers as $customer)
{
    $data = $customer->xpath($values);
    $escaped = array_map('mysql_real_escape_string', $data);
    $query = vsprintf($pattern, $escaped);

    // you can now run the query now
    $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_error()),
            htmlspecialchars($query)
        );
    }
}


', mysql_errno(), htmlspecialchars(mysql_error()), htmlspecialchars($query) ); }}

  1. Tjek om der findes en række ved hjælp af det gamle mysql_* API

  2. Buffer MySQL Connector/J rækker, når der streames et resultatsæt?

  3. MySql Inner Join med WHERE-klausul

  4. MySQL-opdatering ændre flere kolonner er ikke-atomare?