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にアクセスできるようにする方法を正確に知りたいです。または、php ファイルのロード後に有効期限が切れる「承認」がある場合にのみ、win.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
  });
 }

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

?>
于 2012-04-19T02:24:23.000 に答える
0

http://mysite.com/win.php?id=1PHPを使用して、次のような値を持つ非表示の入力を使用するだけのページに移動すると想定されています

<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']

おそらく、コンテスト用に DB で一意の名前を使用している場合は、関数を実行して新しいデータを挿入する前に、クエリでその名前が存在することを確認することもできます。

クエリ チェックを実行するには、各コンテスト名に一意の 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 で、win.php の関数の代わりに新しい関数 checkContest() (またはそれが入っているハンドラ ファイル) を呼び出します (新しい関数は成功した場合にのみ win.php 関数を呼び出すため)。

于 2012-04-19T02:13:11.690 に答える
0

win.php ファイルを winA() に対して 1 回だけ実行し、winB() に対して 1 回だけ実行する場合、各関数からの AJAX 呼び出しで渡すデータ オブジェクトに、どの関数を識別するかを特定する追加のプロパティを追加できます。から来ました (例: func: "A")。

次に、win.php で、winA または winB が勝ったかどうかを追跡する必要があります。それはセッション変数である可能性があります。または、「コンテスト」と「勝った」という 2 つのフィールドと 2 つの行 (winA 用に 1 つ、winB 用に 1 つ) を持つ小さなテーブルをデータベースに作成することもできます。どちらかの関数によって win.php が初めて呼び出されたときは、「勝った」列を更新し、その後の呼び出しでは最初にその列をチェックし、それが null でない場合は、コンテストが既に勝っていることを知り、残りの win.php 処理をスキップします。 .

一般的に、このような何らかの制限を追加したい場合は、サーバー側で行うことを好みます。これは、制御がやや簡単で、他の人が操作するのがより難しいためです。

于 2012-04-19T02:14:30.863 に答える