Base de conhecimento
1000 perguntas frequentes, 500 tutoriais e vídeos explicativos. Aqui, você encontra apenas soluções!
Resolver um problema de importação de CSV para uma tabela MySQL
Este guia explica como resolver um problema de importação de um arquivo .csv em uma tabela MySQL. A alternativa proposta consiste em ler o arquivo CSV linha por linha com PHP e inserir os dados no banco de dados MySQL.
Função "LOAD DATA LOCAL INFILE" desativada
A função LOAD DATA LOCAL INFILE permite importar um arquivo CSV diretamente para uma tabela MySQL. No entanto, essa funcionalidade é frequentemente explorada por invasores para obter acesso não autorizado a sites hospedados em servidores que a permitem.
A fim de prevenir qualquer risco de segurança e proteger os dados dos clientes, a Infomaniak desativou a função LOAD DATA LOCAL INFILE. Os usuários que importam seus arquivos CSV via phpMyAdmin (sem marcar a opção “CSV via LOAD DATA”) não serão afetados.
Aqui está um método alternativo para importar dados no formato CSV para uma tabela MySQL. O exemplo abaixo mostra como lidar corretamente com os erros ao abrir o arquivo CSV e inserir os dados no banco de dados.
Este script usa mysqli para se conectar ao banco de dados e consultas preparadas para inserir os dados. Isso garante uma melhor segurança, compatibilidade ideal com as versões recentes de PHP e uma integração simples em seu projeto, seja em um script existente ou em um novo arquivo localizado no diretório /web:
$fileName = "data.csv";
// Conectar ao banco de dados MySQL usando mysqli
$link = new mysqli("localhost", "username", "password", "database");
// Verificar a conexão com o banco de dados
if ($link->connect_error) {
die("Falha na conexão: " . $link->connect_error);
}
// Abrir o arquivo CSV para leitura
if (($handle = fopen($fileName, "r")) !== FALSE) {
// Ler cada linha do arquivo CSV
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
// Preparar a consulta SQL dinamicamente
$query = "INSERT INTO `test` VALUES (" . str_repeat('?,', count($data) - 1) . "?)";
$stmt = $link->prepare($query);
// Verificar se a preparação da consulta foi bem-sucedida
if ($stmt === FALSE) {
die("Falha na preparação da consulta: " . $link->error);
}
// Vincular parâmetros (assumindo que todas as colunas são strings)
$types = str_repeat('s', count($data));
$stmt->bind_param($types, ...$data);
// Executar a consulta
if (!$stmt->execute()) {
die("Falha na execução da consulta: " . $stmt->error);
}
// Fechar a declaração
$stmt->close();
}
// Fechar o arquivo CSV
fclose($handle);
} else {
echo "Erro: não foi possível abrir o arquivo.\n";
exit(1);
}
// Fechar a conexão com o banco de dados
$link->close();
?>
Obter ajuda
Infelizmente, não é possível indicar com precisão em que parte do script estas linhas de código devem ser inseridas.
Se este método apresentar problemas (por exemplo, ao importar vários arquivos CSV simultaneamente sem exibir mensagens de erro), é possível que a estrutura das tabelas ou a indexação dos campos sejam a causa. Nesse caso, entre em contato com o seu administrador de site para que ele faça a verificação.
Consulte também a documentação oficial do PHP relativa à função fgetcsv().
Link para esta FAQ: https://faq.infomaniak.com/1312
Esta seção de perguntas frequentes foi útil?