Доброго времени суток пытаюсь динамично подгрузить новые записи из БД. Записей одновременно может быть около 20, но добавлять их могут из разных мест. Хочу реализовать следующим образом: 1, при загрузке страницы получить в массив1 все id из таблицы 2, передать массив1 ajaxом скрипту обработчику 3, обработчик снова попросит все id и запишет их в массив2 4, сравнит массив1 и массив2 и запишет в массив3 все, чем они отличаются 5, массив3 переберется циклом и вернет на изначальную страницу новые записи Проблема заключается в том что бы когда сформируется массив2 и получит текущие id из БД как присвоить его значение массиву1 который находился на изначальной странице, что бы при следующем запуске функции, массив1 снова можно было бы сравнивать с вновь сформированым массивом2.
есть массив PHP: $all_id в котором находятся все id из таблицы далее пропускаю через функцию PHP: $ser_id = serialize( $all_id ); что бы передать ajaxом массив затем передаю обработчику Код (Javascript): function comp() { var out ='<?php print_r($ser_id); ?>'; $.ajax({ type: 'POST', url: 'http://site.ua/comp.php', data: {out:out}, success: function(data) { $("#results").html(data); }, error: function(xhr, str){ alert('Возникла ошибка: ' + xhr.responseCode); } }); } setInterval(comp, 2000); обработчик: PHP: <?php require('header.php'); $comp = mysql_query("SELECT `o_id`,`cl_name`,`cl_tel`, `from`.`loc_name`, `to`.`loc_name`, `date` FROM `orders` JOIN `loc` AS `from` ON `start_from` = `from`.`loc_id` JOIN `loc` AS `to` ON `go_to` = `to`.`loc_id` ORDER BY o_id DESC;"); $un_id = unserialize($_POST['out']); $all_orders = array(); while($r=mysql_fetch_array($comp)) { array_push($all_orders, $r['0']); } if ($all_orders !== $un_id) { $result = array_diff($all_orders, $un_id); } ?> и дальше идет вывод тех записей которых нет на странице, все проблема в том что бы переписать значение изначального массива PHP: $all_id значением массива PHP: $all_orders что бы при следующем запросе учитывались уже выведенные записи и не выводились снова
Почему бы хранение списка айдишников не отдать клиенту? И не надо ничего на стороне пыха будет сериализовать/разворачивать. И простая фильтрация - выбрать все, кроме тех, что прислали в запросе. И простое обслуживание - при чтение ответа от апи просто закидываем идентификаторы в массив, который потом можно почти без дополнительной обработки использовать при последующих запросах. Я мысль правильно понял?
я разве про код сказал что то? попросил подробней рассказать если не трудно, но раз вы думаете что я прошу у вас код, то лучше не нужно
может с высоты опыта это покажется не очень разумным решением, но на сколько хватает знаний так и пытаюсь сделать, в вопросе написано: "пытаюсь динамично подгрузить новые записи из БД"
А куда подробнее-то? Ну давай конечно попробую. Мне не жалко. У тебя в базе есть таблица, в которой у кортежа есть уникальный идентификатор. Для решения задачи ты будешь делать выборку либо всех строк - если пришел пустой запрос, либо "кроме таких-то айдишников" - если пришел список каких-то айдишников. Полученный список не нуждается в дополнительной фильтрации и сразу отправляется клиенту в качестве ответа на его запрос. На клиентской стороне ты сначала объявляешь объект/массив (кому как удобнее дрочить. Мне вот левой рукой) который будет сохранять известные айдишники. Далее ты делаешь запрос на получение данных, указывая содержимое своего списка айдишников. Поскольку это первый старт - список пустой. Поскольку список пустой - сервер вернет все записи (см выше). Ответ же от сервера разбирается в цикле и первым делом айдишник кортежа записывается в список известных. Далее уже та обработка, которая требуется для "новой записи" - новой в контексте данной страницы, ибо до этого такой записи не было на странице. Всё.
@Zaratustra ajax-ом отправляешь id последнего полученного элемента и запрашиваешь из базы все строки, у которых id больше последнего. Всё правильно. Все так делают. Знания приходят по чуть чуть, чтобы ты успевал их переваривать
ну в общем получилось, храню все на клиенте, спасибо за ответы, но вот Ganzalу культурней думаю стоит быть или хотя бы постараться
нет, я же написал "храню все на клиенте", до этого пытался хранить все на сервере. при первом обращении спрашиваю сервер для получения всех id, записываю их как строку в js, при последующих запросах ajax ом отправляю эту строку POSTом, делаю массив, сравниваю с вновь сформированым, и его же значение записываю вновь в js строку дабы при следующем запросе сравнивать уже ее, пришлось поморочится т.к. на странице записи по клику удаляются (а по факту переносятся в архивную таблицу) с возможностью тут же вернуть ее обратно, и немного из за этого ajax бунтовал. Теперь проблема в том что бы когда один залогиненый пользователь удалил запись что бы она удалялась для всех или когда один пользователь работает с записью всем остальным работать с ней запрещено
@Zaratustra, как и что строить - это твоё личное дело. Но я же тебе описал предельно простой подход. И его описание почти влезло в одну строку: Это проще реализовать и это не даёт ненужной нагрузки на сервер. Еще раз, это твоё личное дело, но всё же))
Просто на странице запись можно удалить и сделать это может любой пользователь, и их можно удалять по несколько за раз, так же их можно и вернуть, при возврате из таблицы архива а актуальную заявке присваивается автоинкрементом следующий айди, его я дописываю в js переменную дабы скрипт не считал ее новой, получается нужно держать в переменной актуальные айди. Задумка в том что бы при удалении, добавлении, изменении, это все менялось у всех пользователей без перезагрузки. На данный момент вижу что по неопытности пошел не тем путем изначально, не подскажете каким способом этот реализовать, а то я затрудняюсь даже что в поисковике писать)
На сколько понимаю, у тебя в БД отдельная таблица для удаленных сообщений. Делать это не обязательно. Можно добавить в таблицу сообщений столбец в котором будут значения 1 и 0. 1 - отображать, 0 - нет. А вообще - зачем восстанавливать?
да, таблица отдельная, сделано для упрощения, архивные записи будут накапливаться и что бы не бегать по ним каждый раз и в поисках активных они переносятся, а восстановить можно для облегчения, запись по сути заявка и что бы не дублировать одно и тоже нажимается восстановить и она возвращается в статус активных без повторного заполнения формы. Но сейчас думаю просто отводить какое то время для возможности возврата не перенося а архив, таймером что ли, и если не вернулась в активные скриптом переносить для упрощения.
Для фиксации изменения кортежа можно воспользоваться стандартными средствами СУБД - добавить поле datetime и в его атрибутах выбрать on update current_timestamp и дефолтным значением - current_timestamp. Тогда при вставке или обновлении записи - значение этого поля будет автоматически меняться. Фильтр выборки поменять на "больше чем присланная дата". На стороне клиента нам уже больше не надо будет держать список айдишников. Нужно будет только максимальное время запоминать. При старте это будет ноль. При отправке нуля на сервер фильтр "больше чем присланная дата (больше чем ноль)" вернет все имеющиеся записи. Приняв их в цикле сравниваем значение и записываем в переменную. При последующих запросах значение будет не нулевым и фильтр будет отбирать только строки которые добавились или изменились. --- Добавлено --- Удаленную запись на время отмечать нулем в статусе активности как предлагает @TeslaFeo чтоб клиенты могли увидеть факт удаления записи и скрыть со страницы. Ну и кроном раз в месяц/неделю/день перетаскивать в архив удаленные месяц/неделю/день и более назад