Ir ao conteúdo

Posts recomendados

Postado

Boas Malta,

 

Estou tendo um problema com o chamar da DB com o SELECT.

Preciso de fazer chamar o EMAIL, TIME_TS e o USERNAME, e que o TIME_TS faça a contagem dos 30 dias até ao dia 0.

 

Deixo o código aqui

<?php if($account->vip) : ?>
                   
<?php 
function setTimeout($fn, $timeout){
  // sleep for $timeout milliseconds.
  sleep(($timeout/8000));
  $fn.'()';
}

// Some example function we want to run.
function someFunctionToExecute(){
  $result = $database->query('SELECT * FROM `users` WHERE `user_id`=$user_id');
  while($row = $result->fetch_assoc()) {
    $time_vip = $row["time_vip"];
    $user_email = $row["email"];
    $username = $row["username"];
  }
  if($time_vip>0){
    $database->query('UPDATE `users` SET `time_ts`= $time_vip WHERE `user_id` = $user_id');
  }else{
    $emailContent = file_get_contents('emails/ts_information_users.html', true);

    $emailContent =  str_replace("{{RESEND-ACTIVATION-EMAIL-CONTENT}}",$language->resend_activation->email->content,$emailContent);
    $emailContent =  str_replace("{{RESEND-ACTIVATION-EMAIL-CONTENT-USER}}",$language->resend_activation->email->contentUser,$emailContent);
    $emailContent =  str_replace("{{RESEND-ACTIVATION-EMAIL-CONTENT-ACTIVATE}}",$language->resend_activation->email->contentActivate,$emailContent);
    $emailContent =  str_replace("{{RESEND-ACTIVATION-EMAIL-CONTENT-FOOTER}}",$language->footer_emails->footer,$emailContent);
    $emailContent =  str_replace("{{EMAIL}}",$user_email,$emailContent);
    $emailContent =  str_replace("{{RESEND-ACTIVATION-USERNAME}}",$username,$emailContent);

    $profile_account->vip == 0;		
    sendmail($user_email, $language->resend_activation->email->title, $emailContent);
  }

}

// This will run the function after a 3 second sleep =>
// We're using an anonymous function to wrap the function
// which we wish to execute.
setTimeout(function(){
  someFunctionToExecute();
}, 1000*3600*24);
?>

<?php else : ?>

<font color="#0C9620"><?= $language->store->vip->limit ?></font>

<?php endif; ?>

O problema é que ele não está actualizar o TIME_TS na DB nem fazer chamar o EMAIL e USERNAME..

 

Porque isto é, quando a pessoa clica no botão buy, supostamente seria para  ficar a fazer uma contagem de 30 dias até ao dia 0, e quando chegasse ao dia 0, enviasse um email ao user.

 

Deve existir um problema com

function setTimeout($fn, $timeout){
  // sleep for $timeout milliseconds.
  sleep(($timeout/8000));
  $fn.'()';
}

Porque se eu deixar esse código aberto, a página fica em looping e não para com o refresh.

 

Obrigado.

 

Abraço

  • Moderador
Postado

@Joob Seria muito mais fácil se você usar um plugin jQuery chamado  Jquery Countdown ou algo parecido.

 

Estes plugins fazem uma contagem regressiva e acionam um evento.  No caso você quer que envie um e-mail.  Então, quando chegar a zero a contagem regressiva, você acionaria uma função em ajax onde, faz a requisição assíncrona para um arquivo php que contem a classe phpmailer e envia o e-mail.

  • Curtir 1
Postado

Boas @DiF, bem jogado, por acaso deu para ver uns exemplos fixes.. vou tentar ver uns com mysql/php..

O problema seria em implementar no código..

adicionado 36 minutos depois

Dei aqui um olho a isto .. http://www.bestjquery.com/?d9CIT9rv

Seria algo tipo isto.. mas o que queria era passar de horas para 30 dias..

 

Como poderia implementar para fazer a chamada do "function someFunctionToExecute()"

  • Curtir 1
  • Moderador
Postado

@Joob Quando eu estava na faculdade, usei este plugin jquery countdown keith-wood quando desenvolvi a aplicação de minha monografia.

 

Se você procurar na aba callbacks, vai ter um exemplo de chamada do evento quando expirar o  tempo.

Um dos parâmetros do plugin é onExpiry  que é justamente o que você precisa usar para chamar a função de envio!

 

Vou dar um breve exemplo de uma função para ajax.

 

$('#buy_btn').on('click', function(e){
       e.preventDefault();
       $('#contador').countdown({until: liftoffTime, onExpiry: sendEmail ,format: 'dHMS'});
       

});

function sendEmail(){
     //aqui você pode pegar o e-mail do cliente do cadastro dele.
     var clientEmail = '[email protected]';

     $.ajax({
             url: 'processData.php',
             data: {email: clientEmail } 
           }).done(function(callback){
                 $('msg-callback').html(callback)    
           }).fail(function(callback){
                  $('msg-callback').html(callback)    
           });
}

Lembre, que isto é apenas um exemplo. Você precisa estudar ele e adaptar a sua necessidade. A lógica não vai fugir disso.

O arquivo processData.php  vai receber o e-mail e fará um envio com a classe phpmailer.

O retorno desta classe,  no caso, se foi enviado ou não é devolvido naquela variável "callback" que está contido na função html().  Que é responsável por imprimir em tela, dentro do elemento desejado.

 

Boa sorte.

 

  • Curtir 1
Postado

Boas @DiF obrigado pela resposta mais composta.

Em relação ao sendmail, não é preciso porque já tenho ele incorporado, é só preciso mesmo de usar aquelas funções e ele faz o envio.

 

Já arranjei um código bacano para a contagem dos 30 dias e funciona tranquilo.

A questão é colocar ele a contar os 30 dias, a partir do dia em que se clicou no botão (e não de uma data especifica), neste caso estou a usar "<a href....." e seria para inserir na base dados automaticamente.

 

<script>

  /*
					 * Basic Count Down to Date and Time
					 * Author: @guwii / guwii.com
					 */
  (function (e) {
    e.fn.countdown = function (t, n) {
      function i() {
        eventDate = Date.parse(r.date) / 1e3;
        currentDate = Math.floor(e.now() / 1e3);
        if (eventDate <= currentDate) {
          n.call(this);
          clearInterval(interval)
        }
        seconds = eventDate - currentDate;
        days = Math.floor(seconds / 86400);
        seconds -= days * 60 * 60 * 24;
        hours = Math.floor(seconds / 3600);
        seconds -= hours * 60 * 60;
        minutes = Math.floor(seconds / 60);
        seconds -= minutes * 60;
        days == 1 ? thisEl.find(".timeRefDays").text("Day Left") : thisEl.find(".timeRefDays").text("Days Left");
        hours == 1 ? thisEl.find(".timeRefHours").text("hour") : thisEl.find(".timeRefHours").text("hours");
        minutes == 1 ? thisEl.find(".timeRefMinutes").text("minute") : thisEl.find(".timeRefMinutes").text("minutes");
        seconds == 1 ? thisEl.find(".timeRefSeconds").text("second") : thisEl.find(".timeRefSeconds").text("seconds");
        if (r["format"] == "on") {
          days = String(days).length >= 2 ? days : "0" + days;
          hours = String(hours).length >= 2 ? hours : "0" + hours;
          minutes = String(minutes).length >= 2 ? minutes : "0" + minutes;
          seconds = String(seconds).length >= 2 ? seconds : "0" + seconds
        }
        if (!isNaN(eventDate)) {
          thisEl.find(".days").text(days);
          thisEl.find(".hours").text(hours);
          thisEl.find(".minutes").text(minutes);
          thisEl.find(".seconds").text(seconds)
        } else {
          alert("Invalid date. Example: 30 Tuesday 2013 15:50:00");
          clearInterval(interval)
        }
      }
      var thisEl = e(this);
      var r = {
        date: null,
        format: null
      };
      t && e.extend(r, t);
      i();
      interval = setInterval(i, 1e3)
    }
  })(jQuery);
  $(document).ready(function () {
    function e() {
      var e = new Date;
      e.setDate(e.getDate() + 60);
      dd = e.getDate();
      mm = e.getMonth() + 1;
      y = e.getFullYear();
      futureFormattedDate = mm + "/" + dd + "/" + y;
      return futureFormattedDate
    }
    $("#countdown").countdown({
      date: "5 September 2018 12:30:00", // Change this to your desired date to countdown to
      format: "on"
    });
  });

</script>

<style>
  #countdown {
    text-align: center;
  }
  #countdown p {
    display: inline-block;
    padding: 2px;
    background: #151515;
    margin: 0 0 20px;
    border-radius: 3px;
    color: white;
    min-width: 1.6rem;
  }
</style>

<span id="countdown">
  <p class="card-text days"></p>
  <p class="card-text timeRefDays"></p>
  <!--<p class="hours">00</p>
<p class="timeRefHours">hours</p>
<p class="minutes">00</p>
<p class="timeRefMinutes">minutes</p>
<p class="seconds">00</p>
<p class="timeRefSeconds">seconds</p>-->
</span>

 

E estou a usar assim no php.. mas não estou a conseguir fazer chamar do jquery para o php etc..

 

<?php 		
                     						
// Some example function we want to run.
function someFunctionToExecute(){

$call_email_username_byusers = "SELECT username, email FROM users WHERE user_id = $user_id";
$result = $database->query($call_email_username_byusers);

if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
$username = $row["username"];
$user_email = $row["email"];
}
} else {
echo "0 results";
}
$call_time_ts = "INSERT INTO users (time_ts) VALUES (?)";
$result = $database->query($call_time_ts);
while($row = $result->fetch_assoc()) {
$time_ts = $row["time_ts"];
}
if($time_ts>0){
$database->query("DELETE `users` SET `time_ts` = $time_ts WHERE `user_id` = $user_id");
$profile_account->teamspeak_vip == 0;
}else{
$emailContent = file_get_contents('emails/ts_information_users.html', true);

$emailContent = str_replace("{{TS-INFO-USERNAME}}",$language->ts_information->email->username,$emailContent);
$emailContent = str_replace("{{TS-INFO-UNDER-USER}}",$language->ts_information->email->under_user,$emailContent);
$emailContent = str_replace("{{TS-INFO-CONTENT}}",$language->ts_information->email->content,$emailContent);
$emailContent = str_replace("{{TS-INFO-FOOTER}}",$language->footer_emails->footer,$emailContent);

$emailContent = str_replace("{{USERNAME}}",$username,$emailContent);
$emailContent = str_replace("{{USER-EMAIL}}",$user_email,$emailContent);
$emailContent = str_replace("{{USERNAME-TS}}",$username_ts,$emailContent);
$emailContent = str_replace("{{UID-TS}}",$uid_ts,$emailContent);

sendmail($user_email, $language->resend_activation->email->title, $emailContent);

}

}

?>

 

Não sei se deu para entender bem.

 

 

Abraço

  • Moderador
Postado

@Joob Pois então, o jeito que você está fazendo é bem mais complicado e com mais linhas de código para tentar entender.

 

3 horas atrás, Joob disse:

Em relação ao sendmail, não é preciso porque já tenho ele incorporado, é só preciso mesmo de usar aquelas funções e ele faz o envio.

Creio que você ainda não entendeu o lance.

Aquela função "sendEmail()"  serve apenas para fazer a chamada do arquivo php que contem o seu código de envio de e-mail NO php. 

 

É por ele que você acessa o php para enviar o e-mail. 

 

 

Vou tentar explicar com mais detalhes algumas linhas:

 

$('#buy_btn').on('click', function(e){

Esta linha.  Executa a ação de quando clicar no botão de comprar.

 

$('#contador').countdown({until: liftoffTime, onExpiry: sendEmail ,format: 'dHMS'});

Esta linha.  É do contador regressivo com o plugin jquery que mencionei.

O elemento de contagem é #contador isso você pode trocar por qualquer outro que estiver usando.

countdown() é a função que faz a contagem.  Ela leva 3  parâmetros:

  • until: liftoffTime
  • onExpiry: sendEmail
  • format: 'dHMs

O primeiro é relacionado ao tempo completo. Se quiser algo menor teria que usar o "Shorty"

O segundo é relacionado a execução de uma função qualquer quando o tempo regressivo acabar

O terceiro é relacionado ao formato do contador. se vai ter horas, minutos, segundos, dias... e etc.

Nesse exemplo ele apresenta os dias junto com horas neste formato:  "dia Hora Minuto segundo"

 

 

A função  sendEmail() foi criada para disparar uma requisição assíncrona a um arquivo PHP. Que é o que você quer. Passar ao PHP instruções para envio de um e-mail, no caso, o e-mail do cliente.  Este e-mail você pode pegar de várias formas, desde fazer ele escrever o e-mail, como pegar da sua base de dados e/ou de uma sessão no PHP.

 

O jquery, possui uma função especial para ajax que é o $.ajax()  esta função é necessária para fazer o jquery  "conversar " com o seu PHP.

 

Perceba que nele o arquivo php chamado  processData.php  seria o seu PHP  que postou mais acima que recebe os dados para envio do e-mail. No caso é o e-mail do usuário.

 

Você vai enviar o e-mail do jquery ao PHP pelo método POST e recuperar ele lá no PHP com post.

 

Exemplo:

<php
     $clientEmail = $_POST['email'];
     
     
     //agora que você já tem o e-mail do usuário enviado ao php
    //Basta usar uma função de envio.

Eu recomendo muito que você não use a função nativa do php, porque é bem ruim.  Por isso, minha sugestão é que use a classe PHPmailer  para enviar o e-mail.

 

Vai por mim, já usei desta forma e funciona e supre bem a sua necessidade, com poucos códigos!

 

 

'

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!