1

可能重复:
仅 AJAX 访问

因此,我根据谁赢得了比赛来运行这些 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 文件后具有过期的“授权”时才实际执行。

在此先感谢,亚伦。

4

3 回答 3

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
  });
 }

赢.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');
}

?>
于 2012-04-19T02:24:23.000 回答
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 函数)

于 2012-04-19T02:13:11.690 回答
0

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

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

通常,当我想添加这样的某种限制时,我更喜欢在服务器端进行,因为它更容易控制,而其他人更难以操作。

于 2012-04-19T02:14:30.863 回答