To mention the fields whose date is ending, you should compare the date with a deadline, in order to know if the field should be present in the email. Let's assume that the deadline is 10 days for clarity of response.
Compare dates
The simplest way is to convert the date contained in the field to the Unix timestamp and the current date + 10days using the strtotime () while checking:
// teu campo menor
// que daqui a 10 dias
// ↑
// │
// converter a data │ converter a data de
// do teu campo da BD │ hoje mais 10 dias
// ┌────────────┴────────────┐ ┌┴┐ ┌─────────┴─────────┐
if ( strtotime($row["teuCampo"]) < strtotime("+10 days") ) {
// fazer algo porque tem menos de 10 dias
}
From the example above, you can make several types of comparisons to see if your date is what you want.
As long as you have the code to run within if(xx){ /* código aqui*/ }
you are already creating the limitation you want.
Applying to Your Case
In your code, you have several fields that appear to be dates, for each one you want to verify, you should proceed with the example below:
Comparison
Let's compare and create the text for the email only if the date is to end in the next 10 days:
while ($row = mysql_fetch_array($validade)) {
// inicio do teu código
/* COMPARAR */
// iniciar variável a vazio
$AlvaraValidadeHTML = '';
// verificar se o valor de $row[2] é menor que daqui a 10 dias
if ( strtotime($row[2]) < strtotime("+10 days") ) {
$AlvaraValidadeHTML = '<p>A validade do Alvará vai terminar no dia: '.$row[2].'</p>';
}
// resto do teu código
}
Attach to email body
We construct the body of the email in the way we want and apply the variables that contain the message for each document in the desired location.
If they contain a value resulting from the comparison made, they will appear, if not, they are empty and it is as if they were not there:
$PHPMailer->Body = "
<body>
<p>
<strong>
Faltam 10 dias para terminar um ou mais documentos do $Nome
</strong>
</p>
".$AlvaraValidadeHTML."
".$AcidenteValidadeHTML."
".$SeguroValidadeHTML."
</body>";
Note: HTML formatting for the email you have in question is incorrect, you should not have more than a body
tag.
Optimization
If you're actually going to do a lot of comparisons of expiring dates, it's best to create a function to avoid repeating code:
/**
* Está para expirar ?
*
* Verifica se determinada data vai expirar até ao número de dias fornecido.
*
* @param string $data A data a verificar
* @param integer $dias Número de dias no futuro
*
* @return $boolean Verdadeiro ou falso
*/
function estaParaExpirar($data, $dias) {
return ( strtotime($data) < strtotime("+".$dias." days") );
}
while ($row = mysql_fetch_array($validade)) {
$id = $row[0];
$Nome = $row[1];
// se está para expirar dentro de 10 dias, recebe o texto, caso não fica vazio.
$AlvaraValidade = estaParaExpirar($row[2], "10") ? '<p>A data do alvará vai expirar no dia '.$row[2].'</p>' : '';
$AcidenteValidade = estaParaExpirar($row[3], "10") ? '<p>A data do acidente vai expirar no dia '.$row[3].'</p>' : '';
$SeguroValidade = estaParaExpirar($row[4], "10") ? '<p>A data do seguro vai expirar no dia '.$row[4].'</p>' : '';
// ... e continua nos restantes campos...
// no corpo email é a mesma coisa que já te apresentei em cima.
Note: The function is very simple, created to make things easier in this particular case, it always expects to receive a date in the first parameter and a number (days) in the second parameter . To use the function in other scenarios, it should confirm if the date is even a date and not "garbage" and if the number of days is even a number.