forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   PHP / MySQL (http://forum.boolean.name/forumdisplay.php?f=135)
-   -   Много одинаковых списков на странице (http://forum.boolean.name/showthread.php?t=16675)

St_AnGer 20.04.2012 19:59

Много одинаковых списков на странице
 
Господа-гуру PHP, HTML и MySQL, обращаюсь к вам за помощью.
Имеется код, который берёт из базы данных MySQL все значения и впихивает их в список (список клиентов).

PHP код:

$query3 "SELECT * FROM clients WHERE 1";
$res3 mysql_query($query3) or die(mysql_error());

echo 
"<SELECT name=\"".$s_name."\" style=\"width:200\">
  <OPTION  value= \"0\"></option>"
;
  while (
$row3=mysql_fetch_array($res3))
  {
    
$row_t $row3['id'];
    if (
$row2['reg_cl_id'] == $row_t)
    {
      echo 
"<OPTION selected value = \"$row_t\">".$row3['fio']."</option>";
    }
    else
    {
      echo 
"<OPTION value = \"$row_t\">".$row3['fio']."</option>";
    }
  } 
echo 
"</SELECT>"

В общей сложности в списке 700 записей. Проблем с ним нет, всё прекрасно выводится в список и размещается на странице, код рабочий.
Когда таких списков 2-3 в принципе всё приемлимо и шустренько работает. Но таких списков нужно приблизительно 60 на странице (сама страница - книга записи клиентов с 7 по 22 часов дня, на каждые 15 минут расписания один такой вот длинный грустный список...).
И, соответственно, грузятся они все последовательно друг за другом каждый раз при листании страниц, и это очень долгая история, что не есть хорошо когда надо быстро листать страницы.

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

ps. До этого держал точно такую же базу в MS Access 2007, там такой проблемы не было даже близко (всё было реализовано прям в самой базе данных на внутренних формах, принцип реализации был тот же что и на php пытаюсь сделать сейчас).

moka 20.04.2012 20:06

Ответ: Много одинаковых списков на странице
 
Использовать кеширование?
Только можно поинтересоваться, это что, на каждые 15 минут расписания у тебя 700 записей?
Можно побольше инфы о отношении данных таблицы и конкретики данных. Т.к. подкрадывается сомнение что там всё консистентно.
Также если проблемы с объёмом данных, прибегай к кешированию и подгрузке используя например AJAX.

Исходя из скудных данных. Как понял у тебя есть список людей (700), и есть расписание. В каждые 15 минут тебе нужно поставить человека. Так?

Зачем тебе делать это SELECT'ом? В смысле, не нужно делать комбобоксом.

Используй JavaScript для такой операции. А именно:
1. Выдай один раз список персон (вообще это делать также нужно по фильтрам и т.п. но пох).
2. Выдай ячейки расписания с привязанными к ячейкам id персон.
3. На стороне клиента, запихай список персон в хештаблицу используя JS.
4. После загрузки страницы, пробегись по расписанию ячейкам и вставь туда нужные данные (имя например), т.к. они у тебя уже есть в памяти.
5. При нажатии на ячейку делай всплывающее окошко (не закладка, а псевдо-окошко на той же страницу, тупо div показываемый / скрываемый используя JS).
6. В этом окошке имей таблицу персон с фильтрами (чтобы тупо искать удобнее было).
7. Суть окошка - возвратить данные о пользователи.
8. При выборе, отсылай AJAX запрос серверу о изменении конкретной ячейки и время последнего обновления данных.
9. В ответе с сервера, проверяй были ли изменения с последнего обновления на клиенте. Если да, то добавь данные о изменённых ячейках (тупо xml или json). Также если есть изменения у персон или добавлены новые.
10. На стороне клиента получив ответ, если есть изменения, применяй их.
11. Запускай AJAX запрос на изменения каждые например 30 секунд, и дай возможность делать запрос по нажатию кнопки в фронтенде.

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

Также, НИКОГДА!!!!! не используй таблицы. Делай всё DIV'ами. Это древний век (таблицы).

St_AnGer 20.04.2012 20:19

Ответ: Много одинаковых списков на странице
 
Вложений: 1
Цитата:

Сообщение от MoKa (Сообщение 226033)
Использовать кеширование?
Только можно поинтересоваться, это что, на каждые 15 минут расписания у тебя 700 записей?
Можно побольше инфы о отношении данных таблицы и конкретики данных. Т.к. подкрадывается сомнение что там всё консистентно.
Также если проблемы с объёмом данных, прибегай к кешированию и подгрузке используя например AJAX.


Вложение 16673

Вот вид части страницы записи. Так с 7 и до 22 часов включительно. Каждый список содержит одни и те же данные (id клиента, фио клиента). Когда список содержал 5 клиентов всё грузилось мгновенно. Но я загрузил имеющихся в рабочей сейчас бд Access (701 запись), и вот что получилось.

С javaScript не знаком абсолютно, увы :( Select'ом делал потому что с другим ничем ещё не знаком.

Спасибо за оперативный ответ. Пойду гуглить и учиться написанию скриптов.

upd Вопрос. Из списка удобно выбирать клиента вбив первые буквы его фамилии. Тем способом, что советуете вы, это будет возможно сделать? Вопрос ламерский, понимаю, но базу делаю не для себя (я ФИО клиента напечатаю быстрее чем он успеет договорить, в отличии от прямого пользователя программы)

moka 20.04.2012 20:24

Ответ: Много одинаковых списков на странице
 
Думаю предложенный вариант - то что тебе нужно. Чтобы избежать перезагрузки постоянной. Если ещё больше будет персон, тогда нужно делать запросы с фильтрами, подобно гуглу, где будет искаться персона исходя из предоставленных данных. Но это уже слишком сложно.
Даже сценарий выше, весьма не просто для начинающего веб разработчика, но думаю если такое сделаешь, ОЧЕНЬ много по пути выучишь, т.к. задача затрагивает большой спектр важных аспектов.

St_AnGer 20.04.2012 20:31

Ответ: Много одинаковых списков на странице
 
Цитата:

Сообщение от MoKa (Сообщение 226038)
Думаю предложенный вариант - то что тебе нужно. Чтобы избежать перезагрузки постоянной. Если ещё больше будет персон, тогда нужно делать запросы с фильтрами, подобно гуглу, где будет искаться персона исходя из предоставленных данных. Но это уже слишком сложно.
Даже сценарий выше, весьма не просто для начинающего веб разработчика, но думаю если такое сделаешь, ОЧЕНЬ много по пути выучишь, т.к. задача затрагивает большой спектр важных аспектов.

Просто огромное спасибо вам, Максим! Идея очень понятна (и в мыслях уже сформирована задача по реализации). Ушёл перелопачивать гугл на тему javaScript и AJAX.

moka 20.04.2012 20:51

Ответ: Много одинаковых списков на странице
 
*на ты, тут все свои ;)

St_AnGer 26.04.2012 11:19

Ответ: Много одинаковых списков на странице
 
Вообщем, реализовал почти так как было предложено (на сколько это получилось при моём нынешнем уровне знаний).

1) заместо 64 списков я сделал 64 простых текстовых поля(для хранения ФИО клиентов) с id от 1 до 64 включительно, и, соответствующие каждому полю, 64 скрытых элемента (для хранения id клиентов);
2) при загрузке страницы в массив загружается список клиентов id => фио, сразу же в javaScript передаются по одному эти же значения в массив в самом скрипте, так же 64 текстовых поля заполняются соответствующими значениями из бд (ну если есть конечно);
3) создал скрытый при загрузке страницы div фиксированный по центру страницы, который содерит в себе список пользователей, заполненный из одновременно с заполнением массива пользователей, и кнопку "выбрать".

При нажатии на любое из текстовых полей по событию onclick вызывается функция принимающая в качестве параметра id текстового поля и открывающая скрытый изначально div.
Выбрали нужного клиента, нажали кнопку "выбрать". По нажатию на кнопку выбрать по событию onclick вызываю функцию, принимающая в параметры id списка клиентов. В фукнции по принятому id узнаём переданное значение id-клиента из списка. И заполняем значение нужного текстового поля ФИО клиента и соответствующего ему скрытого поля id клиент, взятые из созанного при загрузке страницы массива. Ну и скрываем соответственно открытый div, он ведь больше ненужен.

Всё! Загружается всё мгновенно, работает идеально. Как оказалось, JavaScript очень простой язык :) Да, надо перерабатывать будет всю схему, т.к. много лишних элементов, но блин :) я получил неизмеряемое количество профита и наслаждения когда всё заработало как надо! Последний раз такое у меня было когда моргнул свежеспаянный светодиодный куб :) Спасибо наиогромнейшее тебе, Максим!

реалтайм таблица расписания мне в данном случае ненужна, т.к. единовременно будет работать с бд только один человек. Но всё попробую сделать второй такой проект с использованием AJAX.

moka 26.04.2012 13:17

Ответ: Много одинаковых списков на странице
 
Молодцом! Если работает как и ожидал, то круто :)

У меня была подобная задача, но ещё сложнее, список персон был около двух миллионов, приходилось делать заместо списка персон, некую таблицу с фильтрами по колонкам, где нужно было вводить фильтры, это отправлялось на сервер в виде AJAX запроса (в будущем реализовал лонгпуллом и потом вебсокетами). В общем после запроса сервер создаёт запрос в бд исходя из фильтров и выдаёт первые 10 вариантов. В общем работало тоже шустро так :)
Единственная проблема была, это скорость фильтров через бд где 2 миллиона записей в таблице. Это сильно глючило.

SBJoker 26.04.2012 13:44

Ответ: Много одинаковых списков на странице
 
Реквестирую в отдельных тред фотоотчёт о сборке LED-куба.

St_AnGer 26.04.2012 17:06

Ответ: Много одинаковых списков на странице
 
Цитата:

Сообщение от SBJoker (Сообщение 226538)
Реквестирую в отдельных тред фотоотчёт о сборке LED-куба.

Фотоотчёт позже вечером сделаю, когда с работы вернусь :) эта задачка меня на долго и конкретно загрузила, если учесть что до начала его сборки знания в электрике и электронике у меня были минимальными :) сейчас их конечно не очень намного больше, но программируемые приборы делать могу уже почти не напрягаясь :) вообщем, всё отпишу в фотоотчёте :)


Часовой пояс GMT +4, время: 19:00.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot