За последние 24 часа нас посетили 17756 программистов и 1685 роботов. Сейчас ищут 1047 программистов ...

Как перезаписать значение массива?

Тема в разделе "PHP и базы данных", создана пользователем Zaratustra, 9 фев 2017.

  1. Zaratustra

    Zaratustra Новичок

    С нами с:
    9 фев 2017
    Сообщения:
    9
    Симпатии:
    0
    Доброго времени суток пытаюсь динамично подгрузить новые записи из БД. Записей одновременно может быть около 20, но добавлять их могут из разных мест. Хочу реализовать следующим образом:
    1, при загрузке страницы получить в массив1 все id из таблицы
    2, передать массив1 ajaxом скрипту обработчику
    3, обработчик снова попросит все id и запишет их в массив2
    4, сравнит массив1 и массив2 и запишет в массив3 все, чем они отличаются
    5, массив3 переберется циклом и вернет на изначальную страницу новые записи

    Проблема заключается в том что бы когда сформируется массив2 и получит текущие id из БД как присвоить его значение массиву1 который находился на изначальной странице, что бы при следующем запуске функции, массив1 снова можно было бы сравнивать с вновь сформированым массивом2.
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Показывай наработки.
     
    denis01 нравится это.
  3. Zaratustra

    Zaratustra Новичок

    С нами с:
    9 фев 2017
    Сообщения:
    9
    Симпатии:
    0
    есть массив
    PHP:
    1. $all_id
    в котором находятся все id из таблицы
    далее пропускаю через функцию
    PHP:
    1. $ser_id = serialize( $all_id );
    что бы передать ajaxом массив

    затем передаю обработчику
    Код (Javascript):
    1.     function comp() {
    2.    
    3.  
    4. var out ='<?php print_r($ser_id); ?>';
    5. $.ajax({
    6. type: 'POST',
    7. url: 'http://site.ua/comp.php',
    8. data: {out:out},
    9. success: function(data) {
    10. $("#results").html(data);
    11. },
    12.  
    13. error: function(xhr, str){
    14. alert('Возникла ошибка: ' + xhr.responseCode);
    15. }
    16. });
    17.  
    18.         }
    19.  
    20. setInterval(comp, 2000);
    обработчик:
    PHP:
    1. <?php
    2. require('header.php');
    3.  
    4. $comp = mysql_query("SELECT `o_id`,`cl_name`,`cl_tel`, `from`.`loc_name`, `to`.`loc_name`, `date` FROM `orders`
    5. JOIN `loc` AS `from` ON `start_from` = `from`.`loc_id`
    6. JOIN `loc` AS `to` ON `go_to` = `to`.`loc_id` ORDER BY o_id DESC;");
    7.  
    8. $un_id = unserialize($_POST['out']);
    9.  
    10. $all_orders = array();
    11. while($r=mysql_fetch_array($comp))
    12. {
    13. array_push($all_orders, $r['0']);
    14. }
    15.  
    16.  
    17. if ($all_orders !== $un_id) {
    18. $result = array_diff($all_orders, $un_id);
    19.  
    20. }
    21. ?>
    и дальше идет вывод тех записей которых нет на странице, все проблема в том что бы переписать значение изначального массива
    PHP:
    1. $all_id
    значением массива
    PHP:
    1. $all_orders
    что бы при следующем запросе учитывались уже выведенные записи и не выводились снова
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Почему бы хранение списка айдишников не отдать клиенту? И не надо ничего на стороне пыха будет сериализовать/разворачивать. И простая фильтрация - выбрать все, кроме тех, что прислали в запросе. И простое обслуживание - при чтение ответа от апи просто закидываем идентификаторы в массив, который потом можно почти без дополнительной обработки использовать при последующих запросах.

    Я мысль правильно понял?
     
  5. Zaratustra

    Zaratustra Новичок

    С нами с:
    9 фев 2017
    Сообщения:
    9
    Симпатии:
    0
    да, но если не сложно можно чуть подробней что бы немного прояснились ваши слова
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Типа готовый код нужен?
     
  7. Zaratustra

    Zaratustra Новичок

    С нами с:
    9 фев 2017
    Сообщения:
    9
    Симпатии:
    0
    я разве про код сказал что то? попросил подробней рассказать если не трудно, но раз вы думаете что я прошу у вас код, то лучше не нужно
     
  8. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Стесняюсь спросить, но зачем всё это? Какова задача?
     
  9. Zaratustra

    Zaratustra Новичок

    С нами с:
    9 фев 2017
    Сообщения:
    9
    Симпатии:
    0
    может с высоты опыта это покажется не очень разумным решением, но на сколько хватает знаний так и пытаюсь сделать, в вопросе написано:
    "пытаюсь динамично подгрузить новые записи из БД"
     
  10. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    А куда подробнее-то? Ну давай конечно попробую. Мне не жалко.

    У тебя в базе есть таблица, в которой у кортежа есть уникальный идентификатор. Для решения задачи ты будешь делать выборку либо всех строк - если пришел пустой запрос, либо "кроме таких-то айдишников" - если пришел список каких-то айдишников. Полученный список не нуждается в дополнительной фильтрации и сразу отправляется клиенту в качестве ответа на его запрос.

    На клиентской стороне ты сначала объявляешь объект/массив (кому как удобнее дрочить. Мне вот левой рукой) который будет сохранять известные айдишники.
    Далее ты делаешь запрос на получение данных, указывая содержимое своего списка айдишников. Поскольку это первый старт - список пустой. Поскольку список пустой - сервер вернет все записи (см выше).

    Ответ же от сервера разбирается в цикле и первым делом айдишник кортежа записывается в список известных. Далее уже та обработка, которая требуется для "новой записи" - новой в контексте данной страницы, ибо до этого такой записи не было на странице.

    Всё.
     
  11. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    @Zaratustra ajax-ом отправляешь id последнего полученного элемента и запрашиваешь из базы все строки, у которых id больше последнего.

    Всё правильно. Все так делают. Знания приходят по чуть чуть, чтобы ты успевал их переваривать :)
     
  12. Zaratustra

    Zaratustra Новичок

    С нами с:
    9 фев 2017
    Сообщения:
    9
    Симпатии:
    0
    ну в общем получилось, храню все на клиенте, спасибо за ответы, но вот Ganzalу культурней думаю стоит быть или хотя бы постараться
     
  13. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    всё по своему сделал?
     
  14. Zaratustra

    Zaratustra Новичок

    С нами с:
    9 фев 2017
    Сообщения:
    9
    Симпатии:
    0
    нет, я же написал "храню все на клиенте", до этого пытался хранить все на сервере. при первом обращении спрашиваю сервер для получения всех id, записываю их как строку в js, при последующих запросах ajax ом отправляю эту строку POSTом, делаю массив, сравниваю с вновь сформированым, и его же значение записываю вновь в js строку дабы при следующем запросе сравнивать уже ее, пришлось поморочится т.к. на странице записи по клику удаляются (а по факту переносятся в архивную таблицу) с возможностью тут же вернуть ее обратно, и немного из за этого ajax бунтовал. Теперь проблема в том что бы когда один залогиненый пользователь удалил запись что бы она удалялась для всех или когда один пользователь работает с записью всем остальным работать с ней запрещено
     
  15. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    @Zaratustra, как и что строить - это твоё личное дело. Но я же тебе описал предельно простой подход. И его описание почти влезло в одну строку:
    Это проще реализовать и это не даёт ненужной нагрузки на сервер. Еще раз, это твоё личное дело, но всё же))
     
  16. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    @Zaratustra прости пожалуйста. Чем я тебя обидел?
     
  17. Zaratustra

    Zaratustra Новичок

    С нами с:
    9 фев 2017
    Сообщения:
    9
    Симпатии:
    0
    Просто на странице запись можно удалить и сделать это может любой пользователь, и их можно удалять по несколько за раз, так же их можно и вернуть, при возврате из таблицы архива а актуальную заявке присваивается автоинкрементом следующий айди, его я дописываю в js переменную дабы скрипт не считал ее новой, получается нужно держать в переменной актуальные айди. Задумка в том что бы при удалении, добавлении, изменении, это все менялось у всех пользователей без перезагрузки. На данный момент вижу что по неопытности пошел не тем путем изначально, не подскажете каким способом этот реализовать, а то я затрудняюсь даже что в поисковике писать)
     
  18. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    На сколько понимаю, у тебя в БД отдельная таблица для удаленных сообщений. Делать это не обязательно. Можно добавить в таблицу сообщений столбец в котором будут значения 1 и 0. 1 - отображать, 0 - нет.
    А вообще - зачем восстанавливать?
     
  19. Zaratustra

    Zaratustra Новичок

    С нами с:
    9 фев 2017
    Сообщения:
    9
    Симпатии:
    0
    да, таблица отдельная, сделано для упрощения, архивные записи будут накапливаться и что бы не бегать по ним каждый раз и в поисках активных они переносятся, а восстановить можно для облегчения, запись по сути заявка и что бы не дублировать одно и тоже нажимается восстановить и она возвращается в статус активных без повторного заполнения формы. Но сейчас думаю просто отводить какое то время для возможности возврата не перенося а архив, таймером что ли, и если не вернулась в активные скриптом переносить для упрощения.
     
  20. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Для фиксации изменения кортежа можно воспользоваться стандартными средствами СУБД - добавить поле datetime и в его атрибутах выбрать on update current_timestamp и дефолтным значением - current_timestamp. Тогда при вставке или обновлении записи - значение этого поля будет автоматически меняться. Фильтр выборки поменять на "больше чем присланная дата".

    На стороне клиента нам уже больше не надо будет держать список айдишников. Нужно будет только максимальное время запоминать. При старте это будет ноль. При отправке нуля на сервер фильтр "больше чем присланная дата (больше чем ноль)" вернет все имеющиеся записи. Приняв их в цикле сравниваем значение и записываем в переменную. При последующих запросах значение будет не нулевым и фильтр будет отбирать только строки которые добавились или изменились.
    --- Добавлено ---
    Удаленную запись на время отмечать нулем в статусе активности как предлагает @TeslaFeo чтоб клиенты могли увидеть факт удаления записи и скрыть со страницы. Ну и кроном раз в месяц/неделю/день перетаскивать в архив удаленные месяц/неделю/день и более назад