阻止页面刷新更新PHP中的表-通过<;a>;链接而不是表单


Prevent page refreshes updating a table in PHP - via <a> link and not a form

我有一些客户端代码,它使用3个php页面来:

  1. 向最终用户提供CCD_ 1链接的长列表
  2. 基于所选链接(和传递的参数)更新数据库,以及
  3. 确认更新

现在,忽略了这样一个事实:是的,这不是使用表单,是的,使用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');
});