Ir para conteúdo

POWERED BY:

Arquivado

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

Ronildo Melo

Ler Arquivo Texto e Grava no MySQL

Recommended Posts

Olá pessoal!!!

 

O código abaixo tem como finalidade ler cada linha(equivalente um campo na tabela) de um arquivo texto, tratar e gravar no MySQL. Porém, aleatoriamente ele não grava. A variável do código(tot_linha) abaixo, informa 1360 porém só é gravado no MySQL 376 registros. Como sou novato na linguagem, acredito que esteja faltando algum detalhe. Caso alguem se interesse, posso enviar meu arquivo texto.

Desde já agradeço a atenção.

 

Exemplo do arquivo texto:

410
FULANO DE TAL                           
106
1
2153851859

 

 

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head>
<meta content="text/html; charset=ISO-8859-1" http-equiv="content-type"><title>Primeiro Projeto PHP</title>

</head>
<body>
<br>
<div style="text-align: left;"><br>
<h1>Registros gravados na tabela Colaboradores</h1>
<?php

//Faz a conexão com o servidor MySQL
$conexao = mysql_connect("localhost","root","admin");

//Seleciona o Banco de Dados
$db = mysql_select_db("db_portaria", $conexao);

$linha = 0;
$tot_linha = 1;
$falhou = 0;


$handle = fopen("mycolabo.txt", "r");
if ($handle) {
   while (!feof($handle)) {
       $buffer = fgets($handle); 
       $linha++;

	if ($linha == 1) {
	   $matricula = $buffer;
	   }
	else if ($linha == 2) {
	   $nome = $buffer;
	   $nome = trim($nome);
	}
	else if ($linha == 3) {
	   $cdcen = $buffer;
	}
	else if ($linha == 4) {
	   $cdsec = $buffer;
	}
	else if ($linha == 5) {
	   $cracha = $buffer;

	   $sql = "INSERT INTO colaboradores ";
	   $sql = $sql . "(matricula, nome, cdcen, cdsec, cracha) ";
	   $sql = $sql . "VALUES('$matricula','$nome','$cdcen', '$cdsec', '$cracha')";

	   mysql_query($sql,$conexao);
	   if (mysql_query) {
			$linha = 0;
			echo $matricula . "-" . $nome .  " " . $tot_linha . "<br>";
			$tot_linha++;
	   }
	   else {
			$falhou++;
	   }
	}
	else {
	}
}
   fclose($handle);
mysql_free_result(mysql_query);
mysql_close($conexao);
echo "Sucesso: " . ($tot_linha-1)  . "<br>";
echo "Falha: " . $falhou . "<br>";
}

?>
</div>
</body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que é isso ?

if (mysql_query) {
                               $linha = 0;
                               echo $matricula . "-" . $nome .  " " . $tot_linha . "<br>";
                               $tot_linha++;
                  }

 

Não entendi esse trecho do código, pra ser mais específico o teu if. Entretanto, dei uma arrumada no código aqui

eu não acho legal fazer esse monte de if no loop, mas .. dê uma olhada:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
      <head>
             <meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
             <title>Primeiro Projeto PHP</title>
      </head>
      <body>
             <br />
             <div style="text-align: left;">
                    <br />
                    <h1>Registros gravados na tabela Colaboradores</h1>
                    <?php
                          $MySQLi = new MySQLi( 'localhost' , 'root' , 'admin' , 'db_portaria' );
                          $fHandle = fopen( 'mycolabo.txt' , 'r' );

                          if ( !$fHandle ) {
                                 echo 'Não foi possível abrir o arquivo para leitura !';
                          } else {
                                 while ( !feof( $fHandle ) ) {
                                        $linhas [ ] = reset( fscanf( $fHandle , '%s' ) );
                                 }
                                 $linhas = array_chunk( $linhas , 5 );

                                 for ( $i = 0; $i < count( $linhas ); ++$i ) {
                                        array_walk( $linhas[ $i ] , function( &$linhas ) {
                                                          $linhas = !is_null( $linhas ) && !is_numeric( $linhas ) ? sprintf( "'%s'" , $linhas ) : intval( $linhas );
                                        } );
                                        $insert [ ] = sprintf( '( %s )' , implode( ', ' , $linhas[ $i ] ) );
                                 }
                                 $SQL = sprintf( 'INSERT INTO `colaboradores`( `matricula`, `nome`, `cdcen`, `cdsec`, `cracha` ) VALUES %s' , implode( ',' , $insert ) );
                                 $prepare = $MySQLi->prepare( $SQL );
                                 if ( $prepare->execute() ) {
                                        printf( 'Foram inseridos <b>%d</b> registros no banco' , $prepare->affected_rows );
                                        $prepare->close();
                                 }
                                 $MySQLi->close();
                          }

                    ?>
             </div>
      </body>
</html>

 

Testei com o arquivo dessa forma:

410
FULANO DE TAL                           
106
1
2153851859
410
FULANO DE TAL                           
106
1
2153851859
410
FULANO DE TAL                           
106
1
2153851859

 

Veja que eu usei um array chunk pra quebrar o array a cada 5 linhas, dessa forma, o insert ficou assim:

INSERT INTO `colaboradores`( `matricula`, `nome`, `cdcen`, `cdsec`, `cracha` ) VALUES 
( 410, 'FULANO', 106, 1, 2147483647 ),
( 410, 'FULANO', 106, 1, 2147483647 ),
( 410, 'FULANO', 106, 1, 2147483647 )

 

Veja também que os dados do array passam no walk, verificando se é string ou não adicionando aspas quando necessário.

 

Caso você tenha um espaçamento entre cada colaborador no array, você pode mudar o chunk pra 6 e fazer um array filter antes de montar o SQL.

 

Outra coisa que falo, é que você está fazendo executando a query de forma errada, a cada volta do LOOP você executa a query uma vez, eu preferiria fazer da forma que postei pra você, você arma toda query, e faz um implode em cada parêntese com os dados, é até a mais correta, assim você executa a query uma vez só !

 

Até !

Compartilhar este post


Link para o post
Compartilhar em outros sites

Andrey, gostaria de agradecer por sua atenção e pela arrumação no código.

 

Tentei executar mas não funcionou, como minha experiência em PHP é quase zero, olhei, olhei e não vi nada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O site não pode exibir a página

HTTP 500

Causas prováveis:

•O site está em manutenção.

•O site tem um erro de programação.

 

Você pode tentar:

Atualizar a página.

 

Voltar para a página anterior.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Andrey não quero tomar seu tempo, que por sinal dever precioso, não sei habilitar as mensagens de erro no PHP, como lhe disse antes, estou "engatinhando" no PHP. Mas se for algo simples eu posso tentar, desde que você me oriente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Registros gravados na tabela Colaboradores

prepare( $SQL ); if ( $prepare->execute() ) { printf( 'Foram inseridos %d registros no banco' , $prepare->affected_rows ); $prepare->close(); } $MySQLi->close(); } ?>

 

Boa tarde Andrey

Você viu meu último post?

Esse é o erro que está aparecendo.

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.