Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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

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

  • Conteúdo Similar

    • Por ILR master
      Boa tarde, pessoal.
      Espero que todos estejam bem.
       
      Seguinte:
      Tenho a seguinte consulta:
       
      $usuarios= "SELECT * FROM usuarios";
      $query= mysqli_query($conexao, $usuarios) or die ("Usuário não encontrado");
      $usuario = mysqli_fetch_array($query);
       
      Quero pegar apenas o campo 'nome' da tabela 'usuarios' e colocar todos os resultados da seguinte forma:
       
      $nomes = array("Rafael", "João", "Maria", "Pedro", "Patricia", "Camila");
       
      Agradeço desde já.
      Abs
       
       
    • Por mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
    • Por mateus.andriollo
      Existe uma forma de fazer um IF na select e comparar com Array de dados?
       
      algo como
       
      Select if( in_array(idCliente,'1,2,3,4,5')=true,'Tem','Não') ) as cliente Não consigo usar inner ou where pois esse resultado do array é algo q tem varias regras...
       
      Precisava saber se existe uma função assim em MySQL
    • Por clovis.sardinha
      Bom dia.
      Meu problema é o seguinte:
      Estou fazendo uma tabela e preciso mostrar o usuário e várias cidades que pertencem a este usuário.
      O resultado do array é o seguinte:

      Quando passo para a tabela os valores de cidade se repetem para o mesmo usuário até o final e retorna fazendo o mesmo para o próximo usuário. 
      Veja abaixo

       
      Meu código para a tabela é a seguinte:
      <tr> <td align="left"><?php echo $usuario['nome'] ?></td> <td align="left"><?php echo $usuario['nome_orgao'] ?></td> <td align="left"><?php echo $usuario['nome_funcao'] ?></td> <?php foreach($destinos as $key=>$destino):?> <?php $key=0;?> <td align="left"> <?php foreach($destino as $chave=> &$cidade): ?> <?php echo $cidade['cid_nome']."-";?> <?php endforeach;?> </td> <?php $key+=$key; ?> <?php endforeach;?> <td><?php echo date('d/m/Y', strtotime( $usuario['created_at'])) ?></td> <td align="left"><a href="<?php echo base_url('UserAdmin/Usuario/getUsuarioById')."/".$usuario['id_user'] ?>">DETALHES</a></td> </tr> <?php endforeach ?> Onde estou errando? O que tenho de fazer para percorrer este array de modo a aparecer apenas as cidades pertencentes a cada usuário?

    • Por Giovanird
      Listo um array pelo foreach e preciso pegar os valores fora do foreach.
      Abaixo tenho o exemplo do foreach com os valores
       
      <?php foreach($turma $rsturma): if(($rsturma['id'] == 1){ echo $rsturma['nome']."<br>"; echo $rsturma['idade']."<br><br>"; } endforeach; //Dentro do foreach me retorna: Luis 13 Maria 12 Carlos 12 Matheus 14 Andréa 12 //Preciso pegar a posição e o valor desta lista $posicao1 = 1; $nome1 = Luis; $posicao2 = 2; $nome2 = Maria; $posicao3 = 3; $nome3 = Carlos; $posicao4 = 4; $nome4 = Matheus; $posicao5 = 5; $nome5 = Andréa;  
×

Informação importante

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