Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa noite pessoal. Olha eu aqui novamente atrapalhando a vida de vocês.
Seguinte, conforme diz o título do tópico, preciso gravar uma página que está em XML no meu banco de dados usando PHP.
Já vi aqui mesmo no iMASTERS como ler o xml, dividí-lo em arrays e gravá-lo no mysql. O problema, é que preciso fazer isso com uma página em XML, e não com um arquivo. E essa página não é fixa, ela é gerada de acordo com uma pesquisa feita manualmente. A geringonça funciona é mais ou menos assim;
Um funcionário irá abrir a página de pesquisa, onde ele irá escolher a data para a qual a pesquisa será realizada. Após clicar no botão submit, essa pesquisa irá buscar no banco de dados todos os registros daquela data (e são dezenas de milhares (uns 80mil registros)), e irá exibir esses registros em um formulário, todos eles. Após isso, o funcionário vai clicar no botão pesquisar, e a página que será aberta é a página XML. Na verdade, é um servidor de pesquisa da empresa, pronto pra receber os dados enviados por um form ( eu testei já e funciona perfeitamente ), e após esse servidor fazer a pesquisa dos objetos enviados pelo form, ele retorna todas as informações em uma página XML.
A busca, o formulário e a pesquisa funcionam perfeitamente, mas agora a coisa começa a passar pra um nível de programador ao qual eu ainda não alcancei.
Primeiro problema: O servidor de pesquisa, pra evitar travamentos, só aceita pesquisar 5000 registros de cada vez. Então, eu preciso que os registros sejam separados automaticamente em grupos de 5000, sem que seja nescessária qualquer interação do funcionário, e que seja enviado através de um loop pro servidor de pesquisa, até acabar todos os registros.
Segundo problema: Se a pesquisa é feita a cada 5000 registros, o retorno da pesquisa também será assim. Então, conforme os registros forem voltando a cada execução do loop, o php deve interpretar o xml, separá-lo em arrays e enviar pro mysql, sendo que cada registro será um nó chamado <objeto>.
Como eu disse, a página do servidor recebe os dados através do método $_post e retorna um XML automaticamente, então o PHP deve interpretá-lo e enviá-lo sem que o XML aparece pro funcionário que fez a pesquisa.
Bom, sei que o texto ficou longo, mas tentei explicar da melhor maneira possível o que eu preciso fazer. E só postei aqui porque não achei maneira alguma de como fazer isso. Até achei um tópico aqui onde um moderador ensinou a gravar uma página xml no mysql, mas era uma página fixa, bem diferente do meu caso.
Bom, agradeço desde já àqueles que puderem me ajudar.
Tenham todos uma boa noite.
Abraços.
Ninguém tem alguma ideia de qual função usar pra isso?
Ajuda aí pessoal, preciso muito disso.
Abraço.
Ok Micilini, eu entendi como a função funciona e até consegui fazer a página ser salva em uma pasta local, porém, ele salvou a página ainda em branco.
Eu preciso que ela seja salva depois de efetuar a pesquisa, mas quando eu envio o formulário com a pesquisa, a página já abre com o resultado XML, e não tem como eu alterar o funcionamento desta, já que ela está em outro servidor da empresa, e não há a mínima chance de editar ela.
Acredito eu, que a 'mágica' esteja no formulário, que deve enviar a pesquisa e não mostrar os dados antes de salvá-lo.
Alguma ideia?
Olá pessoal. Voltei pra postar uma solução parcial pra esse bicho papão.
Segue o meu código (ainda está sem formatação pra organizar em algumas tabelas HTML).
Ocultei algumas informações confidenciais.
<?php
//primeiro checa se o módulo cURL esteja instalado
if(!is_callable('curl_init')) {
echo "cURL não instalado no sistema!";
die();
}
//agora cria o formulário
//abre uma conexão de curl
$curl_connection = curl_init('ocultado');
//preenche algumas informações para o cabeçalho do servidor
curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($curl_connection, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);
//bom, agora declara os campos dos formularios de pesquisa
$post_data['Usuario'] = 'ocultado';
$post_data['Senha'] = 'ocultado';
$post_data['Tipo'] = 'ocultado';
$post_data['Resultado'] = 'ocultado';
$post_data['Objetos'] = 'ocultado'; $post_items[] = $key . '=' . $value;
}
$post_string = implode ('&', $post_items);
curl_setopt($curl_connection, CURLOPT_POSTFIELDS, $post_string);$result = curl_exec($curl_connection);
//print_r(curl_getinfo($curl_connection));
echo curl_errno($curl_connection) . '-' .
curl_error($curl_connection);
//encerra conexão, importante
curl_close($curl_connection);
//exibe o resultado
//print $result;
$s_xml = file_put_contents('XML\pesquisa.xml',$result);
$conteudo = simplexml_load_file('XML\pesquisa.xml');
echo $conteudo->objeto->numero;
echo "<br>";
echo $conteudo->objeto->evento[0]->data;
echo "<br>";
echo $conteudo->objeto->evento[0]->hora;
echo "<br>";
echo $conteudo->objeto->evento[0]->descricao;
echo "<br>";
echo "<br>";
echo $conteudo->objeto->evento[1]->data;
echo "<br>";
echo $conteudo->objeto->evento[1]->hora;
echo "<br>";
echo $conteudo->objeto->evento[1]->descricao;
?>
Esse código foi feito por um amigo meu, e está funcionando perfeitamente. Mas ainda tenho outro problema.
O no objeto, vai me retornar 5000 registros, e pra cada registro desse, podem aparecer de 2 a 10 'nós' eventos (a grande maioria será de apenas 5 ou menos).
Quero saber como fazer um while pra exibir todos dentro de um formulário, para em seguida enviar pro BD. E pra enviar, também precisarei de outro while, tanto no form como na página que faz a inserção.
Alguém pode me ajudar a como criar esse while? Eu já uso ele aqui no meu sistema, mas é um bem simples, e ainda estou apanhando com essa função.
Agradeço à quem me ajudar.
Olá hufersil. Eu já tinha olhado essa documentação, mas ela não funcionou pro meu caso. O simpleXML funcionou certinho pra mim, eu consigo exibir todos os resultados que preciso, porém apenas se eu buscar um por um no XML, eu preciso só criar um loop pra fazer isso de forma automática. E pra cada sub-nó evento, ele conservar o nó objeto.
Vou deixar aqui uma amostra do meu xml:
<?xml version="1.0" encoding="UTF-8"?>
<sroxml xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance" xsd:noNamespaceSchemaLocation="http://000.0.0.000/empresa/empresa">
<versao>2.0</versao>
<TipoPesquisa>L</TipoPesquisa>
<TipoResultado>T</TipoResultado>
<objeto>
<numero>1234567890000</numero>
<evento>
<data>2013-09-25</data>
<hora>12:43:03</hora>
<descricao>Encaminhado</descricao><unidade>
<local><![CDATA[CIDADE]]></local>
<cidade>MANAUS</cidade>
<uf>AM</uf>
</unidade>
<destino><unidade><![CDATA[UNIDADE]]></unidade><cidade><![CDATA[CIDADE]]></cidade><uf>AM</uf></destino>
</evento>
<evento>
<data>2013-09-24</data>
<hora>17:43:01</hora>
<descricao>Criado</descricao><unidade>
<local><![CDATA[UNIDADE]]></local>
<cidade>CIDADE</cidade>
<uf>SP</uf>
</unidade>
</evento>
<evento>
<data>2013-09-24</data>
<hora>16:46:33</hora>
<descricao>Encaminhado</descricao><unidade>
<local><![CDATA[UNIDADE]]></local>
<cidade>VALINHOS</cidade>
<uf>SP</uf>
</unidade>
<destino><unidade><![CDATA[UNIDADE]]></unidade><cidade><![CDATA[CIDADE]]></cidade><uf>AM</uf></destino>
</evento>
</objeto>
</sroxml>
Acho que deu pra entender né? O XML não está bem formatado, pois é assim que o navegador me retorna ele, mas está bem estruturado. Veja que tenho apenas um nó "objeto", e dentro deste vários sub-nós "evento".
O problema está sendo pra criar o loop que vai exibir tudo isso, pra depois enviar pro banco.
file_get_contents -> save the content local -> open the xml content -> converto to the mysql. Ou seja:
Voce usa a função file_get_content e salva a pagina xml localmente
http://www.w3schools.com/php/func_filesystem_file_get_contents.asp
dai pra frente vc faz aquele esquema de ler o xml e converter pro mysql