Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde galera
Gostaria de saber como faço para importar dados do CSV(excel) para Mysql usando PHP ?
lembrando gente que na hora da importação no sql já quero definir as colunas e o nome da tabela(entidade)
onde devera ser armazenado.
Se alguém puder me ajudar eu agradeço ?
Grato
Cadmiel Jorge
Tempo de Evangelizar
Então cara eu to querendo importar usando PHP
da uma olhada no que eu ja consegue
$handle = fopen('planilha.csv','r');
while(($data = fgetcsv($handle, 1000, ",")) !== false){
$num = count($data);
for ($c=0; $c<$num; $c++){
$id = $data[0];
$nome = $data[1];
$email = $data[2];
require_once('Connections/ConnDB.php');
mysql_select_db($database_ConnDB, $ConnDB);
$sql = 'insert into tabeladois (id,nome,email) values (null,$nome,$email)';
$Recordset1 = mysql_query($sql, $ConnDB) or die(mysql_error());
//$mysql_query($sql);
}
}
fclose($handle);
So que não estou conseguindo pegar os dados que estão no documento planilha.csv
Por favor me ajudem
grato
>
Então cara eu to querendo importar usando PHP
da uma olhada no que eu ja consegue
$handle = fopen('planilha.csv','r');
while(($data = fgetcsv($handle, 1000, ",")) !== false){
$num = count($data);
for ($c=0; $c<$num; $c++){
$id = $data[0];
$nome = $data[1];
$email = $data[2];
require_once('Connections/ConnDB.php');
mysql_select_db($database_ConnDB, $ConnDB);
$sql = 'insert into tabeladois (id,nome,email) values (null,$nome,$email)';
$Recordset1 = mysql_query($sql, $ConnDB) or die(mysql_error());
//$mysql_query($sql);
}
}
fclose($handle);
So que não estou conseguindo pegar os dados que estão no documento planilha.csv
Por favor me ajudem
grato
Eu já passei para o bd uma tabela em html.
Agora arquivo cvs deve ser mais tranquilo.
Com o comando explode
Usando o comando explode da para criar um array bidimensional,
Ai passa esse arrray para o bd.
Mas ou menos assim
$array1 = explode("\n" , $seuarquivocvs );
$array2d = array();
for($i = 0; $i <= count($array1) ; $i++){
$array2 = explode(";" , $array1[$i] );
$array2d[$i][0] = $array2[0];
$array2d[$i][1] = $array2[1];$query = "INSERT INTO tabelacvs ('c0','c1','c2') VALUES ('".$array2d[$i][0]."' , '".$array2d[$i][0] ."' , '".$array2d[$i][0] ."')
}
Deve ter uns errinhos mas eu faria assim
boa tarde galera tô na mesma pendenga, fiz esse script, ele gera o código de inscerção corretíssimo porém os dados naum saum inseridos segue:
<?
function valores($vai, $arquivo){
echo $vai;
$handle = fopen ($arquivo,"r");
echo "VALUES ";//inserindo vírgulas , parenteses e ponoto-e-vírgul de acordo com a necessidade
while (($data = fgetcsv($handle, 1000, ","))!== FALSE) {
$this -> $num;
$arr1 = array(";",",");
$arr2 = array(",","','");
$var = str_replace($arr1,$arr2,$data);
echo $num;
for ($c=0; $c < $num; $c++) {
echo "('" . $var[$c];
if (fgetcsv($handle, 1000, ",","\'")!==FALSE){echo "'),";} else {echo "');";}
}
}fclose ($handle);
}
?>
<table width="400" border="1" cellspacing="0" cellpadding="0">
<tr>
<td>Cabeçalho</td>
</tr>
<tr>
<td><table width="400" border="1" cellspacing="0" cellpadding="0">
<tr>
<td><form enctype="multipart/form-data" action="" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
Send this file: <input name="userfile" type="file" />
<input type="submit" value="Send File" />
</form>
</td>
</tr>
<tr>
<td bgcolor="#999999"><?php
$uploaddir = 'C:/apache2triad/htdocs/teste/';
$uploadfile = $uploaddir . $_FILES['userfile']['name'];
print "<pre>";
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir . $_FILES['userfile']['name'])) {
print "banco atualiuzado:\n";
print_r($_FILES); print "é mermão a bagaça falhou:\n";
print_r($_FILES);
}
print "</pre>";
?>
</td>
</tr>
<tr>
<td bgcolor="#999999">
</td>
</tr>
</table></td>
</tr>
<tr>
<td bgcolor="#0099CC"><?php
$query = valores($vai,$_FILES['userfile']['name']);
$str = string($query);
$testeup = mysql_query($str,$teste) or die("deu problema " . error_reporting(E_ALL));
echo $vai . $query or die("nada");
?></td>
</tr>
</table>>
Eu já passei para o bd uma tabela em html.
Agora arquivo cvs deve ser mais tranquilo.
Com o comando explode
Usando o comando explode da para criar um array bidimensional,
Ai passa esse arrray para o bd.
Mas ou menos assim
$array1 = explode("\n" , $seuarquivocvs );
$array2d = array();
for($i = 0; $i <= count($array1) ; $i++){
$array2 = explode(";" , $array1[$i] );
$array2d[$i][0] = $array2[0];
$array2d[$i][1] = $array2[1];$query = "INSERT INTO tabelacvs ('c0','c1','c2') VALUES ('".$array2d[$i][0]."' , '".$array2d[$i][0] ."' , '".$array2d[$i][0] ."')
}
Deve ter uns errinhos mas eu faria assim
Cara fiz aqui o que você disse porém até o momento não deu certo
a questão é que ele não insere registro no banco de dados.
alguém conseguem ai ?
A ve ai o erro que da, eu nem coloquei aquelas aspas tortas. Imprime a query nos fors para ver se ta tudo certo. E tambem eu nao me lembro da separacao no cvs, da uma olhada nos explodes eu coloquei no primeiro "/n" e no segundo ";", abre um cvs no notepad e ve
>
A ve ai o erro que da, eu nem coloquei aquelas aspas tortas. Imprime a query nos fors para ver se ta tudo certo. E tambem eu nao me lembro da separacao no cvs, da uma olhada nos explodes eu coloquei no primeiro "/n" e no segundo ";", abre um cvs no notepad e ve
Até agora nada, tipo tem como você fazer ai e testar e postar ele aqui no forum se você puder comentar cara pra gente não so copiar mas tb entender cara agradeço vlw.
>
Até agora nada, tipo tem como você fazer ai e testar e postar ele aqui no forum se você puder comentar cara pra gente não so copiar mas tb entender cara agradeço vlw.
Esse script não tava funcionando mas a ideia é a mesma.
E também eu esqueci de execultar a query,
Eu só criei uma variavel chamada $query mas não execultei,
E também não funcionava direito,
Ai eu refiz uma parte.
<?php
$mysql_connect = mysql_connect("localhost", "root" , "" ) ;
mysql_select_db("test", $mysql_connect);
$texto = "sdfsdfsdf;sdfsdf;sdfsfd
sdfsdf;fdfdf;fdfdf
fdfdf;fdfdfdsf;asdf
fdfdf;fdfsd;dsdf
sdfsdff;ffs;fsddda
sdfsdf;fdfxxdfs;dfsdy,yfsf";
$array1 = explode("\n" , $texto );
$array2d = array();
print_r($array1);
echo "<BR>";
for($i = 0; $i <= count($array1) ; $i++){
$array2 = explode(";" , $array1[$i] );
$array2d[$i][0] = $array2[0];
$array2d[$i][1] = $array2[1];print_r($array2d);
for($i = 0; $i <= count($array2d) - 1; $i++){
$query = "INSERT INTO `test`.`tabelacvs` (`c1`, `c2`, `c3`) VALUES ('".$array2d[$i][0]."', '".$array2d[$i][1]."', '".$array2d[$i][2]."');" ;
echo $query . "<BR>" ;
mysql_query($query);
}
?>
Primeiro para fazer um script assim é saber como é um arquivo cvs
sdfsdfsdf;sdfsdf;sdfsfd
sdfsdf;fdfdf;fdfdf
fdfdf;fdfdfdsf;asdf
fdfdf;fdfsd;dsdf
sdfsdff;ffs;fsddda
sdfsdf;fdfxxdfs;dfsdy,yfsf
Só tem um problema:
O arquivo pode conter um ; numa coluna sem ser para separação,
caso tenha um ponto e virgula, toda a parte que tem esse ponto e virgula, vai ter tudo entre aspas, exemplo
Numa linha
sdfsdf;"fdfx;xdfs";dfsdy,yfsf
entendeu?
para espar tenta fazer algo como um caractere de escape.
exemplo \5454621686216846246216 e tirar as aspas.
Sugiro que crie um novo tópico para ver como escapar o ponto e virgula.
Nesse meu script se tiver um ponto e virgula numa dessas "variaveis" vai bugar o script todo.
Se quizer tentar escapar isso use o str_replace nas querys
Poste o conteúdo do arquivo que você quer importar e gravar no banco de dados. Facilita para ver como esta a estrutura de armazenamento e a partir daí definir um script que faça o que você quer.
>
Poste o conteúdo do arquivo que você quer importar e gravar no banco de dados. Facilita para ver como esta a estrutura de armazenamento e a partir daí definir um script que faça o que você quer.
É cvs(separado por espaço(linhas), e virgula(colunas).
/applications/core/interface/imageproxy/imageproxy.php?img=http://www.paginadosindico.com.br/imagem/ds.jpg&key=d4b48336c3e93a2d7d27d2e8897142da4c096eaf4e21533c0c43c35c8d56502d" alt="ds.jpg" />
Segue acima a imagem da planilha que to querendo importar
usando php e mysql...
Olá cadmiel.
Certifique-se de que o arquivo CSV foi salvo com "separado por vírgulas", pois neste formato é colocado um ";" (ponto e vírgula) separando as colunas.
Abra o arquivo com:
$arquivo = fopen($arquivo, "r");
e Assim você lê linha por linha do arquivo (cada coluna será um índice da array $linha):
while ($linha_arquivo = fgets($arquivo)) {
$linha = explode(";",$linha_arquivo);
$coluna1 = $linha[0];
$coluna2 = $linha[1];
}
Lembrando que na primeira vez que passar o loop, a linha lida será a dos cabeçalhos da planilha: "id", "nome", "email";
Se não quiser ler esta linha, pode colocar um contador para executar a leitura das colunas a partir na segunda linha.
Exemplo de leitura de um arquivo CSV recebido por uma formulário, neste script, primeiro grava-se o arquivo no servidor e depois lê:
// SALVA O ARQUIVO RECEBIDO PELO FORMULÁRIO PELO CAMPO "arquivo" NO SERVIDOR
if (copy($arquivo,"import/".$arquivo_name)){
$caminho = "import/";
$abre_arquivo = $caminho.$arquivo_name;
// ABRE ARQUIVO
$arquivo = fopen($abre_arquivo, "r");
// CONTATDOR PARA PULAR A PRIMEIRA LINHA
$qtd = 0;
// LÊ LINHA POR LINHA
while ($linha_arquivo = fgets($arquivo)) {
// DIVIDE COLUNAS SEPARADAS POR ;
$linha = explode(";",$linha_arquivo);
// VERIFICADOR PARA LER A PARTIR DA SEGUNDA LINHA
if ($qtd>0){
// RESGATA VALORES
$id = $linha[0];
$nome = $linha[1];
$email = $linha[2];
} // Fecha Qtd
$qtd++;
} // fecha WHILE linha_arquivo
// FECHA ARQUIVO
fclose($arquivo);
}
Espero que tenha ajudado.
Abs
Anderson Amorim
Pessoal consegue resolver...rs Obrigados a todos pelo feedback porem temos um novo desafio...rs
segue abaixo o codigo para você importar uma .cvs para o mysql
<?php
//include "ConectaBanco.class.php";
require_once('Connections/conexao.php');
//$conectar = new ConectaBanco();
$arquivocsv = "arquivocsv.csv";
$tabela = "dados";
$handle = file($arquivocsv);
for ($i=1;$i<count($handle);$i++)
{
$valori = explode(";", $handle[$i]);
$values = "";
foreach ($valori as $val)
{
$val=trim($val);
if (eregi("NULL",$val) == 0)
$values .= "'".addslashes($val)."',";
else
$values .= "NULL,";
}
$values = trim(substr($values,0,-1));
mysql_select_db($database_conexao, $conexao);
$query = "INSERT INTO $tabela VALUES (null, ".trim($values).");";
$Recordset1 = mysql_query($query, $conexao) or die(mysql_error());
}
?>
Meu Desafio agora é o seguinte é fazer com que os registros não se dupliquem visto
que sempre que eu executar o script acima ele insere gostaria de saber como faço para antes verificar
se os registros da planilha ja está cadastrado no banco de dados, qual a melhor forma para se fazer isso ?
Faz um SELECT antes do INSERT, se mysql_num_rows for 0, execute o INSERT.
>
Faz um SELECT antes do INSERT, se mysql_num_rows for 0, execute o INSERT.
Então o problema é o seguinte vamos imaginar que tenha la na minha planilha um registro
felipe cardoso e alterei para felipe cardoso dos santos se eu usar o where
não vai dar certo, entende ? ele vai achar q felipe cardoso dos santos é novo registro
na hora de importar não vai alterar simplesmente vai inserir.
e ai alguem tem ideia de como fazer ?
Grato
>
Então o problema é o seguinte vamos imaginar que tenha la na minha planilha um registro
felipe cardoso e alterei para felipe cardoso dos santos se eu usar o where
não vai dar certo, entende ? ele vai achar q felipe cardoso dos santos é novo registro
na hora de importar não vai alterar simplesmente vai inserir.
e ai alguem tem ideia de como fazer ?
Grato
E só usar o UPDATE
Bom dia Amigos.
E onde posso resgatar a variável do formulário em GET ou POST, para executar dentro da estrutura acima?
este:
while(($data = fgetcsv($handle, 1000, ",")) !== false){
por este:
while(($data= fgetcsv($handle, 1000, ";")) !== false){
Colocar o ";" dai funciona perfeito!
Usando o phpmyadmin,
Procure import, CVS
Importe o arquivo cvs
Depois vai outra vez em import, cvs usando load data para poder carregar os dados.
Algumas versões mais velhas do phpmyadmin não da para importar cvs.
E o tópico está no forum errado.