Как выявить изменение цены в столбце mysql таблицы и отобразить это на сайте при ajax запросе один раз?

Имеется скрипт, который обновляет базу данных раз в несколько минут.

Второй скрипт выводит актуальную информацию из базы данных на сайт.

Как на сайте отобразить визуально эффект изменения цены?

Т.е. допустим цена была 5000 рублей, страничка обновилась с помощью ajax но в базе цена уже 4500, как сообщить скрипту, что цена изменилась, чтобы визуально это оформить?

Предполагаю, что в базе нужно иметь 2 схожих таблицы или создавать временную таблицу и при выводе на сайт сравнивать значения в обеих таблицах.

Мне не ясен механизм данной затеи. Допустим в первой таблице 5000,а во вторую записалось новое значение в 4500, на сайте выведу. Что делать дальше при следующем обновлении ajax, ЧТО И С ЧЕМ СРАВНИВАТЬ... ведь цены будут разными и на сайте вновь и вновь будет визуальный эффект изменения цены, когда по факту изменения не было.

Помогите разобраться.

Задача: сохранять информацию о всех изменения в определенной таблице. Наиболее простое решение - создать таблицу, совпадающую по структуре с отслеживаемой и при каждом изменении писать в эту таблицу строку с обновленным состоянием измененной строки. Сделать это можно с помощью триггера, отслеживающего операции INSERT, UPDATE и DELETE.

Было изменение, строку записал и с чем мне сравнивать значения? Ведь UPDATE обновит основную таблицу и запишет данные во вторую и они будут идентичны.

Запутался...

<script type="text/javascript">
    function show()  
    {  
        $.ajax({  
            url: "ajax.php",  
            cache: false,  
            success: function(html){  
                $("#app").html(html);  
                $('.box').first().addClass('animate__animated animate__bounce'); //  $('.box').first().addClass('animate__animated animate__bounce');
            }  
        });  
    }  
  
    $(document).ready(function(){  
        show();  
        setInterval('show()',1000);  
    });  
</script>

Ajax html ответ

<tbody>
              <tr>
                <td>
                  <a href="https://site.ru">title</a>
                </td>
                <td>1000 <i class="ic-icon_rub"></i>
                </td>
                <td> 
                  <span class="xxx-text-bold">автор</span>
                </td>
                <td>id 3</td>
              </tr>
              
              <tr>
                <td>
                  <a href="https://site.ru">title</a>
                </td>
                <td>1000 <i class="ic-icon_rub"></i>
                </td>
                <td> 
                  <span class="xxx-text-bold">автор</span>
                </td>
                <td>id 4</td>
              </tr>
</tbody>

Для title нужно прописать class="box"

Можно изменить html я под него подстроюсь.


Ответы (1 шт):

Автор решения: Максим Степанов

Если задача состоит только в том, чтобы показать изменение цены на странице у клиента, то алгоритм может быть таким:

  1. Берем цену или массив цен о товарах со страницы.
  2. В отправляем ajax запрос, методом POST, суем ему массив с ценами, ид товаров и пр.
  3. На сервере сравниваем цены с базой, формируем массив с изменениями и отправляем обратно на страницу.
  4. Измененные цены подсвечиваем как-то.

И не нужно вторых таблиц

Ваш код может быть таким:

<?php 
// файл index.php 

// получаем массив товаров из базы (Select * FROM table и так далее). 
// Для примера я подготовлю данные, как будто получены из базы
$data = array(
    3 => array(
        'title' => 'товар3',
        'price' => 5000
    ),
    4 => array(
        'title' => 'товар4',
        'price' => 4500
    )
);
?>

<!-- теперь выводим этот массив -->
<table>
    <?php foreach($data as $id => $item){ ?>
    <tr>
        <td><?=$item['title']?></td>
        <td>
            <span class="price" data-id="<?=$id?>" data-price="<?=$item['price']?>"><?=$item['price']?></span>
        </td>
    </tr>
    <?php } ?>
</table>

<script>
    
window.addEventListener('load', function(){
    setInterval(updatePrices, 1000);
});

function updatePrices(){
    let prices = {};
    // найдем все элементы товаров по классу "price"
    $('.price').each(function(e, elem){  // здесь elem - это наш <span> с ценой
        prices[$(elem).data().id] = $(elem).data();
    });
    
    // теперь в массиве prices у нас:
    /**
    3: {item_price: 5000, item_id: 3}
    4: {item_price: 4500, item_id: 4}
    */
   
    $.ajax({
        url: 'ajax.php',
        type: 'POST',
        dataType: 'json',
        data: {client_prices: prices },
        success: function(jsonResponse){
            // здесь у нас в jsonResponse массив с обновленными ценами
            for(var id in jsonResponse){
                // находим на странице элемент c нужным значением атрибута data-id и меняем его цвет и содержимое
                $('[data-id='+id+']').css('color', 'red').html( jsonResponse[id]['price'] );
            }
        },
        error: function(jqXHR, status, msg){
            console.log(jqXHR); console.log(msg+' '+status); 
        }
    });
}
    
</script>

И примем данные на сервере:

// файл ajax.php

// получаем данные из аякса
$client_post_data = filter_input_array(INPUT_POST);
$client_prices = $client_post_data['client_prices'];

// берем цены из базы (как и на перовй странице, то же самое).
// получаем массив товаров из базы (Select * FROM table и так далее). 
// Для примера я подготовлю данные, как будто получены из базы, с измененной ценой "товар3"
$db_price = array(
    3 => array(
        'title' => 'товар3',
        'price' => 7000
    ),
    4 => array(
        'title' => 'товар4',
        'price' => 4500
    ),
);

$changed_prices = array();

// сравниваем цены:        
foreach ($client_prices as $id => $client_price){
    if($client_price['price'] != $db_price[$id]['price']){
        $changed_prices[$id]['price'] = $db_price[$id]['price'];  // если цена не совпадает, сохраняем новую из базы
    }
}

// теперь в массиве $changed_prices только те цены, которые изменены
// отправляем его:
echo json_encode($changed_prices);
→ Ссылка