php 如何在页面刷新时不重复操作数据库?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php 如何在页面刷新时不重复操作数据库?相关的知识,希望对你有一定的参考价值。

做了一个网站libertyreserve的接口。实现网站会员通过接口充值后,返回相关数据到网站,在数据库中更新该会员的账户余额。

现在的做法是:
1、在网站上放置充值表单,点击提交到libertyreserve的支付页面。
2、支付完成后,跳转到支付成功页面success.php
3、success.php接受会员信息和充值信息,更新数据库。

(由于支付接口暂时不能用真实数据测试,我是直接将充值表单页面提交到success.php,在success.php中充值金额等信息直接用具体的值代入,来模拟接收到的数据)。

碰到的问题是:
1、如果按以上操作,到达success.php后,更新了数据库,但是每刷新一次页面,都会重复更新一次数据库。
2、使用页面重定向,支付成功后将success.php 重定向到suceess.html页面。
这是刷新页面不会碰到问题,但是如果直接在浏览器里输入success.php打开,每打开一次就又会出现重复更新数据库了。

这个该如何解决???

因为现在的测试都只是模拟的。不知道支付接口的网站是不是已经解决了这个问题,
在网上看到的方法是对表单页面处理,我想这个表单应该是对应支付页面的那个表单,他是属于libertyreserve接口网站的,我没法改?????

这个问题首先是你自己设计导致的,想要避免也得改变你的设计,比如一种方式:可以将“直接在浏览器里输入success.php”设计为不能直接访问,以下是其中的两个实现方式。
1.将success.php放到一个不能直接访问的web路径下,在apache中.htacess可以控制访问。
2.控制可以自己来实现,设定一个参数,如果没有该参数则表示不能访问。
不知道是不是你想要的。追问

正好是我刚刚想到的,禁止直接通过地址栏访问。 这个回答也正好提供了方案,是我想要的。

有一个疑惑就是,支付成功以后,需要跳到success.php这个页面,来接受数据和执行数据库操作。如果success.php 页面设置了不能直接访问,会不会使success.php的数据库操作就不能执行了????

参考技术A 看了个大概,提供一个思路,在页面中使用验证码,在执行任何动作前检查验证码,在验证码检查过后立即使其过期,这样你刷新时验证码就变了,就不会通过验证码检查,自然就不能执行后续代码了. 参考技术B 可以用cookie控制 参考技术C 跳转

php - 刷新页面后会话丢失[重复]

【中文标题】php - 刷新页面后会话丢失[重复]【英文标题】:php - session lost after refreshing page [duplicate] 【发布时间】:2014-08-16 04:31:47 【问题描述】:

所以我正在为我的网站开发一个登录系统,我想在用户登录时更改导航栏,但我无法让它工作,因为在我刷新页面以更新导航栏。这是我在 login.php 脚本中得到的:

if ($loginNumRows == 1) 
   echo 'true';
   session_start();
   $_SESSION['username'] = $loginRow['name'];

当这回显“true”时,将加载以下 javascript:

if (html == 'true') 
    window.location.href = "index.php";

我尝试使用“location.reload(true);”它仍然是一样的。在导航栏所在的主页中,我进行了以下检查:

<?php if (isset($_SESSION))
            ...

但是,这总是返回 false。任何想法该怎么做?谢谢!

【问题讨论】:

你把session_start();放了吗 session_start() 必须在每个访问的页面中,最好在脚本的开头。 @Lix 我在索引页上说的是 将 session_start() 放在页面顶部。 【参考方案1】:

首先,不需要 javascript 将您重定向到索引页面。你也可以用 PHP 来做:

header("Location: index.php");

所以 login.php 将如下所示:

if ($loginNumRows == 1) 
   session_start();
   $_SESSION['username'] = $loginRow['name'];
   header("Location: index.php");

请注意,我已更改顺序。与其他人一样,我强烈建议将 session start 置于所有代码之上

最后确保你已经在 index.php 文件中启动了会话(这也应该放在你所有的代码之上):

session_start();

编辑:如果您想坚持使用您的 javascript 方法(我强烈不推荐),那么您的 login.php 代码应该如下所示:

if ($loginNumRows == 1) 
   session_start();
   $_SESSION['username'] = $loginRow['name'];
   echo 'true';

【讨论】:

【参考方案2】:

如前所述,我首先将 session_start() 放在页面上的所有其他代码之上,而不是在条件语句中。

【讨论】:

【参考方案3】:

确保所有脚本的顶部都有session_start();

【讨论】:

以上是关于php 如何在页面刷新时不重复操作数据库?的主要内容,如果未能解决你的问题,请参考以下文章

PHP避免刷新页面重复提交

如何在php页面中刷新iframe [重复]

php 如何避免刷新页面重复插入数据到数据库

php 使用history.go();window.location.reload();返回页面刷新后会提示‘如图’不想再重复提交一次怎么办

vue-router复用组件时不刷新数据

php 如何防止表单重复提交呢