Ir para conteúdo

POWERED BY:

Arquivado

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

Remazela

PHP - Importar Arquivo .TXT

Recommended Posts

Caros amigos.

Preciso de uma orientação dos amigos para poder fazer uma Importação de Arquivo .TXT para o sistema Web e estou com a seguinte dúvida.

Tenho os seguintes campos no Arquivo .TXT:

Código do Importe...: 1005

Código do Produto...: 105

Quantidade Produto.: 10 ========> Até aqui tudo bem.

O que preciso é acrescentar mais 02 campos para gravar no Banco, ou seja:

Código da Cotação.: 200

Código da Filial.......: 10

Abaixo meu Código que faz a importação do arquivo .TXT:

	<?php

        //Função para importar Arquivo .TXT
	    function Inserir($itens, Pdo $pdo){
	        $sts = $pdo->prepare("INSERT INTO cotacaoItens(cotaNumImport, produtoId, cotaQtde) 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->execute();
	        $sts->closeCursor();
	        $sts = NULL;
	    }
			
	    if (!empty($_FILES['arquivo']))
	    {
	        $Pdo  = new PDO("mysql:host=localhost; dbname=siscota", "root", "");

	        $file = fopen($_FILES['arquivo']['tmp_name'], 'r');

	        while (!feof($file)){
	            $linha = fgets($file);          
	            $itens = explode(';', $linha);          
	            Inserir($itens, $Pdo);
	        }
	    }

	?>

Como posso acrescentar os 2 campos a mais, para pesquisa no Banco, além dos campos do arquivo .TXT ?

Grato,

Renato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Adiciona mais dois ué..

function Inserir($itens, Pdo $pdo){
	$sts = $pdo->prepare("INSERT INTO cotacaoItens(cotaNumImport, produtoId, cotaQtde, codCota, codFilial) VALUES(?,?,?,?,?);");  
	....
	
	$sts->bindValue(4, $itens[3], PDO::PARAM_STR); //codCota
	$sts->bindValue(5, $itens[4], PDO::PARAM_STR); //codFilial

E ai após pegar os campos

$itens = explode(';', $linha); 

você faz isso:

//Logo após puxar o array 'intens' adiciona outros... ex:
$itens[] = 200; //codCota
$itens[] = 10; //codFilial

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo Gabriel

Muito Obrigado por sua ajuda, deu certo.

Posso tirar mais uma dúvida com o amigo.

O campos do Banco estão assim:

  `cotaItensId` int(10) NOT NULL AUTO_INCREMENT,
  `cotaId` varchar(10) DEFAULT NULL,        
  `clienteId` varchar(11) DEFAULT NULL,    
  `cotaNumero` varchar(255) DEFAULT NULL, 
  `cotaNumImport` varchar(255) DEFAULT NULL,    
  `produtoId` varchar(255) DEFAULT NULL,       
  `cotaQtde` varchar(255) DEFAULT NULL,
  `cotaComenta` varchar(255) DEFAULT NULL,  
  `cotaSubTotal` varchar(255) DEFAULT NULL,  

Eu consigo colocar os campos adicionais antes do explode ou tem de ser depois ?

	        while (!feof($file)){
	          $linha = fgets($file);          
	          $itens = explode(';', $linha);     
                    $itens[] = $cotaId; 
                    $itens[] = $clienteId;                 
                    $itens[] = $cotaNumero;               
	          Inserir($itens, $Pdo);
	        }

Grato,

Renato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Precisa ser depois...

O explode vai criar o array a partir da linha do Loop

while (!feof($file)){

Inclusive se pode ver o estado do array assim:

$itens = explode(';', $linha);
var_dump($itens);
die();

Seria interessante tu trabalhar com array associativo, (é um gosto pessoal)

Mas acredito que fica mais intuitivo, exemplo se tu tiver umas 500 colunas vai ficar maluquinho contando hehe.

Se liga como ficaria:

$linhaInsert = array(
	 'cotaItensId'	=> $itens[0]
	,'cotaId'	=> $itens[1]
	,'clienteId'	=> $itens[2]
	,'codCota'	=> 200
);

Com array associativo facilita a leitura ao meu ver...

(Obviamente precisa alterar tmb o Inserir.. ficando algo assim:

function Inserir($linhaInsert, Pdo $pdo){
	$sts = $pdo->prepare("INSERT INTO cotacaoItens(cotaNumImport, produtoId, cotaQtde) VALUES(:cotaNumImport,:produtoId,:cotaQtde);");  
	$sts->bindValue(':cotaNumImport', $linhaInsert['cotaNumImport'], PDO::PARAM_STR);
	$sts->bindValue(':produtoId', $linhaInsert['produtoId'], PDO::PARAM_STR);        
	$sts->bindValue(':cotaQtde', $linhaInsert['cotaQtde'], PDO::PARAM_STR);	
	$sts->execute();
	$sts->closeCursor();
	$sts = NULL;
}

(Repare que no bindValue, estou utilizando a forma associativa ':cotaNumImport' ao invés do ?

Atualmente você pode enfrentar lentidão a respeito do 'problema' de n+1..

(Entenda lendo o post do @Beraldo:)

http://rberaldo.com.br/o-problema-do-n-mais-1/

Exemplo completo em PDO:

http://stackoverflow.com/questions/1176352/pdo-prepared-inserts-multiple-rows-in-single-query

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outra coisa...

Apesar de ser um .txt, acredito que é um arquivo estilo .csv...

Nesse caso da uma olhada na função:

http://www.php.net/fgetcsv

As vezes ela abstrai algumas coisas

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.