The background: Ok, I run a legacy BBG over at ninjawars.net. There is an "attack" that players can make on other players that is initialized via form post. Essentially, we can simplify the situation to pretend that there's a page, lets call it attack.php, with a giant "ATTACK" form post that submits to another php page, lets call it accept_attack.php, ve the second page performs the attack functionality, lets say killing other player 1, 2, or 3. The server runs PHP5, Postgresql, Apache
Sorunlar:
- Ben o büyük "ATAK" düğmesine basın, ve accept_attack.php bana getirirse, o zaman arkaya tekrar üç kere saldırı, her zaman resubmitting, üç kez yenileyebilirsiniz vurabilir.
- Ben üç İlk sayfanın sekme ve her sayfada vurmak saldırı kadar açarsanız, ben tek seferde oyuncular 1, 2, ve 3, öldürmek üç anlık saldırıları ile sona, ve ben sadece sürekli tekrarlamak için yenileyebilirsiniz.
- Veritabanına kurtulur bir "En son saldırı" zamanlayıcı var benim girişimlerine rağmen, oyuncuların hepsi aynı almak, böylece, belki de sadece bir senkronize yeterli şekilde üç nüsha sekme tazeleyerek, etrafında çalışmak mümkün gibi görünüyor böylece zamanlayıcı (örn. 10:00:00:0000 am) ve çıkan işleme devam edin.
Çözüm gerekli:
Peki nasıl üçlü olarak tek seferde önceden olmaktan belli bir senaryonun aynı işlenmesini önlemek?
Php, Sosyal mühendislik ve / veya javascript / jQuery çözümleri (muhtemelen bu siparişle ilgili olarak) tercih.
Edit: Based on the answers, here's what I did to (potentially, before stress testing) solve it: The session answer seemed simplest/most comprehensible to implement, so I used that data store. I tested it ve it seems to work, but there may be ways around it that I'm not awvardır of.
$recent_attack = null;
$start_of_attack = microtime(true);
$attack_spacing = 0.2; // fraction of a second
if(SESSION::is_set('recent_attack')){
$recent_attack = SESSION::get('recent_attack');
}
if($recent_attack && $recent_attack>($start_of_attack-$attack_spacing)){
echo "<p>Even the best of ninjas cannot attack that quickly.</p>";
echo "<a href='attack_player.php'>Return to combat</a>";
SESSION::set('recent_attack', $start_of_attack);
die();
} else {
SESSION::set('recent_attack', $start_of_attack);
}
Eğer orada olduğunuzu geliştirmek için yollar veya (şeyler yankılanan mantığını iyi ayrılığının olduğunu bana bariz bir, ben bilmek isterim ötesinde. Yararlanılabilir olduğunu yolları bu satırları, toplum-wiki-ed Along .