Получение самого актуального значения из БД на PHP после сохранения в БД с использованием AJAX. БЕЗ перезагрузки страницы

Я создаю фиктивный сайт Flickr, где вы можете оценивать фотографии, нажимая на 1-10 звезд. Когда страница загружается, она создает объект для фотографии и устанавливает его значения на основе записи в базе данных, соответствующей его идентификатору. Когда вы наводите курсор на звезды, они загораются (от 1) до звездочки с цифрой, на которой находится ваш курсор, обозначая ваш рейтинг. Когда вы нажимаете на звезду, он отправляет рейтинг (через AJAX) и обновляет базу данных, а затем устанавливает звезды, чтобы отразить новый рейтинг.

Проблема заключается в том, что если вы наведете курсор на звезды, а затем уберете их мышью (не нажимая ни на одну из них), то загоревшиеся звезды отражают рейтинг фотографии при первоначальной загрузке страницы, а не текущий рейтинг (на основе рейтинги, зарегистрированные с помощью AJAX, когда пользователь нажимает на звездочку).

База данных обновляется, звезды отражают правильный рейтинг сразу после AJAX-вызова (поскольку я вызываю ту же функцию в конце AJAX-вызова, что и с onmouseout, stars_current_rating(rating)). Единственное отличие заключается в том, что в конце вызова AJAX я передаю xmlhttp.responseText в качестве параметра. И в onmouseout я передаю (то, что я пытаюсь получить) самый последний рейтинг в базе данных для этой фотографии.

onmouseout="stars_current_rating(<?php echo Photograph::find_by_id($_GET['id'])->rating?>);" 

Моя логика, стоящая за этим вызовом, заключается в предположении, что я получаю новый рейтинг, который был сохранен в базе данных, найдя его и передав новый рейтинг в stars_current_rating(...). Единственная проблема заключается в том, что onmouseout передает исходный параметр рейтинга, который был извлечен из БД при загрузке страницы, а не новое значение в БД (что и делает функция sql find_by_id())... Вот код, который обрабатывает отображение звезд.

        <div id="rating" class="rating">
        <?php 
            for($i=1; $i<11; $i++){
        ?>
        <a id="rating_star<?php echo $i ?>" href="#" onmouseover="decide_rating(<?php echo $i ?>);" 
        onmouseout="stars_current_rating(<?php echo Photograph::find_by_id($_GET['id'])->rating?>);" 
        onmousedown="set_rating(<?php echo $photo->id.", ".$i ?>);">
        <img id="star<?php echo $i ?>" class="rating_star" src=
        <?php 
            // Sets up stars with initial rating in db when page is first loaded
            if($photo->rating >= $i){ 
                echo "images/assets/rating_star.png";
            } else {
                echo "images/assets/rating_star_off.png";
            }
        ?>
        />
        </a>
        <?php } ?>

    </div>

Любая помощь или понимание будут оценены для получения более подробной информации по вопросу, нажмите на ссылку ниже для исходного вопроса.

Исходный вопрос со всеми код и конкретные детали


person Alan DeLonga    schedule 05.10.2012    source источник


Ответы (1)


Вы можете использовать свою функцию set_rating, чтобы изменить функцию onmouseout.. что-то вроде этого

function set_rating(photo_id,rating) {
    //do your ajax or whatever here, don't need to change anything

    //we need some way to select all the 'rating_star' links
    for(var i=1, i<11; i++) {
        var star = document.getElementById('rating_star' + i);

        //overwrite the current mouseout function with a new one,
        // providing the new current rating

        star.onmouseout = function() {
            stars_current_rating(rating);
        }
    }
}
person Brian Glaz    schedule 05.10.2012
comment
Файлы PHP анализируются сервером и преобразуются в HTML, который представляет собой обычный текст. Если бы вы посмотрели на сгенерированный код своей страницы, вы бы увидели, например, просто onmouseout="star_current_rating(4)". Вы не можете ничего обновить в PHP после загрузки страницы, потому что она уже преобразована в HTML. - person Brian Glaz; 06.10.2012
comment
Я никогда не думал об этом, я получил ответ на другой странице, чтобы попытаться создать глобальную переменную javascript для сохранения значений. Я думаю, что я не понимал, что функции событий мыши не обновляли значения. Спасибо за быстрый ответ, я очень ценю это. - person Alan DeLonga; 06.10.2012