2016-03-09 38 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