我有一些客户端代码,它使用3个php页面来:
- 向最终用户提供CCD_ 1链接的长列表
- 基于所选链接(和传递的参数)更新数据库,以及
- 确认更新
现在,忽略了这样一个事实:是的,这不是使用表单,是的,使用get更新表本质上是错误的,多重更新存在问题。
+----------+ +----------+ +----------+
| 1 ' | | 2 ' | | 3 ' |
| '| | '| | '|
| | ----> | | -----> | |
| list.php | | book.php | | conf.php |
| | | | | |
| | | | | |
| | | | | |
+----------+ +----------+ +----------+
|
|
v
+-----------+
| Update DB |
+-----------+
由于DB(它是FileMaker)的性质,预订页面(book.php
)可能需要一段时间才能更新。可以理解的是,用户的不耐烦导致他们在点击list.php
上的链接后刷新页面,因此在进入cons.php
之前在表中进行多次更新(实际上是新记录)。
我想不通的是如何防止这种情况发生。
我尝试了各种方法,(这里的问题是我不能使用表单!)我认为最有效的方法是从参数中的list.php
传递一个随机密钥,然后在book.php
中启动一个会话,检查该密钥是否已经在会话变量中,如果忽略它,如果没有在会话变量中将其设置,然后运行更新。然而,我似乎无法让它发挥作用。
有什么想法吗?
更新
原来我写的代码在Apache上本地有效,但在IIS上无效!!?
list.php
<?php
// list.php
session_start();
$key = time();
echo "<h2>List of Urls</h2>";
echo '<p><a href="book.php?key='.$key.'&booking=1">Book 1</a></p>';
echo '<p><a href="book.php?key='.$key.'&booking=2">Book 2</a></p>';
echo '<p><a href="book.php?key='.$key.'&booking=3">Book 3</a></p>';
echo '<p><a href="book.php?key='.$key.'&booking=4">Book 4</a></p>';
echo "<p>Time page rendered was $key</p>";
echo "<pre>";
print_r($_SESSION);
echo "</pre>";
?>
book.php
<?php
// book.php
session_start();
if( isset($_SESSION['key']) && $_SESSION['key'] == $_GET['key'] ) {
header('Location: conf.php?error=doubleclicked');
} else {
if( isset($_GET['key']) ) {
$_SESSION['key'] = $_GET['key'];
}
header('Location: conf.php?key='.$_GET['key'].'&booking='.$_GET['booking']);
}
?>
conf.php
<?php
// conf.php
session_start();
echo "<pre>";
print_r($_GET);
echo "</pre>";
?>
考虑到所有无法正确修复的限制,我会在list.php
页面上使用AJAX和模式覆盖,以防止用户点击book.php
链接,除非他们首先重新加载list.php
。
类似于:
$("a").on("click", function(){
$("#dialog").show();
$.ajax({url: $(this).attr('href')})
.done(function() {window.location.href="conf.php"})
return false;
});
<a>
0覆盖显示类似"请等待,不要重新加载。"
如果您可以使用jquery,您可以尝试以下操作:
在列表顶部.php:
<style>
.loading
{
width:100%;
height:100%;
position:fixed;
z-index:200;
background-image: url('http:// droppicture.com/images/loading/loading-03.jpg');
background-position: center top;
background-repeat: repeat;
opacity: 0.2;
}
<div class="loading" style="display: none" id="loading" ></div>
页面底部:
$('#YOUR_LINK_ID').click(function(e){
$('#loading').attr('style','display: block');
});