仅允许PHP文件使用之前网页的“授权”运行

时间:2012-04-19 02:04:58

标签: php ajax

  

可能重复:
  AJAX only access

所以我根据谁赢得了比赛,运行了这些javascript函数。

function winA() 
{
var x = "<?php echo $id;?>"
$.ajax({ url: 'win.php' ,
         data: { id: x }
   }); 
}

function winB() 
{
var val = "<?php echo $i;?>"
$.ajax({ url: 'win.php' ,
         data: { id: val }
   }); 
}

文件win.php更新了赢得胜利的MySQL。让我烦恼的是,如果有人只是去

http://mysite.com/win.php?id=1

并刷新它很多次我明显会在MySQL服务器上得到一些不正确的结果。

我想知道如何制作它以便只有在适当时才能通过此ajax调用访问URL。或者将win.php文件设置为仅在加载php文件后“授权”到期时实际执行。

先谢谢你,Aaron。

3 个答案:

答案 0 :(得分:1)

您可以使用会话,从我的评论中扩展:

主要游戏页

<?php
session_start();

//Do game....

//Decide Winner

$_SESSION['winner']='A'; //or B depending on who won

?>

然后是一个带有空白参数的AJAX请求,只是因为won.php被触及

function win(){
  $.ajax({
    url: "win.php",
    cache: false
  }).done(function(html){
   //Dont do anything or you could get a response from the won.php request an update something
  });
 }

<强> Win.php

<?php
session_start();

if(isset($_SESSION['winner'])){
    $winner=$_SESSION['winner'];
    //Do update ect

    //Unset Winner session var, by unsetting the user would need to play the game again to get it set
    unset($_SESSION['winner']);
}else{
    header('Location: ./index.php');
}

?>

答案 1 :(得分:0)

在页面上使用PHP,假设将您带到http://mysite.com/win.php?id=1,只需使用值为

的隐藏输入
<input type="hidden" name="verify">

在开头的http://mysite.com/win.php?id=1页面上添加类似

的内容
if (isset($_POST['verify'])) {
   // perform what you want
} else {
   header("Location: wherever/you/want");
}

除非已设置隐藏的$_POST['verify'],否则页面将无法运行。

也许如果您在数据库中使用唯一名称进行竞赛,您也可以在运行函数之前检查它是否存在以插入新数据。

要运行查询检查,我们假设每个比赛名称都有唯一的ID或名称。我们将比赛A'id 1'称为比赛并假设它是您桌上的主键。运行查询以检查该ID,如下所示:

function checkContest() {
  $connection = // your connection info;
  $query = "SELECT *
            FROM table
            WHERE id = '1'";

  $result = $connection -> query($query);

  if ($result -> num_rows > 0) {
     // end function
  } else {
     // call the function that contains the INSERT query
  }

然后在你的ajax中,你调用新函数checkContest()(或它所在的处理程序文件)而不是win.php中的函数(因为新函数只在成功时调用win.php函数)

答案 2 :(得分:0)

假设您希望win.php文件仅针对winA()运行一次,而仅针对winB()运行一次,则可以向您从每个函数传递的AJAX调用中传递的数据对象添加一个额外的属性,识别它来自哪个函数(例如:func:“A”)。

然后在win.php中,您需要跟踪winA或winB是否已获胜。这可能是一个会话变量,或者您可以在数据库中创建一个小表,其中包含2个字段 - “竞争”和“赢”,以及2行(一个用于winA,一个用于winB)。 win.php第一次被任何一个函数调用,你更新“won”列以及你先检查该列的任何后续调用,如果它不是null,那么你知道竞赛已经赢了并跳过win.php处理的其余部分

一般来说,当我想添加某种类似的限制时,我更倾向于使用服务器端,因为它更容易控制,而其他人则难以操作。