Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

inserir dados XML no mysql com php


Para os dados XML que você tem, eu preferiria a extensão SimpleXML, ela vem com tudo que você precisa e não é muito código para escrever (é a irmã mais nova do DOMDocument).

Portanto, para cada cliente nos dados de entrada, você deseja buscar seus 9 ou mais valores. Você pode formular esses valores como um xpath:
$values = <<<XPATH
(
    name
    |address
    |city
    |state
    |zip
    |phone
    |buyerinfo/shippingaddress/name
    |buyerinfo/shippingaddress/address
    |shippingDetail/saletax/saletaxamount
)
XPATH;

Isso funciona de maneira semelhante a uma consulta de banco de dados. Você cria uma string que contém a consulta, para XML na linguagem Xpath.

E fazemos o mesmo para o SQL, pois ambos devem andar de mãos dadas, então aqui está o padrão SQL de acordo:
$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;

Tudo isso precisa agora é abrir o XML e especificar os elementos do cliente para trabalhar:
$customers = simplexml_load_string($test)->customer; // "test.xml"

Então você só precisa foreach sobre cada cliente, obter os valores, escapá-los, inseri-los na consulta e executar a consulta SQL (ou criar uma consulta maior contendo mais de um registro):
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
    // ...
}

Sim, esse é o seu código já. Como você pode ver, usando arrays, xpath e SQL, você pode simplificar muito isso.

Para o primeiro cliente em seu XML de amostra, isso gera a seguinte consulta:
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'
  )

Todo o exemplo de código:
$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) ); }}