Ir ao conteúdo
  • Cadastre-se

PHP Problema com SELECT/UPDATE da DB + Contagem 30 Dias


Posts recomendados

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

Link para o comentário
Compartilhar em outros sites

  • Moderador

@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
Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

  • Moderador

@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
Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

  • Moderador

@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!

 

 

'

Link para o comentário
Compartilhar em outros sites

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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!