LOAD DATA INFILE

Enviada por Joaquim Fernandes 
Joaquim Fernandes
LOAD DATA INFILE
13 de May de 2010 às 01:51PM
Olá pessoal, tudo bem? Espero que sim!

Estou precisando de uma ajudinha com o PHP e se alguém puder me dar um help, vou ficar extremamente grato! Ah, este post poderia ser colocado em diversas sessões do fórum na minha opinião, que mediante a tantas opções, os coloquei aqui! Me perdoem caso ele não esteja no local correto! Bom vamos lá ...

Eu tenho o seguinte ambiente de teste:

- Windows Server 2008 Data Center Edition 32 Bits
- IIS 7.0 + PHP 4.4.9 (Em C:\php4\) + PHP 5.3.2 (C:\php5)
- Banco de dados: MySQL 5.1.46

No meu servidor IIS 7 sem serviço de FTP, tenho apenas um site criado, chamado: Site Corp
O "Home directory" deste site é o caminho: "C:\sites" (Sem aspas, é claro!)

Dentro do diretório acima, eu posso as seguintes pastas:
C:\sites\corp\ - Acessível por http://localhost/corp/index.html
C:\sites\portal\ - Acessível por http://localhost/portal/index.html (Esta pasta usa o PHP 5)

Observação: Apenas a pasta "portal" no IIS 7 em "Handler Mappings" utiliza o Script Map apontando para o arquivo "C:\php5\php-cgi.exe" utilizando o módulo "CgiModule" ao invés do "FastCgiModule" (não sei porque o FastCgiModule não roda com o PHP versão 5! Alguém sabe o porque?).

Ao acessar os seguintes caminhos:
http://localhost/phpinfo.php (Vejo as configurações do PHP 4 sem problemas).
http://localhost/corp/phpinfo.php (Vejo as configurações do PHP 4 sem problemas).
http://localhost/portal/phpinfo.php (Vejo as configurações do PHP 5 sem problemas).

Dentro dos diretórios abaixo eu tenho os arquivos "script.php" e "script.txt"
C:\sites\script.php e C:\sites\teste.txt
C:\sites\corp\script.php e C:\sites\corp\teste.txt
C:\sites\portal\script.php e C:\sites\portal\teste.txt

O conteúdo do arquivo de teste é simples:

"JOAQUIM 22 123" (O espaço é separado por tabulação e sem aspas! Tentei colocar também o limitador de uma coluna e outra com "," e ";" mas não consegui!)

Quando conecto no MySQL, realizo os seguintes passos:

MySQL> CREATE DATABASE producao
MySQL> USE producao
MySQL> CREATE TABLE teste (nome NVARCHAR(20), idade INT(2), id INT(3)); MySQL> LOAD DATA LOCAL INFILE "teste.txt" INTO TABLE teste;

Até aqui sem problemas! Banco funcionando normalmente e os dados são inseridos na tabela!
Agora, explicado o ambiente vem o problema:

Ao tentar acessar o "script.php" que possui o código abaixo:

<?php

require("conecta.inc");
$upload_dir = "C:/sites";
$arq = "teste.txt";
$query = "LOAD DATA INFILE 'C:/sites' INTO TABLE teste FIELDS TERMINATED BY ';';";
mysql_query($query);

?>

Sempre recebo o erro 500! Quando eu executo em outro servidor, a página fica toda em branco, sem dar nenhum resultado, então eis a dúvida: O código esta certo? Há alguma configuração a ser feita no PHP? Como faço para que o meu script em PHP, leia um arquivo txt e insira tais informações no banco de dados?

Os usuários comuns da máquina, já possuem permissão de "Modify" em "C:\sites" e todos os diretórios filhos.

Se alguém puder dar um help, vou ficar agradecido!
Obrigado e abraço à todos!

Joaquim =)
Joaquim Fernandes
Re: LOAD DATA INFILE
13 de May de 2010 às 01:58PM
Pessoal,

Eu acessei o Internet Explorer / Opções de Internet / Avançado e desabilitei a notificação de erros amigáveis e acesso a página script.php novamente, recebi o seguinte erro:

PHP Warning: main(conecta.inc) [function.main]: failed to open stream: No such file or directory in C:\sites\script.php on line 3 PHP Fatal error: main() [function.require]: Failed opening required 'conecta.inc' (include_path='.;c:\php4\pear') in C:\sites\script.php on line 3

O que é o "pear" que ele não esta encontrando? O que é também o "conecta.inc"?
Eu fiz este script com base no exemplo que um professor passou na aula, rs!

Se puderem me ajudar, mais uma vez, grato =)
Marcos Regis
Re: LOAD DATA INFILE
13 de May de 2010 às 02:01PM
vc criou o arquivo conecta.inc ??

provavelmente é nele que está sendo criada a conexão para o mysql e o erro indica que ele não está no mesmo diretorio onde vc fez a chamada usando require.
Joaquim Fernandes
Re: LOAD DATA INFILE
13 de May de 2010 às 02:03PM
Olá, como faço para criar?
Crio um arquivo comum com esta extensão mesmo? Exige algum código dentro do mesmo?

Obrigado!
Joaquim Fernandes
Re: LOAD DATA INFILE
13 de May de 2010 às 02:09PM
Eu criei o arquivo e ao executá-lo novamente, surgiu a seguinte mensagem:

PHP Warning: mysql_query() [function.mysql-query]: Access denied for user 'ODBC'@'localhost' (using password: NO) in C:\sites\testeimp.php on line 9 PHP Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in C:\sites\testeimp.php on line 9

Eu acessei o ODBC do W2K8 e criei uma ODBC apontando para arquivos do tipo TXT, CSV e dBase (DBF).
Mas ao executar o script a página com erro continua em exibição.
Joaquim Fernandes
Re: LOAD DATA INFILE
13 de May de 2010 às 02:13PM
Chegamos num ponto crucial:

Acessando a console do MySQL, procedi com as seguintes ações:

MySQL> CREATE USER ODBC;

Usuário foi criado; Quando eu executo o script novamente via browser, a página fica TOTALMENTE em branco! Não é exibido mensagem de erro nenhuma, mas também não é exibida nenhuma mensagem de erro!

Ao executar o comando:

MySQL> SELECT * FROM teste; (Nenhum dado foi inserido na base!)

Alguém sabe como resolver este problema? Principalmente agora que não tem mensagem de erro nenhuma, rs!

Abraços!
Joaquim Fernandes
Re: LOAD DATA INFILE
13 de May de 2010 às 02:15PM
Joaquim Fernandes Escreveu:
-------------------------------------------------------
> Não é exibido mensagem de erro
> nenhuma, mas também não é exibida nenhuma
> mensagem de erro!

Corrigindo, não é exibida mensagem nenhuma de sucesso também, rs!
Marcos Regis
Re: LOAD DATA INFILE
13 de May de 2010 às 02:43PM
Percebo que vc é iniciante em PHP.
Ao invés de já iniciar com algo que não consegue lidar em caso de erro comece com coisas mais simples.

Primeiro, certifique-se de que compreende o que cada linha de código faz.
Use o manual do PHP para verificar suas dúvidas inicialmente e caso não tenha sucesso em resolver pode contar com o fórum. Desta forma coisas simples serão resolvidas mais rapidamente.

http://php.net/mysql_connect
Joaquim Fernandes
Re: LOAD DATA INFILE
13 de May de 2010 às 04:17PM
Pessoal,

<?php
$con = mysql_connect("localhost","ODBC","");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("producao", $con);
mysql_query("INSERT INTO Teste (Rg, Nome, Idade) VALUES ('1234', 'Vinicius', '21')");
Echo "Commit Sucessfully! :)";
mysql_close($con);
?>

Consegui conectar com o banco, rodar o exemplo e funcionou!

Agora, alguém pode me dar um exemplo de como utilizo o comando "LOAD DATA INFILE" neste script para ler um arquivo TXT e importar os dados presentes no mesmo para o banco de dados?

Tentei colocar o código:

$query = "LOAD DATA INFILE 'C:/sites/dados.txt' INTO TABLE teste FIELDS TERMINATED BY ';';";
mysql_query($query);

Rodou sem erros, mas não incluiu o conteúdo do arquivo "dados.txt".
Alguém poderia me ajudar a identificar a causa?

Tentei encontrar ajuda na página oficial do PHP, mas ainda não consegui resolver :\

Vlw ;)
BOZO
Re: LOAD DATA INFILE
13 de May de 2010 às 06:19PM
vc tem que procurar eh no site do Mysql

http://dev.mysql.com/doc/refman/5.1/en/load-data.html

verifica ai se o mysql retorna algum erro

mysql_query($query) or die (mysql_error());
Joaquim Fernandes
Re: LOAD DATA INFILE
14 de May de 2010 às 08:23AM
Bozo,

Obrigado, sua dica me ajudou a resolver o problema:

or die (mysql_error());

Indicava que ele não encontrava o arquivo no lugar mencionado.
Por exemplo, se estava com o código:

LOAD DATA INFILE 'C:/sites/dados.txt'

Eu precisei alterar para:

LOAD DATA INFILE 'dados.txt'

E mover o arquivo de dados para o diretório: C:\MySQL\bin\ (Diretório raiz da instalação!)

Alguém saberia me dizer, porque ele não procurou o arquivo no caminho passado?
Esta é uma parametrização a ser feita no arquivo PHP.INI?

Pessoal, perdoe-me as perguntas de estagiário!
Vlw pela ajuda de todos =)
BOZO
Re: LOAD DATA INFILE
14 de May de 2010 às 08:37AM
C:/sites/dados.txt seria como tentar pegar um arquivo no cliente, por isso tem que passar uma pasta acessivel pelo php.
Joaquim Fernandes
Re: LOAD DATA INFILE
14 de May de 2010 às 01:39PM
Bozo,

Como poderia definir a localização então? Não entendi! :S

Bom, surgiu um outro problema; Com esta instrução, funciona:
LOAD DATA INFILE 'C:/sites/dados.txt'

Porém, se eu colocar da seguinte forma:
LOAD DATA LOCAL INFILE 'C:/sites/dados.txt' o script não é executado!

Pelo o que consultei no http://dev.mysql.com/doc/refman/4.1/pt/load-data.html a sintaxe esta correta!

Pesquisando por um site americano (infelizmente perdi o link), li algo sobre o PHP 4 que dizia que havia uma incompatibilidade da API do PHP 4 responsável pelo comando com a versão do MySQL 5.

Alguém sabe por que não consigo executar o script com a opção (LOCAL) no PHP 4 + MySQL 5?
Vlw pela ajuda!
Marcos Regis
Re: LOAD DATA INFILE
14 de May de 2010 às 01:51PM
Amigo, vamos por parte.
LOCAL é opcional. Não faz diferença.

LOAD DATA só funcionará se o arquivo estiver disponível para o MYSQL ler. Isto significa que você não pode colocar um arquivo no seu micro e esperar que o servidor WEB externo o leia. Isso não funciona.

Não faz muito sentido usar LOAD DATA INFILE via PHP pois seria necessário primeiro fazer upload e depois executar o comando com o caminho completo e cujas permissões estejam adequadas ao MySQL ler.
O mais correto é utilizar um arquivo de dump que executará instruções de SQL.
Pra que ficar se matando com isso se o phpMyAdmin faz isso tudo??

Se o que está fazendo é tentar instalar algum sistema cujos dados estao em um backup feito com SELECT ... INTO OUTFILE faça isso sem o PHP, use FTP e MySQL.
Você precisa estar logado no PHPBrasil.com para poder enviar mensagens para os nossos fóruns.

Faça o login aqui.