Jump to content
Sign in to follow this  
Gose

Inserção de multiplos registos de um ficheiro txt para uma tabela mysql

Recommended Posts

Gose

Ola pessoal.

Fiz uma função que insira todos os registos de um ficheiro .txt em 2 tabelas da base de dados.

Já consegui fazer a inserção nas tabelas, mas com alguns erros. se puser so um registo no txt, a função insere correctamente em todos os campos das tabelas, mas se meter mais que um registo, já fica mal inserido, ficando alguns registos dentro dos mesmos campos. Tenho o seguinte código:

$arquivo=('registos.txt');
if(file_exists($arquivo)){
$fp=fopen($arquivo,'r');
$conteudo = fread($fp,filesize($arquivo));
$separador = ","; // O que separa os resultados no arquivos TXT ?
$array = explode($separador, $conteudo);
$conta = count($array);


for ($i=0; $i <= $conta; $i++) {
 $sql = "INSERT INTO nota_e (ref_reg, modelo, cor, tamanho, quant ,num_cli, cliente, colarinho, etiq_reg) VALUES ('" . $array[$i] . "', '" . @$array[$i + 1] . "', '" . @$array[$i + 2] . "', '" . @$array[$i + 3] . "', '" . @$array[$i + 4] . "', '" . @$array[$i + 5] . "', '" . @$array[$i + 6] . "', '" . @$array[$i + 7] . "', '" . @$array[$i + 8] . "')";
 $resultado = mysqli_query($link,$sql);
 $i = $i + 9;
 }
 for ($i=0; $i <= $conta; $i++) {
  $sql1 = "INSERT INTO nota_p (ref_num, mod_num, cor_num, tam_num, quant_num ) values('" . $array[$i] . "','" . @$array[$i + 1] . "','" . @$array[$i + 2] . "','" . @$array[$i + 3] . "','" . @$array[$i + 4] . "')";
  $resultado1 = mysqli_query($link,$sql1);
  $i = $i + 5;
 }
 if($resultado && $resultado1){
  //for ($i=0; $i < $conta; $i++) {
  //$sql1 = "INSERT INTO nota_p (ref_num, mod_num, cor_num, tam_num, quant_num ) values('" . $array[$i] . "','" . @$array[$i + 1] . "','" . @$array[$i + 2] . "','" . @$array[$i + 3] . "','" . @$array[$i + 4] . "')";
  //$resultado1 = mysqli_query($link,$sql1);
  print "Dados copiados com sucesso!";
  //$i = $i + 4;
  //}
 }else{
  print "Não foi possível copiar os dados do arquivo.";
  }
 //echo($conteudo);
}else{
echo("Não foi possivel abrir o arquivo");
}

No ficheiro arquivo.txt:

167150, SLIM R, 3, 42, 2, 1122, ELEGANTEMAGEM - UNIPESSOAL LDª, 15, 3;
166760, PARKA, 1, 48, 2, 1122, ELEGANTEMAGEM - UNIPESSOAL LDª, 13, 2;
166760, PARKA, 1, 50, 2, 1122, ELEGANTEMAGEM - UNIPESSOAL LDª, 13, 2;

Como faço para inserir todos correctamente sem que fiquem uns dentro de os mesmos campos e outros fora do campo correcto? Se puderem ajudar agradeço...

Share this post


Link to post
Share on other sites
tiago.f

Olá,

vê o valor de $i nos teus ciclos.

Sugiro que incrementes o $i no "for"

for ($i=0; $i <= $conta; $i=$i+9) {

ou à "mão"

$i = $i + 9;

Fazer os 2 é que não...

EDIT: já agora, a lógica não é muito boa: porque usas @$array[$i+2], por exemplo? o '@' é para suprimir erros, neste caso, se o índice $i+2 não existir - MAS se não existir então o teu ciclo já não deve incrementar $i+9 mas sim $i+8....ou $i+7 ou $i+6 se houver mais @$array[...] que não existam...

Porque não lês linha a linha? simplifica o código e a leitura e duvido que notes qq diferença de performance:

(não testei)

<?php 
$arquivo=('registos.txt');
$separador = ","; // O que separa os resultados no arquivos TXT ?

if(file_exists($arquivo)){
 $fp=fopen($arquivo,'r');
 while(!feof($fp)){
   $line = trim(fgets($fp));
   if (empty($line)) {
    continue;
   }
   $line = rtrim($string, ';'); //remover o ';' que tens no fim de cada linha
   $array = explode($separador, $line); //separar por $separador

   $sql1 = "INSERT INTO nota_e (ref_reg, modelo, cor, tamanho, quant ,num_cli, cliente, colarinho, etiq_reg) VALUES ('" . $array[0] . "', '" . @$array[1] . "', '" . @$array[2] . "', '" . @$array[3] . "', '" . @$array[4] . "', '" . @$array[5] . "', '" . @$array[6] . "', '" . @$array[7] . "', '" . @$array[8] . "')";
   $sql2 = "INSERT INTO nota_p (ref_num, mod_num, cor_num, tam_num, quant_num ) values('" . $array[0] . "','" . @$array[1] . "','" . @$array[2] . "','" . @$array[3] . "','" . @$array[4] . "')";

   $resultado1 = mysqli_query($link,$sql1);
   $resultado2 = mysqli_query($link,$sql2);

   if(!$resultado1 || !$resultado2){
    print "Falha na linha: " . $line;
   }
 }
 fclose($fp);

 print "Terminado";
}

Edited by tiago.f

Share this post


Link to post
Share on other sites
Gose

tiago.f, obrigado pela compreensão e ajuda. testei o que disseste mas não funciona, porque apesar de ler as queries e inserir os registos na tabela, apenas insere registos com valor 0, ou seja, não insere as strings que vem do .txt .Concordo que executar queries uma a uma dentro de uma estrutura de repetição for() não é o melhor, mas foi a unica maneira viável que arranjei, no entanto sem muito sucesso =/

Alguma ideia de qual seja o erro?

Share this post


Link to post
Share on other sites
HappyHippyHippo

responde a esta questão : o que na linha indica que tens de inserir o registo na tabela X ou na tabela Y ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
tiago.f

Mostra as tabelas pff : show create table..

Preciso de ver o tipo de dados porque neste momento está tudo como string...

Share this post


Link to post
Share on other sites
Gose

HappyHippyHippo... Não sei se percebi bem a questão, mas à custa da tua dúvida acabei por solucionar parte do problema que estava a dar, não inserindo as strings e apenas valores zero. Alterei isto:

$lines = rtrim($line, ';'); //remover o ';' que tens no fim de cada linha
   $array = explode($separador, $lines); //separar por $separador

Agora já percorre as strings do txt e lê-as, inserindo-as na BD, mas em algumas inserções ainda mostra alguns valores nulos.

Mas ainda continuo sem perceber a tua questão =/

Tiago.f

CREATE TABLE IF NOT EXISTS `nota_p` (
 `cod_num` int(11) NOT NULL AUTO_INCREMENT,
 `ref_num` int(11) NOT NULL,
 `mod_num` varchar(50) NOT NULL,
 `cor_num` int(11) NOT NULL,
 `cli_num` varchar(70) NOT NULL,
 `tam_num` varchar(70) NOT NULL,
 `quant_num` int(11) DEFAULT NULL,
 `tam36` int(11) DEFAULT NULL,
 `tam37` int(11) DEFAULT NULL,
 `tam38` int(11) DEFAULT NULL,
 `tam39` int(11) DEFAULT NULL,
 `tam40` int(11) DEFAULT NULL,
 `tam41` int(11) DEFAULT NULL,
 `tam42` int(11) DEFAULT NULL,
 `tam43` int(11) DEFAULT NULL,
 `tam44` int(11) DEFAULT NULL,
 `tam45` int(11) DEFAULT NULL,
 `tam46` int(11) NOT NULL,
 `tam47` int(11) NOT NULL,
 `tam48` int(11) NOT NULL,
 `tam49` int(11) NOT NULL,
 `tam50` int(11) NOT NULL,
 `tam_s` int(11) DEFAULT NULL,
 `tam_m` int(11) DEFAULT NULL,
 `tam_l` int(11) DEFAULT NULL,
 `tam_xl` int(11) DEFAULT NULL,
 `tam_xxl` int(11) DEFAULT NULL,
 `tam_3xl` int(11) DEFAULT NULL,
 `tam_4xl` int(11) DEFAULT NULL,
 PRIMARY KEY (`cod_num`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8

CREATE TABLE IF NOT EXISTS `nota_e` (
 `cod_reg` int(11) NOT NULL AUTO_INCREMENT,
 `ref_reg` int(11) NOT NULL,
 `modelo` varchar(100) NOT NULL,
 `cor` int(11) NOT NULL,
 `obs` text NOT NULL,
 `cliente` varchar(100) NOT NULL,
 `num_cli` int(11) DEFAULT NULL,
 `etiq_reg` varchar(15) NOT NULL,
 `colarinho` varchar(20) NOT NULL,
 `tamanho` varchar(11) NOT NULL,
 `quant` int(11) DEFAULT NULL,
 `preco` float DEFAULT NULL,
 PRIMARY KEY (`cod_reg`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8

Estão aí

Share this post


Link to post
Share on other sites
HappyHippyHippo

Mas ainda continuo sem perceber a tua questão =/

167150, SLIM R, 3, 42, 2, 1122, ELEGANTEMAGEM - UNIPESSOAL LDª, 15, 3; // <--- porquê que esta linha vai para a tabela nota_e ?
166760, PARKA, 1, 48, 2, 1122, ELEGANTEMAGEM - UNIPESSOAL LDª, 13, 2;  // <--- porquê que esta linha vai para a tabela nota_p ?
166760, PARKA, 1, 50, 2, 1122, ELEGANTEMAGEM - UNIPESSOAL LDª, 13, 2;  // <--- porquê que esta linha vai para a tabela nota_p ?

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Gose

Porque preciso de gravar todos os registos desse ficheiro txt (linhas) para as tabelas para depois poder visualizar os registos da tabela numa função em php. E cada uma das linhas é inserida nas 2 tabelas, tanto na nota_p, como na nota_e, para depois ter de relacionar os campos das tabelas, em que se os registos forem iguais tem de mostrar todos os tamanhos( com as respectivas quantidades pedidas) de determinado cliente relativo à tabela nota_p. Algo assim:

Edited by Gose

Share this post


Link to post
Share on other sites
HappyHippyHippo

Porque preciso de gravar todos os registos desse ficheiro txt (linhas) para as tabelas para depois poder visualizar os registos da tabela numa função em php. E cada uma das linhas é inserida nas 2 tabelas, tanto na nota_p, como na nota_e, para depois ter de relacionar os campos das tabelas, em que se os registos forem iguais tem de mostrar todos os tamanhos( com as respectivas quantidades pedidas) de determinado cliente relativo à tabela nota_p. Algo assim:

é completamente irrelevante o que queres fazer.

o teu código inicial colocava a primeira linha na tebala nota_e e as duas outras linhas na tabela nota_p.

eu perguntei o que destingue as linhas para ir para tabelas diferentes.

eu só quero a resposta a esta pergunta e mais nada.


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
tiago.f

Oi, quanto a correção do rtrim , claro, não fazia sentido a variável $string (é o que dá copy-paste).

Quanto aos valores inseridos verifica se o tipo dos campos no query bate certo com a BD...

De resto parece tudo bem....

Edited by tiago.f

Share this post


Link to post
Share on other sites
Gose

Pois, mas a isso não te consigo responder, até porque se soubesse onde estava a errar, não tinha vindo pedir ajuda. O objectivo era inserir nas duas tabelas cada uma das linhas. O código inicial não estava correcto como é obvio.

Share this post


Link to post
Share on other sites
tiago.f

o teu código inicial colocava a primeira linha na tebala nota_e e as duas outras linhas na tabela nota_p.

Acho que não. O código está é mal indentado...

Share this post


Link to post
Share on other sites
Gose

tiago.f

Não foi copy paste, só que tinha metido a variável $conteudo em vez de $string, claro que ela não estava a reconhecê-la.

Já está a bater certo com a BD. Muito obrigado pela ajuda e compreensão tiago.f .

Share this post


Link to post
Share on other sites
HappyHippyHippo
<?php 
$nota_e = array('ref_reg', 'modelo, cor', 'tamanho', 'quant', 'num_cli', 'cliente', 'colarinho', 'etiq_reg');
$nota_p = array('ref_num', 'mod_num', 'cor_num', 'tam_num', 'quant_num');

foreach (explode(';', file_get_contents('registos.txt')) as $record) {
   $record = trim($record);
   if ($record != '') {
       $values = explode(',', $record);
       $sql1 = "insert into nota_e (".implode(',', $nota_e).") values ('".implode("', '", array_slice($values, 0, count($nota_e)))."')";
       $sql2 = "insert into nota_p (".implode(',', $nota_p).") values ('".implode("', '", array_slice($values, 0, count($nota_p)))."')";

       // executar os dois SQL's
   }
}

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Gose

<?php
$nota_e = array('ref_reg', 'modelo, cor', 'tamanho', 'quant', 'num_cli', 'cliente', 'colarinho', 'etiq_reg');
$nota_p = array('ref_num', 'mod_num', 'cor_num', 'tam_num', 'quant_num');

foreach (explode(';', file_get_contents('registos.txt')) as $record) {
$record = trim($record);
if ($record != '') {
	$values = explode(',', $record);
	$sql1 = "insert into nota_e (".implode(',', $nota_e).") values ('".implode("', '", array_slice($values, 0, count($nota_e)))."')";
	$sql2 = "insert into nota_p (".implode(',', $nota_p).") values ('".implode("', '", array_slice($values, 0, count($nota_p)))."')";

	// executar os dois SQL's
}
}

Funciona na perfeição também, com muito menos código. Obrigado pelo ajuda =)

Share this post


Link to post
Share on other sites

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
Sign in to follow this  

×
×
  • 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.