AJAX - > PHP不能一致地更新MySQL数据库

时间:2011-04-20 00:24:32

标签: php javascript mysql html ajax

所以这是我在Facemash风格网站上的早期尝试,在该网站中,用户将选择两个图像中的一个,使用所选图像(获胜者)得分,使用未选择图像得分(失败者) - 两者都是它们记录在MySQL数据库中。

使用javascript确定所选图像,并使用jquery AJAX通知更新数据库的PHP脚本(backend.php)。

这对于更新“点击”字段绝对正常。但是,“未命中”并未始终记录。我的意思是,当用户单击一个图像时,未单击其他图像的事实仅在数据库中显示有时。据我所知,没有关于“未命中”何时被记录的模式,因此难以确定问题所在。

我一遍又一遍地检查代码,无法理解为什么会发生这种情况或者对它负责什么,所以我认为最好发布所有内容。我很欣赏这一点,但是对于为什么我遇到这个问题的任何解释都将非常感谢,谢谢。

<html>
<head>
<title>Facemash</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.js"></script>
</head>
<body>
<?php
// Make a MySQL Connection
mysql_connect("localhost", "admin", "admin") or die(mysql_error());
mysql_select_db("facemash") or die(mysql_error());

// Select two random people
$personA = rand(1, 28);
$personB = rand(1, 28);

// Ensure that it is not the same person
if ($personB == $personA) {
   $personB = rand(1, 28);
}

// Function to return path of photo
function photoPath ($person){

$query = mysql_query("SELECT photo FROM people WHERE id=$person");
$result  = mysql_fetch_row($query);
$result = $result[0];

echo $result;
}
?>

<!--Image for personA-->
<div id=photoA identity="<?php echo $personA ?>"><img src="<?php photoPath($personA);?>"/></div>

<!--Image for personB-->
<div id=photoB identity="<?php echo $personB ?>"><img src="<?php photoPath($personB);?>"/></div>

<script type="text/javascript">
    $('#photoA').click(function() {
        var hit = $('#photoA[identity]').attr('identity');
        var miss = $('#photoB[identity]').attr('identity');
        $.post ("backend.php", {winner: hit} );
        $.post ("backend.php", {loser: miss} );
        location.reload(true);
    });

    $('#photoB').click(function() {
        var hit = $('#photoB[identity]').attr('identity');
        var miss = $('#photoA[identity]').attr('identity');
        $.post ("backend.php", {winner: hit} );
        $.post ("backend.php", {loser: miss} );
        location.reload(true);
    });
</script>
</body>
</html>

backend.php:

<?php
    // Make a MySQL Connection
    mysql_connect("localhost", "admin", "admin") or die(mysql_error());
    mysql_select_db("facemash") or die(mysql_error());

    // Recieve id of winner from index.php
    $winner = $_POST['winner'];
    // Recieve id of loser from index.php
    $loser = $_POST['loser'];

    // Lookup hits for winner and update by adding 1
    function updateHits ($winner) {
    $query = mysql_query("SELECT hits FROM people WHERE id=$winner");
    $result  = mysql_fetch_row($query);
    $result = $result[0];

    $result++;

    mysql_query("UPDATE people SET hits = $result WHERE id=$winner");
    }

    //Lookup misses for loser and update by adding 1
    function updateMisses ($loser) {
    $query = mysql_query("SELECT misses FROM people WHERE id=$loser");
    $result  = mysql_fetch_row($query);
    $result = $result[0];

    $result++;

    mysql_query("UPDATE people SET misses = $result WHERE id=$loser");
    }

    updateHits($winner);
    updateMisses($loser);
?>

再次感谢。

3 个答案:

答案 0 :(得分:1)

夫妻俩。

// Select two random people
$personA = rand(1, 28);
$personB = rand(1, 28);

// Ensure that it is not the same person
if ($personB == $personA) {
   $personB = rand(1, 28);
}

这看起来并不总能保证他们不是同一个人。第二个rand()的结果可以再次返回与$ personA

相同的值

不是先做两个查询来先选择未命中然后再增加它,为什么不把它作为一个查询?:

mysql_query("UPDATE people SET misses = misses + 1 WHERE id=$loser");

最后,在backend.php中,即使您只收到其中一个参数,也不要更新赢家和输家,而是执行if else:

if($winner) {
  updateHits($winner);
} else if ($loser) {
  updateMisses($loser);
}

我认为这将解决您的问题。

作为优化问题,您还应将两个POST合并为一个。

答案 1 :(得分:0)

尝试将两个功能更改为此功能,并查看它是否有效。 (如果不是,我会删除我的答案。)

    // Lookup hits for winner and update by adding 1
    function updateHits ($winner) {
    mysql_query("UPDATE `people` SET `hits` = hits + 1 WHERE `id`= '$winner'");
    }

    //Lookup misses for loser and update by adding 1
    function updateMisses ($loser) {
    mysql_query("UPDATE `people` SET `misses` = misses + 1 WHERE `id` = '$loser'");
    }

答案 2 :(得分:0)

这可能不会导致问题,但您只应该执行一个$ .post,并且不要在两个点击处理程序中复制相同的功能。

JS:

$('#photoA, #photoB').click(function() {
    var hit = $('#photoA[identity]').attr('identity'),
        miss = $('#photoB[identity]').attr('identity');
    $.post("backend.php", { winner: hit, loser: miss } );
    location.reload(true);
});