View Full Version : Transferencia de Registos


BlkLotus
30-11-2007, 16:53
Boas

Fiz uma loja em osCommerce para um conhecido, onde a maneira que arranjei para importar os mais de 33 mil artigos para dentro da base de dados foi através de um CSV criado pelo software de gestão, e que depois um script que eu fiz em PHP insere os valores que lá estão, na respectiva tabela do osCommerce.

O código é este:

<?php

mysql_connect("localhost", "******", "******");

mysql_select_db("*****");

$abreFicheiro = fopen("products.csv", "r");

if (!$abreFicheiro){
echo ("<p>Ficheiro não encontrado</p>");
} else {
echo ("<p>Ficheiro dos produtos foi lido, e transferida a informação</p>");

while ($registos = fgetcsv ($abreFicheiro, 2048, ";")) {
$result = mysql_query("insert into products (products_id,products_quantity,products_model,prod ucts_image,products_price,products_date_added,prod ucts_last_modified,products_date_available,product s_weight,products_status,products_tax_class_id,man ufacturers_id,products_ordered) values ('$registos[0]','$registos[1]','$registos[2]','$registos[3]','$registos[4]','$registos[5]','$registos[6]','$registos[7]','$registos[8]','$registos[9]','$registos[10]','$registos[11]','$registos[12]')");

}

}

fclose($abreFicheiro);

?>


Está tudo a correr bem, ele importa tudo como deve ser e os artigos que já estão associados as respectivas familias num outro ficheiro aparecem no site, tudo porreiro.

O PROBLEMA, é que ele só lê até 4775 artigos!!! :wow: Já tentei colocar ficheiros diferentes, alterados, limpo a BD e volto a importar... e nada... chega ao artigo 4775 e ele simplesmente acaba o script e diz que correu tudo bem.

O que se passa? É algum limite nas configurações do MySQL? É limite de alguma função do PHP que eu não conheço?

Agradecia alguma ajuda que possam dar, é que são 33 mil artigos, e na loja virtual só estão a aparecer os 4775, o que representa apenas uma pequeníssima parte!

Btw... eu não percebo muito de programação, praticamente só comecei agora a mexer mais nisto depois de ele me pedir para o fazer, e diga-se de passagem que até estou a gostar e a aprender a cada dia que passa, mas agora ficou-me esta cena "entalada" a meio do caminho e não consigo perceber o porque :'(

Abraço!

Tyran
30-11-2007, 17:09
hmm, estás a dizer que a informação foi transferida antes de o ser porque só abaixo é que o faz...
no ciclo while verifica se estás a ler tudo do ficheiro, pode ser que seja isso... ah e tira a db password e user, nós não precisamos de ver isso :)

BlkLotus
30-11-2007, 17:31
hmm, estás a dizer que a informação foi transferida antes de o ser porque só abaixo é que o faz...
no ciclo while verifica se estás a ler tudo do ficheiro, pode ser que seja isso... ah e tira a db password e user, nós não precisamos de ver isso :)

Boas

Exacto, o "echo" que ali está é só para "ingles ver" lol, serve mais para eu verificar apenas se o ficheiro lá está ou não. Penso que para ver se a query deu algum erro ou não, tenho que verificar os erros da variavel "$result".

De facto é mesmo isso que eu queria saber como fazer, como ver se o ciclo while está a ir até ao fim :'( É que eu estou mesmo a ver que não está, e algures simplesmente termina derrepente. Como posso fazer isso?

Em relação aos dados, não há problema, pois estes dados são da bd do meu PC, só o user é o mesmo da loja online, tanto a bd como a password são diferentes :P Mas obrigado pelo reparo, porque nem tinha reparado, já editei, thanks!!! :eek:

Tyran
30-11-2007, 19:01
lol ja tem * :P
hmm, no ciclo podes ,por exemplo, acrescentar um $contador++; para veres quantas itenerações faz ou mandar mesmo para um ficheiro de texto o que estás a ler para verificar se é da bd o prob ou não, só uma ideia...
cumpzz

dmind
03-12-2007, 11:18
E já viste se não é "timeout" na execução do script php ?

Por default o timeout são 60 segundos, para inserir 33k acho k o php vai demorar bem mais k 60 segundos...

Dá uma olhadela no php.ini e aumenta esse tamanho :)

oscarolim
03-12-2007, 12:23
Quando colocas folhas numa capa, abres a capa, colocas a folha, fechas a capa e repetes este procedimento para cada folha, ou colocas as folhas todas de uma vez? :p

Para isso ser mais rapido e eficiente (nao faz sentido abrires e fechares (insert, commit) 30mil vezes), usa este código (demorará qualquer coisa como 2 a 3 segundos a ser executado:



$query = "BEGIN;";
while ($registos = fgetcsv ($abreFicheiro, 2048, ";")) {
$query .= "insert into products (products_id,products_quantity,products_model,prod ucts_image,products_price,products_date_added,prod ucts_last_modified,products_date_available,product s_weight,products_status,products_tax_class_id,man ufacturers_id,products_ordered) values ('$registos[0]','$registos[1]','$registos[2]','$registos[3]','$registos[4]','$registos[5]','$registos[6]','$registos[7]','$registos[8]','$registos[9]','$registos[10]','$registos[11]','$registos[12]');";

}
$query .= "COMMIT";
$result = mysql_query($query);
}