PHP ve MySQL üzerinde yeni bir eyleme izin vermek için 30 saniye bekleyin?

5 Cevap php

In my web page a user fill a form who send information to a MySql database. One of the data inputs sent is a date/time, in the format date('l jS \of F Y h:i:s A'); (I can change the format as needed)

Kullanıcı formu gönderdiğinde Yani gerçek zaman / tarih formun teslim izin veya amacıyla gönderilen, zaman / tarih 30 saniyeden daha fazla olup olmadığını kontrol etmek istiyorum. Teşekkürler!

5 Cevap

Böylece gibi bir şey var ...

<form action="wtv.php" method="POST">
    <input type="hidden" name="date" value="<?php echo date('l jS \of F Y h:i:s A'); ?>" />
    <input type="submit" />
</form>

... Ve kullanıcı, 'tarih' girişin değeri en az 30 saniye önce gelen olup olmadığını kontrol etmek istiyorum 'submit' üzerine tıkladığında?

Ken Keenan gibi bir şey önerir ile bu yapabileceğini ... ama sorun, istemci girişi güvenmiyor olabilir. Jeroen cevabı üzerine yorumunuzda istemci betik güvenilmez bir farkındalık olduğunu gösterir, ancak bu komut dosyası ile sınırlı değil; Gerçekten hiç kimse fazla 30 saniye istedikten sonra bu formu göndermek, böylece bu güvenli olması gerekiyorsa <form>, başka bir şey yapmak zorunda.

Sorun ne sunucu "tarih" girdi beklediğini öngörülebilir olmasıdır; Ben senin <form> ziyaret ve Firebug açmak hatta HTML belgeyi kaydedin ve not defteri açın, ben <input /> yüzden güncellemek için nasıl oldukça kolay tahmin edebilirsiniz Ben gönderebilirsiniz.

Bunun yerine bir simge kullanın.

Rasgele benzersiz, rastgele kimlik bir tür oluşturmak ve oturum veya veritabanında depolamak ...

$unique = md5(uniqid()).md5(time()); // there are better ways to get a unique random ID
$_SESSION['tokens'][$unique] = time();

Ardından token (değil tarih / saat!) Dahil <form> ...

<form action="wtv.php" method="POST">
    <input type="hidden" name="token" value="<?php echo htmlentities($unique); ?>" />
    <input type="submit" />
</form>

... Ve o belirteci süresi 30 saniyeden daha az uzakta olduğunu kontrol gönderin.

<?php
    // partially borrowed from Ken Keenan's answer...
    if((time() - $_SESSION['tokens'][$_POST['token']]) > 30) {
        echo "Time's up!";
    } 
?>

Siz (ne olursa olsun kendi tarih formatı, sadece sunucu üzerinde time() sonucunu saklamak) ve gönderdiğiniz üzerinde herhangi bir işlem yapmadan önce bu değişken ayarlanmış olup olmadığını kontrol edin, bir oturum değişkeni teslim süresini saklayabilirsiniz.

Eğer tarayıcı tarafında göndermek vermemek istiyorsanız, javascript gerekir.

örneği (netlik için aşırı ayrıntı):

<?php
    session_start();

    if (isset($_SESSION['submit_time']))
    {
         if ($_SESSION['submit_time'] >= (time() - 30))
         {
             die();
         }
    }
    $_SESSION['submit_time'] = time();
?>

Ben doğru anlamak, 30 saniye sonra "sona" bir form oluşturmak istiyor?

I şeklinde gizli bir öğe oluşturmak olacaktır:

<input name="current_time" type="hidden" value="<?php echo time(); ?>"

Form gönderildiğinde zaman sonra bu kontrol edebilirsiniz:

<?php
if((time() - $_POST['current_time']) > 30) {
  echo "Time's up!";
} 
?>

Ayrıca form gönderimini kontrol etmek JavaScript kullanarak istemci üzerinde bunu yapabilirdi - ama bu müşterinin saati sunucuya göre kabaca doğru olmasına bağlıdır olacaktır ...

Eğer datetime bir metin sürümü saklamak ısrar ederseniz, ben de size datetime datetime versiyonunu saklamak öneririz. Daha sonra karşılaştırmalar kolaydır.

Javascript olmadan, sunulması hala olur, ancak sizin işlem komut gibi bir UPDATE sorgu kullanıyorsa

UPDATE mytable SET wordydatetime='$dayofmonthyearhourminutesecond' 
WHERE realdatetime< DATE_SUB(NOW(), INTERVAL 30 SECONDS) AND record_id=$x;

çok yeni ise güncelleştirme başarısız olur.

ETA:

Sadece bir güncelleme daha yapmak için daha karmaşık işleme varsa, hızlı bir SELECT formu işleme devam edip etmeyeceğini belirlemek izin verir:

SELECT record_id FROM mytable 
  WHERE record_id=$x 
    AND realdatetime< DATE_SUB(NOW(), INTERVAL 30 SECONDS);

Geri hiçbir kayıt alırsanız, bu formu işleme alınmayacaktır gerektiği anlamına gelir.

Kolayca mysql tarih olacak alarak bu yapabileceğini unix_time. Sonra mktime() ile bir ekleme açıklama yapardı.

Bu unix zaman ikinci bir sayım olduğu gibi 30 saniye içinde yapılabilir olup olmadığını kontrol etmek kadar yoluyla kolay değildir. Yani sadece görevde (), mktime bir sayı karşılaştırma yapmak, ve 2. görevde mktime (), çıkarma, sonucu> 30 ise, gerekiyor neyse.

Example: (istenen)

sizin tabloda TARİH / SAAT değeri için, veritabanına girdiği ilk INSERT yapmak mktime sonucunu kullanmak ()

kullanıcı tekrar göndermek için çalışırsa, post olup olmadığını kontrol edin (ya da son giriş, ne olursa olsun), tarih olsun (: '12456771411 'Bu unix zaman formatında ex olacaktır).

Geçerli unixtime almak ve onunla bir şeyler yapmak

$time = mktime();
if($time - $row['date'] > 30){
 allow them to post
} else {
 30 seconds didn't pass.. etc;
}