Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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.
>
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();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](http://php.net/manual/pt_BR/book.pdo.php)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.
>
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](http://php.net/manual/pt_BR/book.pdo.php)
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.
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?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) " " }Cade sua Primary key?
No meu exemplo tem o 'id'....
Só abstrair brother, cade seu script completo?
$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'];
}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]
....
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 = []; $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-assoc.php)
[http://php.net/manual/pt_BR/function.mssql-fetch-row.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 ;)
Veja se da uma luz...
[