Ir para conteúdo
william_droops

Colocar e-mails em um Array para enviar

Recommended Posts

Preciso enviar um e-mail para todos os endereços cadastrados em uma tabela de contatos.
O problema é que esta tabela, existem vários campos onde podem ou não ser preenchido o e-mail e o mesmo cliente pode ter mais de um contato. 
Então a tabela contato tem 

Nome | emailA | emailB | emailC | emailD 
Como faço para dar um loop, pegando esses campos se tiver valor colocar em um Array para depois enviar um e-mail, sendo que pode ter mais de uma linha cada contato.
 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja se da uma luz...

<?php

$clientes = $stmt->fetchAll();


$clienteComEmail = []; 
foreach($clientes as $cliente) {
	
	$idCliente = $cliente['id'];
	
	if(filter_var($cliente['emailA'], FILTER_VALIDATE_EMAIL)){ 
		$clienteComEmail[$idCliente][] = $cliente['emailA']
	}	
	
	if(filter_var($cliente['emailB'], FILTER_VALIDATE_EMAIL)){ 
		$clienteComEmail[$idCliente][] = $cliente['emailA']
	}
		
	///emailC, emailD , etc

}

A ideia basicamente é percorrer todos os registros e em cada registro validar se o e-mail é valido...

Caso valido, ele joga no array $clienteComEmail utilizando a chave...

 

Retorno seria algo como:

[
	[20] => [
		 'email1@teste.com'
		,'email2@teste.com'	
	]
	,[21] => [
		 'email1@teste.com'
		,'email2@teste.com'	
	],[22] => [
		 'email1@teste.com'		
	],[25] => [
		 'email1x@teste.com'		
	]
]

 

 

Depois só percorrer o array de emails e disparar...

 

 

Da uma lida sobre lógica de programação, podem facilitar no futuro.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 14/08/2017 at 18:53, gabrieldarezzo disse:

Veja se da uma luz...


<?php

$clientes = $stmt->fetchAll();


$clienteComEmail = []; 
foreach($clientes as $cliente) {
	
	$idCliente = $cliente['id'];
	
	if(filter_var($cliente['emailA'], FILTER_VALIDATE_EMAIL)){ 
		$clienteComEmail[$idCliente][] = $cliente['emailA']
	}	
	
	if(filter_var($cliente['emailB'], FILTER_VALIDATE_EMAIL)){ 
		$clienteComEmail[$idCliente][] = $cliente['emailA']
	}
		
	///emailC, emailD , etc

}

A ideia basicamente é percorrer todos os registros e em cada registro validar se o e-mail é valido...

Caso valido, ele joga no array $clienteComEmail utilizando a chave...

 

Retorno seria algo como:


[
	[20] => [
		 'email1@teste.com'
		,'email2@teste.com'	
	]
	,[21] => [
		 'email1@teste.com'
		,'email2@teste.com'	
	],[22] => [
		 'email1@teste.com'		
	],[25] => [
		 'email1x@teste.com'		
	]
]

 

 

Depois só percorrer o array de emails e disparar...

 

 

Da uma lida sobre lógica de programação, podem facilitar no futuro.

 

 

Fiz assim, mas esta apresentando erro "Fatal error: Call to a member function fetchAll() on a non-object in"

 

 

$sqlemails = 'SELECT 
     A10_001_C AS NOME
    ,A10_010A_C 
    ,A10_010B_C 
 FROM clientes (NOLOCK)
   WHERE 
     A10_PAR = "A33"
    AND clienteid =  "00210"';
    
        if(conexao_bd()){
                $rest2 = mssql_query($sqlemails);
                $clientes = $rest2->fetchAll();
        

Compartilhar este post


Link para o post
Compartilhar em outros sites

fetchAll é do PDO.. (já q não foi informado o tipo de conexão).

 

Enfim utilize o vendor de conexão a gosto.

 

No seu caso é o mssql_, ficaria +/- assim:

//conexão etc etc

$query = "SELECT id, emailA, emailB, emailC from clientes";
$result = mssql_query($query);
if (!$result) {
  die('Invalid query: ' . mssql_error());
}

$clienteComEmail = []; 
while ($cliente = mssql_fetch_assoc($result)) {
	
	$idCliente = $cliente['id'];
	
	if(filter_var($cliente['emailA'], FILTER_VALIDATE_EMAIL)){ 
		$clienteComEmail[$idCliente][] = $cliente['emailA']
	}	
	....

Obviamente 

 

Se possível altere para o PDO

Compartilhar este post


Link para o post
Compartilhar em outros sites

Evite usar campos neste padrão: email1, email2 etc...

 

Normalizar os dados de sua tabela de contatos dividindo em duas.

 

Crie uma tabela para armazenar os e-mails dos contatos exemplo abaixo.

tabela contatos (id, nome)

tabela  email (id, id_contato, email)

 

Leia sobre normalização de dados:

http://www.blogdati.com.br/index.php/2010/03/normalizacao-em-banco-de-dados/

 

Caso use o mysql 5.7 e queira manter os e-mail na mesma tabela de contato  pode se criar um campo do tipo JSON e armazenar os e-mail neste campo.

https://dev.mysql.com/doc/refman/5.7/en/json.html

  • +1 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 16/08/2017 at 16:34, gabrieldarezzo disse:

fetchAll é do PDO.. (já q não foi informado o tipo de conexão).

 

Enfim utilize o vendor de conexão a gosto.

 

No seu caso é o mssql_, ficaria +/- assim:


//conexão etc etc

$query = "SELECT id, emailA, emailB, emailC from clientes";
$result = mssql_query($query);
if (!$result) {
  die('Invalid query: ' . mssql_error());
}

$clienteComEmail = []; 
while ($cliente = mssql_fetch_assoc($result)) {
	
	$idCliente = $cliente['id'];
	
	if(filter_var($cliente['emailA'], FILTER_VALIDATE_EMAIL)){ 
		$clienteComEmail[$idCliente][] = $cliente['emailA']
	}	
	....

Obviamente 

 

Se possível altere para o PDO

 Ele joga no Array inclusive os e-mails que não são validos e os Nulls;

Como faço para recuperar os campos separadamente ?

 

Array ( [0] => Array ( [NOME] => JORGE [A10_010A_C] => [A10_010B_C] => [A10_010C_C] => [A10_010D_C] => [A10_010E_C] => [A10_010F_C] => [A10_010G_C] => jorgege@uol.com.br [A10_010H_C] => jorgege@me.com [A10_010I_C] => [A10_010J_C] => [A10_010K_C] => ) ) Array ( [0] => Array ( [NOME] => WILLIAM [A10_010A_C] => william.silva@qgte.com.br [A10_010B_C] => novoteste@gmail.com [A10_010C_C] => [A10_010D_C] => [A10_010E_C] => [A10_010F_C] => [A10_010G_C] => testes [A10_010H_C] => testse [A10_010I_C] => testse [A10_010J_C] => testes [A10_010K_C] => testes ) )

 

Em 17/08/2017 at 01:47, Ricardo Saraiva disse:

Evite usar campos neste padrão: email1, email2 etc...

 

Normalizar os dados de sua tabela de contatos dividindo em duas.

 

Crie uma tabela para armazenar os e-mails dos contatos exemplo abaixo.

tabela contatos (id, nome)

tabela  email (id, id_contato, email)

 

Leia sobre normalização de dados:

http://www.blogdati.com.br/index.php/2010/03/normalizacao-em-banco-de-dados/

 

Caso use o mysql 5.7 e queira manter os e-mail na mesma tabela de contato  pode se criar um campo do tipo JSON e armazenar os e-mail neste campo.

https://dev.mysql.com/doc/refman/5.7/en/json.html

O Banco é de um ERP, infelizmente não fui eu que criei, seria mais facil para mim se fosse no outro padrão, obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Essa informação:

4 horas atrás, william_droops disse:

Array ( [0] => Array ( [NOME] => JORGE [A10_010A_C] => [A10_010B_C] => [A10_010C_C] => [A10_010D_C] => [A10_010E_C] => [A10_010F_C] => [A10_010G_C] => jorgege@uol.com.br [A10_010H_C] => jorgege@me.com [A10_010I_C] => [A10_010J_C] => [A10_010K_C] => ) ) Array ( [0] => Array ( [NOME] => WILLIAM [A10_010A_C] => william.silva@qgte.com.br [A10_010B_C] => novoteste@gmail.com [A10_010C_C] => [A10_010D_C] => [A10_010E_C] => [A10_010F_C] => [A10_010G_C] => testes [A10_010H_C] => testse [A10_010I_C] => testse [A10_010J_C] => testes [A10_010K_C] => testes ) )

é referente a que ?

 

Fica difícil te auxiliar com informações reduzidas.

 

4 horas atrás, william_droops disse:

Como faço para recuperar os campos separadamente ?

Depende muito de como seu banco está...

 

Respondendo pela duvida:

4 horas atrás, william_droops disse:

Como faço para recuperar os campos separadamente ?

https://secure.php.net/manual/pt_BR/control-structures.for.php

 

 

Se você der um var_dump() aqui:

while ($cliente = mssql_fetch_assoc($result)) {
    var_dump($cliente);die();
.....
	
	

Qq retorna?

 

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites


Este é o retorno do SELECT 

Dando um var_dump() 

 

o retorno 

 array(12) { ["NOME"]=> string(40) "JORGE " ["A10_010A_C"]=> string(50) " " ["A10_010B_C"]=> string(50) " " ["A10_010C_C"]=> string(50) " " ["A10_010D_C"]=> string(50) " " ["A10_010E_C"]=> string(50) " " ["A10_010F_C"]=> string(50) " " ["A10_010G_C"]=> string(50) "jorgege@uol.com.br " ["A10_010H_C"]=> string(50) "jorgege@me.com  " ["A10_010I_C"]=> string(50) " " ["A10_010J_C"]=> string(50) " " ["A10_010K_C"]=> string(50) " " }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cade sua Primary key?

No meu exemplo tem o 'id'....

 

Só abstrair brother, cade seu script completo?

 

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

$sqlemails = 'SELECT 
     A10_001_C AS NOME
    ,A10_010A_C 
    ,A10_010B_C 
    ,A10_010C_C 
    ,A10_010D_C 
    ,A10_010E_C 
    ,A10_010F_C 
    ,A10_010G_C 
    ,A10_010H_C
    ,A10_010I_C  
    ,A10_010J_C 
    ,A10_010K_C 
 
 FROM A10 (NOLOCK)
   INNER JOIN A33 ON A33.UKEY = A10.A10_UKEYP 
 WHERE 
 
    A10_PAR = "A33"
    AND A33_001_C =  "00210"';
    
    
    
    if(conexao_bd()){
        
            
        
        $rest2 = mssql_query($sqlemails);
        
        if (!$rest2){
            
        }
        
        //$clienteComEmail = [];
        
        while ($cliente = mssql_fetch_assoc($rest2) ) {
            var_dump($cliente);
            die();
            
            $idCliente = $cliente['NOME'];
            
            
            if(filter_var($cliente['A10_010A_C'],FILTER_VALIDATE_EMAIL)) {
                $clienteComEmail[$idCliente][] = $cliente['A10_010A_C'];
                
            }
            
            if(filter_var($cliente['A10_010B_C'],FILTER_VALIDATE_EMAIL)) {
                $clienteComEmail[$idCliente][] = $cliente['A10_010B_C'];
            }
            
            if(filter_var($cliente['A10_010C_C'],FILTER_VALIDATE_EMAIL)) {
                $clienteComEmail[$idCliente][] = $cliente['A10_010C_C'];
            }
            
            if(filter_var($cliente['A10_010D_C'],FILTER_VALIDATE_EMAIL)) {
                $clienteComEmail[$idCliente][] = $cliente['A10_010D_C'];
            }
            
            if(filter_var($cliente['A10_010E_C'],FILTER_VALIDATE_EMAIL)) {
                $clienteComEmail[$idCliente][] = $cliente['A10_010E_C'];
            }
            
            if(filter_var($cliente['A10_010F_C'],FILTER_VALIDATE_EMAIL)) {
                $clienteComEmail[$idCliente][] = $cliente['A10_010F_C'];
            }
            
            if(filter_var($cliente['A10_010G_C'],FILTER_VALIDATE_EMAIL)) {
                $clienteComEmail[$idCliente][] = $cliente['A10_010G_C'];
            }
            if(filter_var($cliente['A10_010H_C'],FILTER_VALIDATE_EMAIL)) {
                $clienteComEmail[$idCliente][] = $cliente['A10_010H_C'];                
            }
            
            if(filter_var($cliente['A10_010I_C'],FILTER_VALIDATE_EMAIL)) {
                $clienteComEmail[$idCliente][] = $cliente['A10_010I_C'];
            }
           
            if(filter_var($cliente['A10_010J_C'],FILTER_VALIDATE_EMAIL)) {
                $clienteComEmail[$idCliente][] = $cliente['A10_010J_C'];
            }
            
            if(filter_var($cliente['A10_010K_C'],FILTER_VALIDATE_EMAIL)) {
                $clienteComEmail[$idCliente][] = $cliente['A10_010K_C'];
            }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se liga no var_dump...


Array (	
  [0] => Array ( 
    [NOME] => JORGE 
    [A10_010A_C] => ....

Significa a variável possui um array numérico que possui um array associativo... (por isso recomendo usar PDO, evita pegadinhas dessas)....

 

Tenta assim:

while ($cliente = mssql_fetch_assoc($rest2) ) {
  $cliente = $cliente[0]    
  ....

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outra coisa, você poderia tentar reduzir a qnt de ifs...

 

Repare, toda vez você basicamente filtra se o E-mail é valido para campo1, campo2.  ... campo-N

 

Veja se pega a ideia:

$campo_emails = array(
	 "A10_010A_C"
	,"A10_010B_C"
	,"A10_010C_C"
	,"A10_010D_C"
	,"A10_010E_C"
	,"A10_010F_C"
	,"A10_010G_C"
	,"A10_010H_C"
	,"A10_010I_C"
	,"A10_010J_C"
	,"A10_010K_C"
);


$query = "SELECT NOME, ". implode($campo_emails, ',') . " from clientes";

$result = mssql_query($query);
if (!$result) {
  die('Invalid query: ' . mssql_error());
}

$clienteComEmail = []; 
while ($cliente = mssql_fetch_assoc($result)) {
	$cliente = $cliente[0]; //Why?!
	$nomeCliente = $cliente['NOME'];
	
	foreach($campo_emails as $campo){
		$email = $cliente[$campo];
		if(filter_var($email, FILTER_VALIDATE_EMAIL)){ 
			$clienteComEmail[$nomeCliente][] = $email;
		}	
	}
}

 


Testa cada um deles:

http://php.net/manual/pt_BR/function.mssql-fetch-assoc.php

http://php.net/manual/pt_BR/function.mssql-fetch-row.php

 

Ou essa:

while ($cliente = mssql_fetch_array($result, MSSQL_ASSOC)) {

Enfim precisa ir lendo, testando debbugando.


Boa sorte. 

 

Qualquer coisa da um grito ;)

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por darkskull10
      Numa cidade as crianças costumam brincar com um jogo (de dois jogadores) onde:
      um jogador A define uma sequência de 10 letras usando: G, R e B (exemplo: G – G – G – R – B – R – B – B – B – R)
      um jogador B pode ler a sequência quantas vezes quiser
      o jogador B também pode dizer uma das letras e obter em quais posições a letra dada se encontra na sequência
      o jogador B também pode dar uma posição e saber qual letra ocupa a posição na sequência
      para finalizar, o jogador B deve dizer a sequência de letras, obtendo um ponto para cada acerto.
       
      Só consegui pensar nisso por enquanto.
       
      //identificar que letra ocupa esta posição na sequência:
      do{
      scanf(“%d”,&Posicao);
      Posicao=Posicao-1;}
      while ((Posicao<0)||(Posicao>9));
      printf(“%c”,Sequencia[Posicao]);
       
      //exibir sequencia
      for (Cont=0; Cont<=9; Cont++)
      printf(“%c”,Sequencia[Cont]);
       
      //exibir posições
      for (Cont=0; Cont<=9; Cont++)
      printf(“%d%c”,Cont+1,Sequencia[Cont]);
    • Por paulo.e.monteiro2015
      Boa noite,
       
      Possuo o seguinte array
      Array ( [0] => Array ( [0] => 564 [IdPergunta] => 564 [1] => 66 [IdQuiz] => 66 [2] => A EMS é líder no mercado farmacêutico há quantos anos? [DescricaoPergunta] => A EMS é líder no mercado farmacêutico há quantos anos? [3] => 1 [NumeroPergunta] => 1 ) [1] => Array ( [0] => 565 [IdPergunta] => 565 [1] => 66 [IdQuiz] => 66 [2] => A cada 100 medicamentos vendidos no Brasil 13 são de qual laboratório? [DescricaoPergunta] => A cada 100 medicamentos vendidos no Brasil 13 são de qual laboratório? [3] => 2 [NumeroPergunta] => 2 ) [2] => Array ( [0] => 566 [IdPergunta] => 566 [1] => 66 [IdQuiz] => 66 [2] => Qual medicamento controlado e lançamento dos Genéricos EMS é indicado para alívio de dores e possui formato de fácil deglutição? [DescricaoPergunta] => Qual medicamento controlado e lançamento dos Genéricos EMS é indicado para alívio de dores e possui formato de fácil deglutição? [3] => 3 [NumeroPergunta] => 3 ) [3] => Array ( [0] => 567 [IdPergunta] => 567 [1] => 66 [IdQuiz] => 66 [2] => Os Genéricos EMS possuem o maior portfólio do Brasil, com 195 moléculas, que atendem 96% das classes terapêuticas. Qual o número total de apresentações? [DescricaoPergunta] => Os Genéricos EMS possuem o maior portfólio do Brasil, com 195 moléculas, que atendem 96% das classes terapêuticas. Qual o número total de apresentações? [3] => 4 [NumeroPergunta] => 4 ) [4] => Array ( [0] => 568 [IdPergunta] => 568 [1] => 66 [IdQuiz] => 66 [2] => A EMS possui quantos anos de história? [DescricaoPergunta] => A EMS possui quantos anos de história? [3] => 5 [NumeroPergunta] => 5 ) [5] => Array ( [0] => 569 [IdPergunta] => 569 [1] => 66 [IdQuiz] => 66 [2] => Qual lançamento Genéricos EMS é o primeiro genérico do mercado indicado para o tratamento do Transtorno do Déficit de Atenção e Hiperatividade? [DescricaoPergunta] => Qual lançamento Genéricos EMS é o primeiro genérico do mercado indicado para o tratamento do Transtorno do Déficit de Atenção e Hiperatividade? [3] => 6 [NumeroPergunta] => 6 ) ) Preciso criar uma navegação item a item deste, para que possa dar a opção do usuário responder ao Quiz.
      Preciso muito desta ajuda pois tenho muita urgência em resolver isso. É só isso que falta para terminar o Quiz.
       
      Att.
    • Por markhosbh
      Prezados, boa tarde!
       
      Estou tendo dificuldades para transformar um retorno WebService em uma tabela HTML.
      A minha dificuldade está na seguinte condição, se fosse cabeçalho fixo bastava eu utilizar o foreach para percorrer o array e estava ok.
      Porém, a quantidade de campos do array de retorno não é fixo, aí que se encontra minha dificuldade, como fazer para ler e imprimir o cabeçalho e o conteúdo da tabela, sendo que essas informações podem variar.
       
      Exemplo:
       
      Requisição: 
      SELECT A1_COD, A1_NOME, TIPO FROM USUARIO  
      Retorno:
      [ {"A1_COD":"0093","A1_NOME":"JOAO","TIPO":"TITULAR"}, {"A1_COD":"0016","A1_NOME":"ABELARDO","TIPO":"TITULAR"}, {"A1_COD":"8586","A1_NOME":"ADRIANA","TIPO":"TITULAR"} ]  
      Array:
      Array ( [0] => Array ( [A1_COD] => 0093 [A1_NOME] => JOAO [TIPO] => TITULAR ) [1] => Array ( [A1_COD] => 0016 [A1_NOME] => ABELARDO [TIPO] => TITULAR ) [2] => Array ( [A1_COD] => 8586 [A1_NOME] => ADRIANA [TIPO] => TITULAR ) ) Quero que seja impresso em uma tabela html
       
      A1_COD A1_NOME TIPO 0093 JOAO TITULAR 0016 ABELARDO TITULAR 8586 ADRIANA TITULAR  
      Mas como informado o cabeçalho poderia variar, sendo a requisição por exemplo ser:
       
      SELECT * FROM USUARIO  
      Desde então agradeço.
    • Por lendadomato
      Pessoal,
       
      tenho uma aplicação que funcionava há muitos anos sem problemas, mas percebi que o meu servidor atualizou o PHP 5
      para PHP 7 sem me comunicar. Tenho uma função que contém alguns arrays e essa função parou de funcionar após a atualização.
      Gostaria saber se esse conjunto de arrays funciona dessa forma no PHP 7:
      $msg = array ( 'title' => 'Novo pedido', 'body' => $endereco, 'sound' => 'default' ); $fields = array ( 'to' => $tokenempresa, 'notification' => $msg ); $headers = array ( 'Authorization: key=' . API_ACCESS_KEY, 'Content-Type: application/json' ); Não entendo muito de PHP e não sei se esse código está correto.
       
    • Por gersonab
      há tempos utilizo para cadastrar data no BD a instrução :
      implode('-',array_reverse(explode('/',$data)))
      com isso no input posso colocar 09/02/2019 e no banco de dados grava 2019-02-09 , até ai sem problemas, porém ao atualizar um sistema para pdo, estou com problema no insert dinâmico, onde posso fazer 1 ou mais inserts, da forma abaixo cadastro quantos eu quiser :
      $sql = "INSERT INTO cantos ( id_t, id_c, data, ca, cant, po, des) VALUES (:id_t, :id_c, :data, :ca, :cant, :po, :des)";              $stmt = $pdo->prepare($sql);             foreach($_POST['idp'] as $indice => $valor) {             $stmt->bindParam(':id_t', $_POST['id_tor'][$indice], PDO::PARAM_STR);             $stmt->bindParam(':id_c', $_POST['idp'][$indice], PDO::PARAM_STR);             $stmt->bindParam(':data', $_POST['data'][$indice], PDO::PARAM_STR);             $stmt->bindParam(':ca', $_POST["ca"][$indice], PDO::PARAM_STR);             $stmt->bindParam(':cant', $_POST['cant'][$indice], PDO::PARAM_STR);             $stmt->bindParam(':po', $_POST['po'][$indice], PDO::PARAM_STR);             $stmt->bindParam(':des', $_POST['des'][$indice], PDO::PARAM_STR);                              if ($stmt->execute()){                     echo "Cadastrado com sucesso.";             }
      no entento a data vai no formato do input 09/02/2019.
      caso utilize :
      $stmt->bindParam(':data', implode('-',array_reverse(explode('/',$_POST['data'][$indice]))), PDO::PARAM_STR);
      tenho o erro Strict standards: "Only variables should be passed by reference in "que significa "Apenas as variáveis podem ser passadas por referência"
      qual a melhor forma de se fazer neste caso ?
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.