PHP MYSQL
16/04/2013
0
Tenho uma base de 46.000 e-mails para envio de mala direta. Recebi uma lista com mais 23.000 e-mails para incluir. Porém, antes de incluir, tenho que verificar se o e-mail está cadastrado, para só cadastrar e-mails que ainda não estou na base da mala direta.
Pergunto, tem alguma forma de fazer isso via PHP ou MySQL (SQL), para que receba toda a nova lista e só inclua os que não existem? É a primeira vez que tenho que fazer isso, e não sei como fazer.
Obrigado a todos!
Atenciosamente,
Abraão.
Abraão Almeida
Posts
16/04/2013
Bruno Betioli
16/04/2013
Abraão Almeida
O meu problema é que eu não estou nem sabendo como criar a função para fazer isso. Tem milhares de e-mails num .xls e preciso fazer isso.
16/04/2013
Bruno Betioli
Achei um plugin curioso chamado PHP Excel Reader. Baixe a última versão neste link [url]http://code.google.com/p/php-excel-reader/[/url].
Na sua pasta public, (ou www) crie uma subpasta de nome qualquer. Descompacte o arquivo baixado e jogue na subpasta o arquivo "excel_reader2.php"
Coloque na mesma subpasta um arquivo de conexão comum. O meu salvei como conexao.php e ficou assim:
<?php $hostname_conexao = "localhost"; $database_conexao = "teste"; $username_conexao = "root"; $password_conexao = ""; $conexao = mysql_connect($hostname_conexao, $username_conexao, $password_conexao) or trigger_error(mysql_error(),E_USER_ERROR); mysql_select_db($database_conexao, $conexao); ?>
Depois, faça um arquivo onde iremos ler o arquivo .xls e fazer o loop para inserir emails no banco. Eu chamei de insert_email.php e ficou assim:
<?php require_once "conexao.php"; require_once "excel_reader2.php"; error_reporting(E_ALL ^ E_NOTICE); $data = new Spreadsheet_Excel_Reader("funcionario.xls"); for( $i=1; $i <= $data->rowcount($sheet_index=0); $i++ ){ $SQL = "INSERT INTO funcionario (email) VALUES ('".$data->val($i, 2)."')"; $Result1 = mysql_query($SQL, $conexao) ? "O email ".$data->val($i, 2)." foi inserido." : mysql_error(); echo "<br />".$Result1; } ?>
Ocorrerá um erro que eu nem olhei o porque dele acontecer pois ele não influencia no resultado final disso que estamos fazendo.
E eu no seu lugar controlaria o loop para inserir os emails no banco aos poucos, não todos de uma vez. Faça 500 ou 1000 de cada vez, sei lá.
Espero que ajude, informe se deu certo.
17/04/2013
Abraão Almeida
17/04/2013
Abraão Almeida
<?php
require_once "conecta.php";
require_once "excel_reader2.php";
error_reporting(E_ALL ^ E_NOTICE);
$data = new Spreadsheet_Excel_Reader("lista_contato.xls");
for( $i=1; $i <= $data->rowcount($sheet_index=0); $i++ ){
if((mysql_num_rows($i) == "")){
$SQL = "INSERT INTO teste (email) VALUES ('".$data->val($i, 2)."')";
$Result1 = mysql_query($SQL, $conexao) ? "O email ".$data->val($i, 2)." foi inserido." : mysql_error();
echo "<br />".$Result1;
}
}
?>
No código acima que acrescentei a verificação
#código
if((mysql_num_rows($i) == ""))
para só inserir os e-mails que não existirem na base, porém, não funciona. Continua cadastrando os e-mails já cadastrados. Conhece alguma rotina que eu possa adicionar nesse código para que funcione?
Valeu pela ajuda!
17/04/2013
Bruno Betioli
17/04/2013
Abraão Almeida
Alterei o campo email para UNIQUE KEY e funcionou sem problemas!
Valeu pela ajuda!
Sucesso aí!
Abraão.
17/04/2013
Bruno Betioli
Fico feliz em ajudar. Também aprendi com o treco.
Abrass
17/04/2013
Bruno Betioli
Fico feliz em ajudar. Também aprendi com o treco.
Abrass
19/04/2013
Abraão Almeida
Aí, não tive como alterar o campo do email para UNIQUE. O problema é que esse campo além de não aceitar duplicações ele, também, remove todas as duplicações já existentes. Neste caso, se eu tivesse alterado o tipo de campo para UNIQUE. E a lista de e-mail tem uns 100.000 e-mails cadastrados que são usados por diversas listas. Com certeza, tem e-mails duplicados nessas várias listas. Então, para resolver o problema eu fiz uma adição no código PHP que você me enviou. Dá uma olhada, aí:
#codigo
for( $i=1; $i <= $data->rowcount($sheet_index=0); $i++ ){
$existe = mysql_result(mysql_query("SELECT COUNT(*) FROM teste WHERE email = '".$data->val($i, 2)."'
AND id_lista = 4"),0);
if($existe == 0){
$SQL = "INSERT INTO teste (id_lista,email) VALUES (4,'".$data->val($i, 2)."')";
$Result1 = mysql_query($SQL, $conexao) ? "O email ".$data->val($i, 2)." foi inserido." : mysql_error();
echo "<br />".$Result1;
}else{
echo "O email ".$data->val($i, 2)." já existe na base.";
}
}
#codigo
Conseguiu ver? Ele verifica se o e-mail existe e só cadastra se não existe!
Mais uma vez, muito obrigado pela sua ajuda!
Abração!!!
19/04/2013
Bruno Betioli
for($i=1; $i <= $data->rowcount($sheet_index=0); $i++ ){ $existe = mysql_fetch_assoc(mysql_query("SELECT DISTINCT EMail FROM funcionario WHERE EMail = '".$data->val($i, 8)."' LIMIT 1")); if(empty($existe)){ $SQL = "INSERT INTO funcionario (EMail) VALUES ('".$data->val($i, 8)."')"; $Result1 = mysql_query($SQL, $conexao) ? "O email ".$data->val($i, 8)." foi inserido." : mysql_error(); echo "<br />".$Result1; }else{ echo "<br />O email ".$data->val($i, 8)." já existe na base."; } }
Note que na query eu coloquei DISTINCT ao invés de COUNT. Deste modo ele para a consulta assim que encontrar o email procurado pela primeira vez. Afinal, nós apenas queremos saber se o email já está na base e não quantas vezes ele está lá.
Mas, mesmo assim, aconselho a utilizar UNIQUE. E no id_lista, utilize um valor de auto-incremento.
Se você estiver usando PHPMyAdmin, use estes comandos que estou passando como exemplo.
ALTER IGNORE TABLE `funcionario` ADD UNIQUE INDEX(email);
Este irá adicionar UNIQUE ignorando os registros duplicados.
ALTER TABLE `funcionario` CHANGE `id` `id` VARCHAR( 10 ) NULL DEFAULT NULL
Irá passar o campo id para VARCHAR e deixar vazio em toda a base.
ALTER TABLE `funcionario` ADD INDEX ( `id` )
Irá tornar o campo id em um índice, necessário para adicionar a propriedade auto-incremento.
ALTER TABLE `funcionario` CHANGE `id` `id` INT( 10 ) NOT NULL AUTO_INCREMENT
Pronto, o campo id agora é auto-incremento.
Depois disso, pode usar aquele primeiro código que enviei. E irá enxugar sua base eliminando registros duplicados. Porém, se houver algum motivo específico para id_lista não ser auto-incremento, este último que mandei funciona, apesar de não ser muito recomendado.
Qualquer coisa grita, abrass.
OBS: esta pontuação em volta do nome da tabela é crase. Divirta-se
22/04/2013
Abraão Almeida
Aprendi mais algumas coisas agora lendo o seu post!
Abração!
22/04/2013
Bruno Betioli
Avisa se deu certo.
Abrass
Clique aqui para fazer login e interagir na Comunidade :)