Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Carlos Antoliv

Efetuar Upload Multiplo de CONTEUDO XML .....?

Recommended Posts

Olha eu ae mais uma vez....rsrsr

Tenho uma outra dúvida...na verdade a primeira ainda... mas...gostaria de mais uma ajuda.. acho que é a última do ano.

Bom, com o código abaixo consigo realizar o upload múltiplo dos ARQUIVOS XML perfeitamente:

<?php
/* Conectar com o banco de dados da aplicação */
mysql_connect('localhost', 'root', 'senha') or die('Erro ao conectar');
mysql_select_db("banco");
ini_set('default_charset', 'UTF-8');
      
        if (isset($_POST['enviar_xml'])) {
           
           
        if ( is_uploaded_file($_FILES['upl']['tmp_name'])) {
                /**A linha abaixo mostra o nome do aquivo que foi selecionado**/
            echo "<h1>" . "Arquivo XML: ". $_FILES['upl']['name'] ."  Selecionado com Sucesso!." . "</h1>";
            echo "<h2>Exibindo Fichas:</h2>";

    $file = simplexml_load_file($_FILES['upl']['tmp_name']);
 
   
   
    }}  
//**************************************
$pegaDataAtual = $_POST["pegaData"];
//**************************************
   $f = 0;
    foreach($_FILES['upl']['tmp_name'] as $file)
    
  
{
         $nome = $_FILES['upl']['name'][$f];
         $usuario_sessao = $_POST["txt_pegaSessao"];
    echo "<b>Arquivo:</b> " . $nome. "<br>";
    $xml = simplexml_load_file($file);
   
    //var_dump($xml);
$x = 0;
foreach ($xml->prestadorParaOperadora->loteGuias->guiasTISS->{'guiaSP-SADT'} as $prestador){
       
     mysql_query("INSERT INTO tb_xml(numeroGuiaPrestador, dataSolicitacao, codigoProcedimento, descricaoProcedimento, codigoTabela, nome_xml, fk_usuario_sessao, data_cadastro)
         VALUES (
".$prestador->cabecalhoGuia->numeroGuiaPrestador.",
'".$prestador->dadosSolicitacao->dataSolicitacao."',
".$prestador->procedimentosExecutados->procedimentoExecutado->procedimento->codigoProcedimento.",
'".$prestador->procedimentosExecutados->procedimentoExecutado->procedimento->descricaoProcedimento."',
".$prestador->procedimentosExecutados->procedimentoExecutado->procedimento->codigoTabela.", '$nome', '$usuario_sessao', '$pegaDataAtual')");
  
    if(mysql_affected_rows() != -1){
       $x++;
       }
      
} $f++;}
"<br><br><br>";
echo "<br><span style='font-size:18px; color:#007700;'><b>$f</b> contatos importados com Sucesso!</span>"."<br><br>";
echo "<a href='xml_importar_upload.php'>- IMPORTAR MAIS XML</a>"."<br>";
echo "<a href='pg_principal'>- VOLTAR AO MENU PRINCIPAL</a>"."<br>";
?>

COM ESSE OUTRO ARQUIVO ABAIXO, CONSIGO VISUALIZAR QUALQUER XML, exibindo, portanto, o número da ficha do paciente e quantos exames aquele paciente possuo, mostrando, assim sua descrição:

<?php
$dom = new DOMDocument('1.0', 'utf-8');
$dom->load("operadora48.xml");
$xpath = new DOMXPath($dom);
$pacientes = $xpath->query('//guiaSP-SADT');

foreach($pacientes as $item) {
    echo '<b>Nome Beneficiario:</b> ', $xpath->query('dadosBeneficiario/nomeBeneficiario', $item)->item(0)->nodeValue, '<br>';
    echo 'Registro ANS: ', $xpath->query('cabecalhoGuia/registroANS', $item)->item(0)->nodeValue, '<br>';
    echo 'Numero Guia: ', $xpath->query('cabecalhoGuia/numeroGuiaPrestador', $item)->item(0)->nodeValue, '<br>';
    echo 'Procedimentos executados:<br>';
    foreach($xpath->query('.//procedimentoExecutado', $item) as $procedimento) {
        printf('--> Data: %s<br>', $xpath->query('dataExecucao',$procedimento)->item(0)->nodeValue);
        printf('--> Codigo Tabela: %s<br>', $xpath->query('procedimento/codigoTabela',$procedimento)->item(0)->nodeValue);
        printf('--> Codigo procedimento: %s<br>', $xpath->query('procedimento/codigoProcedimento',$procedimento)->item(0)->nodeValue);
        printf('--> Descricao procedimento: %s<br>', $xpath->query('procedimento/descricaoProcedimento',$procedimento)->item(0)->nodeValue);
        printf('--> Quantia: %s<br>', $xpath->query('quantidadeExecutada',$procedimento)->item(0)->nodeValue);
        printf('--> reducaoAcrescimo: %s<br>', $xpath->query('reducaoAcrescimo',$procedimento)->item(0)->nodeValue);
        printf('--> valorUnitario: %s<br>', $xpath->query('valorUnitario',$procedimento)->item(0)->nodeValue);
        printf('--> valorTotal: %s<br>', $xpath->query('valorTotal',$procedimento)->item(0)->nodeValue);
        echo '<hr>';
    }
}

?>

Bom, agora, no PRIMEIRO código, ele importa a ficha do paciente, através do upload, e apenas o primeiro código do exame, tipo desssa forma que vai para o banco:

 

nuemeroGuia CodigoProcedimento
650000000012 43000021

 

 

No segundo código, exibo as informações corretamente. EXIBO, apenas setando no código o xml a ser exibido.

 

O que é interessante, é que vá para o banco assim as informações completas de um mesmo paciente, exemplo:

 

numeroGuia CodigoProcedimento
650000000012 43000021
650000000012 43000022
650000000012 43000023
650000000012 43000024

537000000013 75000021
537000000013 75000022
537000000013 75000023
537000000013 75000024

 

Mas só está indo para o banco a primeira linha de cada ficha, ficando assim:

650000000012 43000021
537000000013 75000021

 

Não inserindo, portanto, todos os dados.

Na verdade essa era a primeira dúvida.

Preciso muito dessa ajuda de vocês. Depois dessa, acho que esse ano nem peço ajuda, fico só olhando o fórum e participando de outra maneira..rs

Conto muito com o HELP de você.
abç!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você está segurando a faca.

Em um prato está o queijo. No outro, a goiabada.

Só falta misturar os dois e pronto

 

O código 2 deve ser executado para cada XML do código 1.

Junte as ideias e tudo funcionará.

 

 

ps: use a tag CODE (Código) (Botão "<>" no editor de textos do fórum). Não aguento mais editar seus tópicos pra colocar as tabs CODE...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou ver essa tag code. Não sabia do nome.

 

 

Mas.....Beraldo, estou tentando juntar as duas coisas. Mas tem horas que é complicado, quando vc não conhece muito, só o básico.

 

Estou estudando este site agora:

 

http://www.phpro.org/tutorials/Introduction-To-SimpleXML-With-PHP.html

 

Pra entender melhor sobre esse XPath.

 

Tô tentando juntar as ideias. Mas algumas dúvidas surgem. Porque se eu fosse utilizar o segundo código para inserir no banco, como iria fazer se existem dois foreach.

Utilizando o primeiro código até entendo um pouco mais. Então estou tentando unir as duas coisas. Fiz diversas tentativas ...diversas...

 

Mas não estou conseguindo inserir no banco ainda. Só falta isso mesmo o restante fica fácil e depois só exibir dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O foreaach não te atrapalha em nada.

 

Veja um exemplo:

 

$arr = [
    [
        'k1.1' => 'v1.1'
    ],
    [
        'k2.1' => 'v2.1'
    ]
];
$sql = "INSERT INTO tabela VALUES";
$values = [];
foreach ($arr as $_arr)
{
    foreach ($_arr as $key => $value)
    {
        $values[] = "('" . $value . "')";
    }
}
 
$sql .= implode(',', $values);
var_dump($sql);

 

Saída:

 

string(42) "INSERT INTO tabela VALUES('v1.1'),('v2.1')"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou tentar pegar teu exemplo.

 

O código que fiz foi este:

(não aparece erro, mas também não insere)

 

(não estou achando a tag code- que tem é BBCode Mode e BBCode Especial)

<?php 
/* Conectar com o banco de dados da aplicação */
mysql_connect('localhost', 'root', 'senha') or die('Erro ao conectar');
mysql_select_db("banco");

ini_set('default_charset', 'UTF-8');

        if (isset($_POST['enviar_xml'])) {
            
            
        if ( is_uploaded_file($_FILES['upl']['tmp_name'])) {

                /**A linha abaixo mostra o nome do aquivo que foi selecionado**/
            echo "<h1>" . "Arquivo XML: ". $_FILES['upl']['name'] ."  Selecionado com Sucesso!." . "</h1>";

            echo "<h2>Exibindo Fichas:</h2>";


    $file = simplexml_load_file($_FILES['upl']['tmp_name']);
 }}   
//**************************************
$pegaDataAtual = $_POST["pegaData"];
//**************************************
   $f = 0;

    foreach($_FILES['upl']['tmp_name'] as $file)
     
   
{
         $nome = $_FILES['upl']['name'][$f];
         $usuario_sessao = $_POST["txt_pegaSessao"];
    echo "<b>Arquivo:</b> " . $nome. "<br>";
    $xml = simplexml_load_file($file);

    
    //var_dump($xml);

 $x = 0;

$dom = new DOMDocument('1.0', 'utf-8');
$dom->load($file);

$xpath = new DOMXPath($dom);

$pacientes = $xpath->query('//guiaSP-SADT');


foreach($pacientes as $item) {

     mysql_query("INSERT INTO tb_xml(numeroGuiaPrestador, dataSolicitacao, codigoProcedimento, descricaoProcedimento, codigoTabela, nome_xml, fk_usuario_sessao, data_cadastro) 
         VALUES (
 ".$xpath->query('procedimento/codigoProcedimento',$procedimento)->item(0)->nodeValue.",
         ".$xpath->query('procedimento/descricaoProcedimento',$procedimento)->item(0)->nodeValue.",
         ".$xpath->query('procedimento/codigoTabela',$procedimento)->item(0)->nodeValue.", '$nome', '$usuario_sessao', '$pegaDataAtual')");

   
    if(mysql_affected_rows() != -1){
       $x++;
       }
       
} $f++;}
"<br><br><br>";
echo "<br><span style='font-size:18px; color:#007700;'><b>$f</b> contatos importados com Sucesso!</span>"."<br><br>";

echo "<a href='xml_importar_upload.php'>- IMPORTAR MAIS XML</a>"."<br>";
echo "<a href='pg_principal'>- VOLTAR AO MENU PRINCIPAL</a>"."<br>";
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um passo por vez.

 

Você tem 2 códigos. Um faz upload e o outro exibe.

Junte os dois de forma a fazer o upload e exibir.

Quando isso estiver ok, troque exibir por inserir.

 

Outra: em vez de criar a query dentro de mysql_query, atribua-a a uma string (como $sql no meu exemplo) e dê um echo nela. Você verá como a consulta ficou, antes de executá-la

 

E, para debug, use mysql_error() e habilite todas as exibições de erro, como mostrado neste tópico, na Orientação No. 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo. Vou tentar aqui.

antes que vc fale (rsrsrsr)... estou utlizando mysql ainda porque é a forma que entendo. Assim que eu conseguir resolver esse problema, já vou começar a trabalhar para migrar para PDO.

 

Mas.. deixa de me ajudar não, mano..

pressão só..

 

já posto o resultado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo, coloquei este código aqui.

Só não entendo porque o código de procedimento repete.

 

<?php
$xml_string = file_get_contents("operadora48.xml");
$dom = new DOMDocument;
/*** load the XML string ***/
$dom->loadXML( $xml_string );
$sxe = simplexml_import_dom($dom);
foreach ($sxe->prestadorParaOperadora->loteGuias->guiasTISS->{'guiaSP-SADT'} as $value) {
echo $value->cabecalhoGuia->numeroGuiaPrestador."<br>";
foreach ($value as $value2) {
echo $value2->procedimentosExecutados->procedimentoExecutado->procedimento->codigoProcedimento->$value."<br>";
}
}
?>
tentei pegar teu código.
Só não entendi muito o começo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo, consegui EXIBIR os dados da maneira que eu queria!!

Agora falta só o INSERT

 

Veja como ficou:

 

<?php
$xml_string = file_get_contents("operadora48.xml");
$dom = new DOMDocument;
/*** load the XML string ***/
$dom->loadXML( $xml_string );
$sxe = simplexml_import_dom($dom);
foreach ($sxe->prestadorParaOperadora->loteGuias->guiasTISS->{'guiaSP-SADT'} as $value) {
echo "<b>NUMERO DA GUIA:</b>".$value->cabecalhoGuia->numeroGuiaPrestador."<br>";
foreach ($value->procedimentosExecutados->procedimentoExecutado as $value2) {
echo "Cod.Procedimento:". $value2->procedimento->codigoProcedimento."<br>";
}
}
?>
Ajude-me só no INSERT agora... falta pouquinho.
abç

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja o meu Post #4. A ideia é a mesma.

 

Você começa montando a query antes do loop, preenche os dados dentro do loop, e a executa depois do loop

 

Monte manualmente a query. Veja qual é a estrutura dela, como ela deve ficar no final.

Depois pense como seu loop deve fazer pra gerar essa query automaticamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Beraldo, ficou assim o código e no final dele o erro:

 

 

<?php
mysql_connect('localhost', 'root', 'senha') or die('Erro ao conectar');
mysql_select_db("banco");
$xml_string = file_get_contents("operadora48.xml");
$dom = new DOMDocument;
/*** load the XML string ***/
$dom->loadXML( $xml_string );
$sxe = simplexml_import_dom($dom);
//Você começa montando a query antes do loop,
//preenche os dados dentro do loop,
//e a executa depois do loop
$sql= mysql_query("INSERT INTO tb_xml(numeroGuiaPrestador, dataSolicitacao, codigoProcedimento, descricaoProcedimento, codigoTabela)");
$values[];
$x = 0;
foreach ($sxe->prestadorParaOperadora->loteGuias->guiasTISS->{'guiaSP-SADT'} as  $value) {
   $values[] =$value->cabecalhoGuia->numeroGuiaPrestador;
   $values[] =$value->dadosSolicitacao->dataSolicitacao;
        foreach ($value->procedimentosExecutados->procedimentoExecutado as $value2) {
         $values[] ="('".$value2->procedimento->codigoProcedimento."')"; //"('".$value."')";
         $values[] ="('".$value2->procedimento->descricaoProcedimento."')";
         $values[] ="('".$value2->procedimento->codigoTabela."')";
        
      
}
}
$sql .= implode(',', $values);
?>

 

O erro é o seguinte:

Fatal error: Cannot use [] for reading in C:......

Compartilhar este post


Link para o post
Compartilhar em outros sites

  1. Certo.
  2. Troquei ISTO:

  1. $values[];

 

 

Por isto:

  1. $values = [];

 

Mas exibe este erro:

 

Parse error: syntax error, unexpected '[' in C:....

 

 

Beraldo, torquei isto:

  1. $values = []
  2. Por isto:

$values = array()

 

Exibiu tudo na tela e não inseriu no banco.

 

 

Tô tetando aqui.

Com o

 

var_dump($sql)

 

todos os dados do xml são exibidos na tela.

 

Só não estou conseguindo inserir no banco ainda.

 

Veja:

 

 

 

<?php

 

mysql_connect('localhost', 'root', 'senha') or die('Erro ao conectar');

mysql_select_db("banco");

 

$xml_string = file_get_contents("operadora48.xml");

$dom = new DOMDocument;

 

/*** load the XML string ***/

$dom->loadXML( $xml_string );

$sxe = simplexml_import_dom($dom);

 

//Você começa montando a query antes do loop,

//preenche os dados dentro do loop,

//e a executa depois do loop

$sql= mysql_query("INSERT INTO tb_xml(numeroGuiaPrestador, dataSolicitacao, codigoProcedimento, descricaoProcedimento, codigoTabela, nome_xml, fk_usuario_sessao, data_cadastro)");

$values = array();

 

foreach ($sxe->prestadorParaOperadora->loteGuias->guiasTISS->{'guiaSP-SADT'} as $value) {

 

$values[] =$value->cabecalhoGuia->numeroGuiaPrestador;

$values[] =$value->dadosSolicitacao->dataSolicitacao;

 

foreach ($value->procedimentosExecutados->procedimentoExecutado as $value2) {

 

$values[] ="('".$value2->procedimento->codigoProcedimento."')"; //"('".$value."')";

$values[] ="('".$value2->procedimento->descricaoProcedimento."')";

$values[] ="('".$value2->procedimento->codigoTabela."')";

 

}

 

}

 

$sql .= implode(',', $values);

var_dump($sql);

 

 

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

você está executando antes

você só pode usar mysql_query depois de criar a query...

 

Crie uma string, como eu te mostrei. Depois execute essa string com mysql_query

 

 

$sql = "INSERT..."
while (...)
{
    // monta a query
}
mysql_query($sql);

 

 

ps: de novo, use a tag code

Compartilhar este post


Link para o post
Compartilhar em outros sites

tava aguardando só tua resposta..

 

esse while aí é novo...

  1. $sql = "INSERT..."
  2. while (...)
  3. {
  4. // monta a query
  5. }
  6. mysql_query($sql);

to usando uma tag code...

mas parece que não é a ideal...

 

 

não to sabendo montar essa query que você tá dizendo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

esse while aí é novo...

while, for, foreach... todos são loops

só dei um exemplo

 

A única coisa que falei pra você fazer é rodar mysql_query no final

 

Ou seja:

 

1. Troque isto:

 

$sql= mysql_query("INSERT INTO tb_xml(numeroGuiaPrestador, dataSolicitacao, codigoProcedimento, descricaoProcedimento, codigoTabela, nome_xml, fk_usuario_sessao, data_cadastro)");

por isto:

 

$sql= "INSERT INTO tb_xml(numeroGuiaPrestador, dataSolicitacao, codigoProcedimento, descricaoProcedimento, codigoTabela, nome_xml, fk_usuario_sessao, data_cadastro)";

 

2. Depois disto:

 

var_dump($sql);

execute a query (usando mysql_error(), como eu já citei antes):

 

mysql_query($sql) or exit(mysql_error());

 

Veja qual é a query gerada.

E verifique se a execução da consulta gera algum erro

 

 

ps: você já teve tópico fechado por ficar dando UP. Mais uma vez e eu eu tranco este também. Respeite o tempo disponível de cada membro do fórum

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segui tuas orientações.

Apareceu este erro:

 

 

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '6000006587,0000-00-00,('40000001'),('Sangue bom'),('22'),('40111110'' at line 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não estou sabendo reduzir o codigo pelo tag code? É um botão? É um codigo que tenho que por manualmente?

 

 

 

Segue o código:

<?php
mysql_connect('localhost', 'root', 'senha') or die('Erro ao conectar');
mysql_select_db("banco");

$xml_string = file_get_contents("operadora48.xml");
$dom = new DOMDocument; 

/*** load the XML string ***/ 
$dom->loadXML( $xml_string ); 
$xml = simplexml_import_dom($dom); 
//Você começa montando a query antes do loop, 
//preenche os dados dentro do loop, 
//e a executa depois do loop
$sql= "INSERT INTO tb_xml(numeroGuiaPrestador, dataSolicitacao, codigoProcedimento, descricaoProcedimento, codigoTabela, nome_xml, fk_usuario_sessao, data_cadastro)";
$values = array();

$f=0;

foreach ($xml->prestadorParaOperadora->loteGuias->guiasTISS->{'guiaSP-SADT'} as  $value ) {


   $values[] = $value->cabecalhoGuia->numeroGuiaPrestador;
   $values[] = $value->dadosSolicitacao->dataSolicitacao;


        foreach ($value->procedimentosExecutados->procedimentoExecutado as $value2) {


         $values[] = "('".$value2->procedimento->codigoProcedimento."')"; //"('".$value."')";
         $values[] = "('".$value2->procedimento->descricaoProcedimento."')";
         $values[] = "('".$value2->procedimento->codigoTabela."')";

}
$f++;
 }
 $sql .= implode(',', $values);
mysql_query($sql) or exit(mysql_error());
 //var_dump($sql);

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.