Jump to content

Recommended Posts

Posted (edited)

Caros amigos.

Estou com uma dúvida, que recorro ajuda dos amigos.

Como faço para quando importar um ARQUIVO.TXT, o sistema possa ler linha-a-linha e comparar com o Banco de Dados, caso a linha do código no .TXT não for encontrada, não importa.

Abaixo o código que escrevi para importar, funciona.

         <?php

          //Variável Passada da Página Anterior
          $cot_cotIdGet = isset($_GET['cotId']) ? $_GET['cotId'] : false;
          $cot_cotId  = isset($_POST['cotId']) ? $_POST['cotId'] : $cot_cotIdGet;   

          $cotNumeroGet = isset($_GET['cotNumero']) ? $_GET['cotNumero'] : false;
          $cotNumero    = isset($_POST['cotNumero']) ? $_POST['cotNumero'] : $cotNumeroGet;       

            //Função para importar Arquivo
            function Inserir($itens, Pdo $pdo){
                $sts = $pdo->prepare("INSERT INTO cotItens(cotNumImport, codProdClie, cotQtde, cotVerTxt, cotNumero, cot_cotId) VALUES(?,?,?,?,?,?);");  
                $sts->bindValue(1, $itens[0], PDO::PARAM_STR);
                $sts->bindValue(2, $itens[1], PDO::PARAM_STR);        
                $sts->bindValue(3, $itens[2], PDO::PARAM_STR);            
                $sts->bindValue(4, $itens[3], PDO::PARAM_STR);        
                $sts->bindValue(5, $itens[4], PDO::PARAM_STR);          
                $sts->bindValue(6, $itens[5], PDO::PARAM_STR);                                
                $sts->execute();
                $sts->closeCursor();
                $sts = NULL;
            }
			
			
            if (!empty($_FILES['arquivo'])) {

                $Pdo  = new PDO("mysql:host=localhost; dbname=lojaweb", "root", "");
				
                $file = fopen($_FILES['arquivo']['tmp_name'], 'r');

                while (!feof($file)){
                    $linha = fgets($file);          
                    $itens = explode(';', $linha);   
                    $itens[] = '1';     
                    $itens[] = $cotNumero;                
                    $itens[] = $cot_cotId;                                  
                    Inserir($itens, $Pdo);
                }

                    echo '<div class="alert alert-info alert-dismissible">        
                              <h4>Arquivo Importado com Sucesso!</h4>            
                          </div>';  

                  //Redirecionando para Caixa de Importar Arquivo do Cliente
                  echo '<meta http-equiv="refresh" content="3, URL=painel.php?exe=loja/importar_itensCot&cotNumero='.$cotNumero.'"" />';

            }
?>

 

Grato,

 

Toarelli

Edited by toarelli
Posted

Na tua função "inserir" fazes um select count pela chave da tabela (ou campos que sejam relevantes) e vez se essa contagem te retorna 0 ou mais registos.

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Posted
Em 20/04/2018 às 05:42, M6 disse:

Na tua função "inserir" fazes um select count pela chave da tabela (ou campos que sejam relevantes) e vez se essa contagem te retorna 0 ou mais registos.

Caro M6

 

Como faria isso, esse é meu problema ?

Posted

olá amigos.

tentei fazer desta forma abaixo, em partes deu certo.

o sistema lê linha-a-linha e quando encontra encerra. O problema é que lê e grava até chegar na linha que não existe.

como faço para ler primeiro, comparar e se depois estiver tudo correto grava no banco de dados.

abaixo o código que usei:

<?php
session_start();

//Incluir a conexao com BD
include_once("conexao.php");

//Receber os dados do formulário
$arquivo_tmp = $_FILES['arquivo']['tmp_name'];

//ler todo o arquivo .TXT para um array
$dados = file($arquivo_tmp);

//Variável criada apenas para Comparar linha-a-linha
$number = "123057";

foreach($dados as $linha){
	$linha = trim($linha);
	$valor = explode(',', $linha);
	echo '<pre>';
	var_dump($valor);
	echo '</pre>';
	
	$nome = $valor[0];
	$email = $valor[1];
	$usuario = $valor[2];
	$senha = $valor[3];
	
   //Aqui faço a leitura das linhas
	if($senha == $number){	
		echo '<pre>';
		var_dump($linha);
		echo "Não Importado";
		exit;
		echo '</pre>';	  
	  
    } else {		
	
    //Insert no Banco de Dados
	$result_usuario = "INSERT INTO usuarios (nome, email, usuario, senha) VALUES ('$nome', '$email', '$usuario', '$senha')";
	$resultado_usuario = mysqli_query($conn, $result_usuario);	
	
	}
}

$_SESSION['msg'] = "<p style='color: green;'>Carregado os dados com sucesso!</p>";

header("Location: index.php");

 

O arquivo texto está assim:

Beltrano, beltrano@celta.com.br, beltra, 123056
Ciclano, ciclano@celta.com.br, cicla, 123057
Fulano, fulano@celta.com.br, fulan, 123058

 

Como faço para ler tudo antes e só depois gravar ?

Grato

Toarelli

Posted

Fazes dois ciclos.

Um em que apenas lês a informação, por exemplo para um array, e depois outro onde fazes o loop pelo array e fazes o insert.

10 REM Generation 48K!
20 INPUT "URL:", A$
30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50
40 PRINT "404 Not Found"
50 PRINT "./M6 @ Portugal a Programar."

 

Posted
7 horas atrás, HappyHippyHippo disse:

duas perguntas :

- a tua base de dados é mysql ?

- pretendes actualizar o registo caso este já exista ?

 

Caro amigo

- a tua base de dados é mysql ? resposta: SIM estou usando MySql

- pretendes actualizar o registo caso este já exista ? resposta: NÃO cada vez que Importar um arquivo é sempre uma Nova Importação.

 

A cotação n.1001 - tem uma importação exclusiva

A cotação n.5010 - tem uma importação exclusiva

 

Apenas preciso comparar todos os campos por exemplo: o CÓDIGO no TXT é igual a do SISTEMA ==> IMPORTA.

Se algum código no TXT não for igual a do sistema, não importa o arquivo.

Infelizmente isso não consigo realizar.

Posted
21 horas atrás, HappyHippyHippo disse:

estas a dizer que caso exista o registo no ficheiro de texto com o identificador, por exemplo, 2010, e esse registo já existe na base de dados, mesmo que os dados que estejam no ficheiro seja diferente do que exista na base de dados, então será ignorado ?

 

Amigo eu usei como exemplo.

Na verdade seria assim: 2010, BORRACHA MACIA GRANDE,1000

código: 2010

descr.: BORRACHA MACIA GRANDE

qtde.: 1000

Se o código 2010 que consta no TXT não constar no MySql, não importa o TXT

Posted
17 horas atrás, HappyHippyHippo disse:

o que significa para ti "existir no mysql" ?

importa para que ? para a mesma tabela que verificas a sua "existência" ?

Caro amigo

Estou tentando escrever um sistema web de cotação.

O usuário importa um .TXT com mais de 200 itens para serem cotados. Para não ter que digitar um-a-um, Importa um .TXT

O .TXT é gerado de um sistema qualquer, muitas vezes abre um código no sistema, mas não no sistema web. 

Por isso preciso fazer a comparação. É onde estou tendo dificuldade.

Posted
3 minutes ago, toarelli said:

Caro amigo

Estou tentando escrever um sistema web de cotação.

O usuário importa um .TXT com mais de 200 itens para serem cotados. Para não ter que digitar um-a-um, Importa um .TXT

O .TXT é gerado de um sistema qualquer, muitas vezes abre um código no sistema, mas não no sistema web. 

Por isso preciso fazer a comparação. É onde estou tendo dificuldade.

não respondenste a nenuhma questão levantada por mim ...

IRC : sim, é algo que ainda existe >> #p@p
Posted (edited)
1 hora atrás, HappyHippyHippo disse:

não respondenste a nenuhma questão levantada por mim ...

Amigo por exemplo:

Arquivo .TXT <== gerado por algum sistema local, como: VB / Clipper, etc

101, Caderno Grande, 30

201, Caneta Azul, 50

301, Lápis Preto, 50

401, Borracha Grande, 30

501, Régua 30cm, 20

 

Cotação WEB - MySql

101, Caderno Grande, 30

201, Caneta Azul, 50

301, Lápis Preto, 50

401, Borracha Grande, 30

 

A linha com [501, Régua 30cm, 20]  não consta no MySql, por isso não importa o TXT

Esse é o meu problema que não consigo fazer a comparação entre o TXT e o MySql.

 

O Arquivo TXT irá ser importado para a TABELA de cotação e não substituir a Tabela Produto existente no MySql.

Edited by toarelli
Posted (edited)
4 horas atrás, HappyHippyHippo disse:

vamos lá ver uma situação que continuas a não responder:

caso exista no ficheiro a infomração 

- 101, Caderno Grande, 30

e na base de dados:

- 101. Batatas fritas, 1000000

o que é para fazer ?

Amigo estou respondendo, ou talvez como explico não entenda.

arquivo .TXT

código.........: 101

descrição....: Caderno Grande

quantidade.: 30 uni  <== quantidade que o usuário deseja comprar

 

no MySql

código.........: 101

descrição....: Caderno Grande

a quantidade não existe no MySql, isso só importa para comprar.

 

Só preciso comparar no .TXT com o MySql o CÓDIGO e DESCRIÇÃO

O Código e a Descrição, tem de estar IGUAL tanto vindo do .TXT em relação ao MySql, Caso não esteja alguém alterou em algum ponto, também não importa.

Exemplo:

TXT - cód/descr = 101, Caneta Azul

MySql cód/desc = 101, Caneta Azulada 

não importa, tem erro .

Edited by toarelli
Posted

nesse caso terás de ter sempre duas acções sobre a BD para cada entrada do ficheiro:

- ler o registo da base de dados

- caso, não for encontrado, inserir

agora ,no que toca  à leitura do ficheiro, basta teres algo do géneno :

$linhas = [];
while (($linha = lerLinha($ficheiro)) !== false)
	$linhas[] = $linha;
IRC : sim, é algo que ainda existe >> #p@p
Posted
9 horas atrás, HappyHippyHippo disse:

nesse caso terás de ter sempre duas acções sobre a BD para cada entrada do ficheiro:

- ler o registo da base de dados

- caso, não for encontrado, inserir

agora ,no que toca  à leitura do ficheiro, basta teres algo do géneno :


$linhas = [];
while (($linha = lerLinha($ficheiro)) !== false)
	$linhas[] = $linha;

 

Caro amigo.

 

Por favor, me perdoa, me desculpa e imploro que tenha paciência.

Infelizmente não consegui entender, por favor teria algum exemplo para entender.

Essa parte:

$linhas = [];

while (($linha = lerLinha($ficheiro)) !== false)

$linhas[] = $linha;

 

lerLinha <== seria uma função, como a crio

Posted
3 horas atrás, HappyHippyHippo disse:

se tomares o código que apresentaste acima, seria o ciclo foreach que itera o array com as linhas lidas do ficheiro

apenas uma pergunta:

while (($linha = lerLinha($ficheiro)) !== false)

lerLinha <== vem da onde, como faço nessa parte, isso não entendi.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.