php mysql 重复提交数据_如何真正解决表单重复提交问题php代码

如何真正解决表单重复提交问题php代码

过去一切时代的精华尽在书中。以下是小编为大家搜索整理的如何真正解决表单重复提交问题php代码,希望能给大家带来帮助!更多精彩内容请及时关注我们应届毕业生考试网!

以前用的js表单防止重复提交方法

代码如下

var checkSubmitFlg = false;

function checkSubmit() {

if (!checkSubmitFlg) {

// 第一次提交

checkSubmitFlg = true;

return true;

} else {

//重复提交

alert("Submit again!");

return false;

}

}

//以下三种方式分别调用

这样如果我直接做一个表单,然后提交给/test,上面代理就是一个摆设了,那我们要如何解决此问题

如果您已经知道如何解决的话那么这篇文章可能不适合你的口味,paperen这里也打算从基础开始讨论,所以希望一步看到解决方案的您也可能不太适合,所以请注意。So~开始吧 ~

paperen想您一定知道表单是什么吧,form元素就是表单,一般网页需要输入的地方必定使用了表单元素,也很常见,一般的代码如下:

代码如下

method="post">

随便输入点什么www.45it.com

重点其实是form与input元素,p元素只是paperen私自加上去的,对后续的说明没有任何影响,其实很简单,所谓input就是输入了,你可以完全将input 元素理解为是用作用户输入,只是某些属性的(type)不能作为输入而已(这里就是submit),而form元素你完全可以将它理解为是一个袋子,将所有用户输入数据到装在它里面之后用 来提交回服务端处理,但对于form元素值得注意的是method属性,一般来说有get与post两种方法,其实不要想得太复杂(因为深入的不需要太理解,对于后续的内容没有太多关系,如 有兴趣不妨可以使用浏览器的调试工具查看请求头部信息与发送信息,例如firebug),表现出来就是,使用get提交表单的话所有的input元素的值将会在地址栏处出现,而post则不会, 例如使用get提交此表单后的浏览器地址栏

代码如下

http://localhost/mytest/token/form.php?data=test&submit=%E6%8F%90%E4%BA%A4

post则在 地址栏看不到了,使用fiebug可以看到如下信息

可以简单认为get是显式传送数据的,而 post则是隐式传送数据的,但还有一个很大区别的是post支持更多更大的数据传送。

Next,当表单代码写好了,那么让我们来进行服务器脚本的编写(这里就是PHP)。很简单 ~

代码如下

if ( isset( $_POST['submit'] ) ) {

//表单提交处理

$data = isset( $_POST['data'] ) ? htmlspecialchars( $_POST['data'] ) :

'';

//Insert or Update数据库

$sql = "insert into test (`string`) values ('$data')";

//do query

echo $sql;

}

?>

因为这里是post传送数据的,所以使用PHP的$_POST全局变量就能获取到表单提交的数据,所有使用post方法的表单数据提交到服务端都会被保存在这个$_POST全局变 量中,不妨可以试试print_r( $_POST )这个变量你就明白了。

首先检查一下是否在$_POST数组里面存在submit,如果存在则证明是表单提交过来的,正如asp.net中好像有个 叫ispostback的一样,只是这样没那么严谨而已,但是不要紧之后会解决这个问题的。

之后接收输入框的数据,就是$_POST['data'],别忘了使用htmlspecialchars对这个进 行一下html过滤,因为防止输入了html标签或javascript造成问题(貌似叫做XSS漏洞)。最后就是拼接到sql语句中送入数据库跑了(只是这里paperen并没有很详细使用一些操作数据库的 函数例如mysql_query,有兴趣自己完成它)。恭喜,到了这里你已经顺利地完成了一个数据录入的功能了,但是有个地方你总得改善吧,插入数据后总得给操作者一个提示吧~~至少提示 我操作失败还是成功。所以整个代码paperen写成以下样子。

代码如下

if ( isset( $_POST['submit'] ) ) {

//表单提交处理

$data = isset(

$_POST['data'] ) ? htmlspecialchars( $_POST['data'] ) : '';

//connect

mysql_connect( 'localhost', 'root', 'root' );

//select db

mysql_select_db( 'test' );

//设置字符集防止乱码

mysql_query( 'set names "utf8"' );

//SQL

$sql = "insert

into `token` (string) values ('$data')";

//query

mysql_query( $sql );

$insert_id = mysql_insert_id();

if (

$insert_id ) {

$state = 1;

} else {

$state = 0;

}

}

?>

&& $state ) { //数据插入成功 ?>

插入成功 返回

作 ?>

随便输入点什么

name="data" id="test" />

html的声明与head还有body都省略了,对比于一开始的代码其实主要是实现了真正插入数据库动作与给出 了操作反馈(通过$state变量),不妨自己拷贝代码然后试试(当然请根据自己实际情况修改数据库操作部分的代码)。代码正常,逻辑没问题,但是有个问题,就是在显示插入成功后再刷新页 面又会执行了表单处理动作,又插了一遍数据!这就是所谓的重复插入问题。在放出解决方案之前您可以自己思考一下该如何解决。

你会不会认为是接收数据与显示处理结果都是 这个页面所以才会导致这个问题?也对,也可以这么认为,使用一些调试工具你会发现,浏览器还对post的数据进行了保留,故在提交完表单后再刷新的话该post数据会重新提交了一遍。

如果有办法将浏览器的这个临时保存的post数据清空掉不就解决问题了,但服务端是没法 做到这点的,因为这是浏览器自身的事情,要么我们就重定向了不然再刷新还是会重复提交数据。

到目前为止也许你已经了解到重复提交的意思与问题的恶劣所在,如果 你不是选用重定向的`办法那么就得另外想一个办法了,所以令牌解决办法就是这么过来的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PHPMySQL是Web开发的两个基本工具之一,它们可以协同工作来为开发人员创建功能强大的Web应用程序。PHP是一种自由开源的服务器端脚本语言,它可以与HTML一起使用来创建动态网站。MySQL是一个流行的开源关系数据库管理系统,广泛用于网站的数据存储和管理。 PHPMySQL的开源代码意味着它们都是免费使用的,并且可以在各种操作系统上运行。开发人员可以自由地修改源代码以满足他们的特定需求。这使得PHPMySQL成为非常受欢迎的Web开发工具,因为它们不仅能够提供广泛的功能,并且可以根据需要进行定制。 通过PHPMySQL的组合,开发人员可以创建高度交互的Web应用程序。PHP提供了一些强大的功能,如表单验证、用户注册和登录、文件上传等等,而MySQL提供了强大的数据库管理功能,例如数据分析、数据备份和恢复,以及轻松深入了解数据的SQL查询。 此外,PHPMySQL还有众多的框架和库可供开发人员使用,使得Web开发变得更加容易。这些工具提供了一些常用的功能,如密码加密、支付集成和电子邮件发送等,从而释放出了许多开发人员的时间和资源,使得他们能够更集中地关注应用程序的核心业务逻辑。 综上所述,PHPMySQL的源代码为Web开发提供了一个强大的基础,使得开发人员能够革新并创造出卓越的Web应用程序。通过使用这些工具,我们可以更加关注应用程序的核心业务逻辑,同时使得开发过程更加简单,高效,易维护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码代码的六月

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值