AJAX -> PHP не обновляет базу данных MySQL последовательно - PullRequest
2 голосов
/ 20 апреля 2011

Итак, это моя ранняя попытка создать сайт в стиле 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 ]

1 голос
/ 20 апреля 2011

Пара вещей.

// 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 if:

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

Я думаю, что это решит ваши проблемы.

В целях оптимизации вам также следует объединить два своих POST в один.

0 голосов
/ 20 апреля 2011

Это, вероятно, не вызывает проблемы, но вы должны сделать только один $ .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);
});
0 голосов
/ 20 апреля 2011

Попробуйте изменить две свои функции на это и посмотреть, будет ли это работать.(Если этого не произойдет, я просто удалю свой ответ.)

    // 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'");
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...