Mysql
 sql >> Baza danych >  >> RDS >> Mysql

wstaw dane XML do mysql za pomocą php

W przypadku danych XML, które posiadasz, wolałbym rozszerzenie SimpleXML, zawiera ono wszystko, czego potrzebujesz i nie wymaga dużo kodu do napisania (to młodsza siostra DOMDocument).

A więc dla każdego klienta w danych wejściowych chcesz pobrać swoje 9 lub więcej wartości. Możesz sformułować te wartości jako xpath:

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

Działa to podobnie do zapytania do bazy danych. Tworzysz ciąg, który zawiera zapytanie, dla XML w języku XPath.

I robimy to samo dla SQL, ponieważ oba powinny iść w parze, więc oto odpowiedni wzorzec SQL:

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

Teraz wystarczy otworzyć plik XML i określić elementy klienta, nad którymi należy pracować:

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

Następnie wystarczy przeszukać każdego klienta, uzyskać wartości, zmienić je, wstawić do zapytania i uruchomić zapytanie SQL (lub utworzyć jedno większe zapytanie zawierające więcej niż jeden rekord):

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

Tak, to już twój kod. Jak widać, korzystając z tablic, xpath i SQL, można to znacznie uprościć.

Dla pierwszego klienta w przykładowym XML to następnie generuje następujące zapytanie:

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

Cały kod-przykład:

$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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przesyłanie strumieniowe dużych zestawów wyników za pomocą MySQL

  2. Jak budować następne i poprzednie linki za pomocą php?

  3. Jak połączyć się z MySQL za pomocą PHP

  4. Szerokie pole varchar powoduje błąd Żądana konwersja nie jest obsługiwana przy użyciu openquery z połączonym serwerem MySQL

  5. Jak uzyskać rekord, jeśli Count wynosi zero w Laravel?