PHP產生token防止表單重複提交2個例子

來源:互聯網
上載者:User

在網上搜尋了一下有很多站長都這樣說的

1、提交按鈕置disabled

當使用者提交後,立即把按鈕置為不可用狀態。這種用js來實現。
提交前代碼如下:

 代碼如下 複製代碼

$("#submit").attr('disabled','true');
$("#submit").val("正在提交,請稍等");

執行後,把按鈕置為原來狀態
代碼如下:

 代碼如下 複製代碼

$('#submit ').removeAttr('disabled');
$("#submit ").val("確定提交");

這樣只是針對一些簡單的前台提交了,如果我們自己做個表單站長提交給我們php邏輯層檔案就過濾這那個js了。

到期時間法

使用者提交按鈕後產生一個token(每次業務提交token 為唯一值)存入session,並設定到期時間。當使用者再此提交時,檢測token是否一致且是否到期,若一致且沒有到期,則認為提交了二次

例子

 代碼如下 複製代碼

<?php
/*
* PHP簡單利用token防止表單重複提交
* 此處理方法純粹是為了給初學者參考
*/
session_start();
function set_token() {
 $_SESSION['token'] = md5(microtime(true));
}

function valid_token() {
 $return = $_REQUEST['token'] === $_SESSION['token'] ? true : false;
 set_token();
 return $return;
}

//如果token為空白則產生一個token
if(!isset($_SESSION['token']) || $_SESSION['token']=='') {
 set_token();
}

if(isset($_POST['test'])){
 if(!valid_token()){
  echo "token error";
 }else{
  echo '成功提交,Value:'.$_POST['test'];
 }
}
?>
<form method="post" action="">
 <input type="hidden" name="token" value="<?php echo $_SESSION['token']?>">
 <input type="text" name="test" value="Default">
 <input type="submit" value="提交" />
</form>

方法二

 代碼如下 複製代碼

<?php
//開啟session
session_start();
//如果有提交標識
if(isset($_GET['action']) && $_GET['action'] === 'save'){

 //如果有session且跟傳過來的值一樣才算提交
 if(isset($_SESSION['__open_auth']) && isset($_POST['auth']) && $_SESSION['__open_auth'] == $_POST['auth']){
  print_r($_POST);
  $_SESSION['__open_auth'] = null;//清空
 } else {

  //走起
  header("location: post.php");
 }
 exit();
}

//授權
$auth = $_SESSION['__open_auth'] = time();

?>
<!doctype html>
<html>
<head>
 <meta charset="UTF-8">
 <title>post</title>
</head>
<body>
 <form action="post.php?action=save" method="post">
  <ul>
   <li>
    <input type="hidden" name="auth" value="<?php echo $auth;?>">
    <input type="text" name="userName">
   </li>
   <li>
    <input type="password" name="userpass">
   </li>
   <li>
    <input type="submit" value="走起">
   </li>
   <li>
    <?php echo time(); ?>
   </li>
  </ul>
 </form>
</body>
</html>

mysql php資料庫重複記錄防止

 代碼如下 複製代碼

<?php
$link=mysql_connect(‘localhost’,’root’,’1234’); //得到MySQL資料庫連接
$username=$_GET["name"]; //得到從用戶端表單傳過來的資料
$q="select * from usertable where user_name='$username'";
mysql_query("SET NAMES gb2312"); //避免出現中文亂碼
$rs = mysql_query($q, $link); //查詢資料庫
$num_rows = mysql_num_rows($rs); //得到查詢結果的總行數
if($num_rows==0)
// 烈火? liehuo.net 歡迎複製,拒絕惡意採集 liehuo.net
{
$exec="insert into student (user_name) values ($username)";
mysql_query("SET NAMES gb2312");
mysql_query($exec, $link); //若沒有此使用者則將資料插入到資料庫(註冊使用者)
echo "使用者註冊成功!";
}
else
{
echo "該使用者名稱已存在,請重新選擇使用者名稱!";
}
?>

session到期法有非常重要的一點是一個session設定與提交成功與不成功時的一個session驗證了,這個有點像登入一樣的如果登入成功了我們要清除session這個原理也差不多。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.