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

inserisci i dati XML in mysql con php

Per i dati XML che hai, preferirei l'estensione SimpleXML, viene fornita con tutto ciò di cui hai bisogno e non è molto codice da scrivere (è la sorellina di DOMDocument).

Quindi per ogni cliente nei dati di input, vuoi recuperare i tuoi circa 9 valori. Puoi formulare questi valori come un xpath:

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

Funziona in modo simile a una query di database. Crea una stringa che contiene la query, per XML nel linguaggio Xpath.

E facciamo lo stesso per SQL poiché entrambi dovrebbero andare di pari passo insieme, quindi ecco il modello SQL corrispondente:

$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;

Tutto ciò che serve ora è aprire l'XML e specificare gli elementi del cliente su cui lavorare:

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

Quindi devi solo scavalcare ogni cliente, ottenere i valori, eseguirne l'escape, inserirli nella query ed eseguire la query SQL (o creare una query più grande contenente più di un record):

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
    // ...
}

Sì, questo è già il tuo codice. Come puoi vedere, facendo uso di array, xpath e SQL, puoi semplificarlo notevolmente.

Per il primo cliente nel tuo esempio-XML questo genera quindi la seguente query:

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'
  )

L'intero esempio di codice:

$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) ); }}