Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Einfügen von XML-Daten in MySQL mit PHP

Für die XML-Daten, die Sie haben, würde ich die SimpleXML-Erweiterung bevorzugen, sie wird mit allem geliefert, was Sie brauchen, und es ist nicht so viel Code zu schreiben (sie ist die kleine Schwester von DOMDocument).

Also für jeden Kunden In den Eingabedaten möchten Sie Ihre 9 oder so Werte abrufen. Sie können diese Werte als XPath formulieren:

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

Dies funktioniert ähnlich wie bei einer Datenbankabfrage. Sie erstellen eine Zeichenfolge, die die Abfrage enthält, für XML in der Xpath-Sprache.

Und wir machen dasselbe für SQL, da beide Hand in Hand gehen sollten, also ist hier das entsprechende SQL-Muster:

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

Jetzt muss nur noch das XML geöffnet und die zu bearbeitenden Kundenelemente angegeben werden:

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

Dann brauchen Sie nur jeden Kunden zu durchsuchen, die Werte zu erhalten, sie zu maskieren, sie in die Abfrage einzufügen und die SQL-Abfrage auszuführen (oder eine größere Abfrage zu erstellen, die mehr als einen Datensatz enthält):

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, das ist schon dein Code. Wie Sie sehen können, können Sie dies erheblich vereinfachen, indem Sie Arrays, xpath und SQL verwenden.

Für den ersten Kunden in Ihrem Beispiel-XML erzeugt dies dann folgende Abfrage:

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

Das ganze Code-Beispiel:

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