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