2016-03-09 32 views
1

我有一個相當具體的問題。調用REST API來在票據系統中創建問題的PHP腳本應該只能調用一次

我正在爲我們公司的員工註冊程序編寫一個應用程序。在多種形式的過程中,收集有關新員工需求的數據並將其輸入到MySQL數據庫中。

最後一步,一個PHP腳本獲取這些信息,並通過cURL在我們的JIRA票證系統(通過REST API)中創建多個票證。

執行cURL調用的網頁也在之後呈現結果,即鏈接到創建的票證。如果有人點擊一個鏈接,然後決定按下瀏覽器的「後退」按鈕,整個腳本將再次運行。

如何有效防止這種情況?我已經有了一些想法,但其中沒有一個看起來很合適:
- 在數據庫中創建更多信息,即每個故障單的狀態,然後在決定運行cURL調用之前查詢該信息。
- 不要讓按下後退按鈕,通過JS來達到腳本(實際上這個想法是完全垃圾,但我仍然會把它留在這裏)
- 不允許用戶調用腳本,而是讓表單發送一封電子郵件給我,信息已輸入,以便我可以自己運行腳本。每次...

我請你原諒這不是一個「確切」的問題,而是更多的最佳做法。雖然在我的愚見中,這是論壇所需要的,而不是你可以在任何文檔中閱讀的東西。

問候

+1

你可以使用一個頭的用戶從不會捲曲請求,做票 – RamRaider

+0

的顯示或者,正如你不能真正阻止頁面(接收響應後)腳本重定向離開用戶使用瀏覽器歷史來回移動,您可以在提交完成後設置會話值,並且如果該會話值存在,則不會處理curl請求,而是顯示與該會話值相關的任何記錄 – RamRaider

回答

1

只是一個想法 - 使用一個會話變量,以確保捲曲請求,只發生一次 - 你可以交替(或與會議同期舉行)存儲布爾反對他們的名字/用戶ID分貝來表示他們已經完成了這個過程。

<?php 
    if(!isset($_SESSION['curl_ticket'])){ 
     /* do the curl request */ 

     /* get response from request */ 

     /* set the session */ 
     $_SESSION['curl_ticket']=$some_id; 
    } 


    if(isset($_SESSION['curl_ticket'])){ 
     /* display ticket */  
    } 
?> 
+0

看起來不錯。實際上,我只需要DB中的一個值,因爲「創建所有票據腳本已被執行」。 如果發生錯誤,我有管理員的腳本,可以逐個創建每張票。 使用數據庫而不是會話進行操作也可以確保該腳本也不能由其他人執行,或者由於某種原因,同一個人在會話過期後返回。 – Holonaut