Ir para o conteúdo
Gose

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

Mensagens Recomendadas

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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";
}

Editado por tiago.f

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
tiago.f

Mostra as tabelas pff : show create table..

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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í

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 ?

Editado por HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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:

Editado por Gose

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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....

Editado por tiago.f

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 .

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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
   }
}

Editado por HappyHippyHippo

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 =)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.