Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Редактирование записей в базе несколькими юзерами
 
 автор: nas2net   (14.06.2009 в 22:21)   письмо автору
 
 

Может кто-то знает, как решить такую задачу, подскажите пожалуйста.
На сайте есть несколько админов, которые могут добавлять и редактировать статьи в базе MySQL. Редактор статей сделан очень просто: из базы вытаскиваем SELECTом в Веб-форму, там редактируем и по нажатии кнопки сохраняем обратно в базу UPDATE. Столкнулся с тем, что когда несколько человек одновременно правят одну статью и потом сохраняют ее, то в базе сохранятся только изменения последнего сохранявшего, т.к. он себе редактирует данные в браузере и даже не подозревает, что кто-то там уже параллельно редактирует и сохраняет в базу.
Я решил к статьям добавить дополнительное поле, куда писать запрет на редактирование, если статью уже кто-то начал редактировать и снимать его после завершения редактирования. Но столкнулся с еще одной проблемой. Ведь человек который начал редактировать статью может не окончив закрыть браузер и уехать в отпуск, а в таблице так останется запрет на редактирование.

Подскажите, как можно отследить редактирует ли еще человек статью, или он уже спит на клавиатуре :). Можно ли узнать к примеру, что от пользователя нет никакой реакции за последние 2 часа?

  Ответить  
 
 автор: cheops   (15.06.2009 в 02:27)   письмо автору
 
   для: nas2net   (14.06.2009 в 22:21)
 

Лучше заведите поле с датой последнего изменения и передавайте его в форму, если дата из формы не совпадает с фактической датой в таблице - кто-то успел уже изменить таблицу - запрещайте вносить изменения. Такой подход часто используется в Web, где не всегда возможно применить транзакции в случае, если над текстом работает несколько человек. Например, схожий механизм используется в Википедии. В этом случае у вас редакторы будут на равных, но предпочтение будет отдаваться тому, кто раньше успел внести изменения.

  Ответить  
 
 автор: nas2net   (15.06.2009 в 12:47)   письмо автору
 
   для: cheops   (15.06.2009 в 02:27)
 

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

  Ответить  
 
 автор: cheops   (15.06.2009 в 14:39)   письмо автору
 
   для: nas2net   (15.06.2009 в 12:47)
 

Набранный текст выводится (он не пропадает) и редактор может его сохранить или внести правки повторно.

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

  Ответить  
 
 автор: Trianon   (15.06.2009 в 10:22)   письмо автору
 
   для: nas2net   (14.06.2009 в 22:21)
 

>Можно ли узнать к примеру, что от пользователя нет никакой реакции за последние 2 часа?
Если Вы фиксируете время последнего проявления пользователя на сервере, то как бы сказать, непонятно в чем сложность.
Если не фиксируете тогда, конечно, нельзя. Но, как бы сказать, что мешает-то?

ему даже штраф можно выставить за документ вовремя не возвращенный в базу.

  Ответить  
 
 автор: nas2net   (15.06.2009 в 12:53)   письмо автору
 
   для: Trianon   (15.06.2009 в 10:22)
 

Ну сложность для меня как раз в том, что во время редактирования автор не обращается к серверу (вроде бы), а ковыряется уже у себя в редакторе (FCK-editor), пока не закончит редактировать (или не закончит никогда).

  Ответить  
 
 автор: Trianon   (15.06.2009 в 12:56)   письмо автору
 
   для: nas2net   (15.06.2009 в 12:53)
 

Тогда это вопрос для соседнего раздела - - HTML-JS-CSS
Сам FCKeditor никаких изменений в БД не вносит.

  Ответить  
 
 автор: cheops   (15.06.2009 в 14:42)   письмо автору
 
   для: nas2net   (15.06.2009 в 12:53)
 

Можно AJAX дергать сервер и проверять нет ли изменений - если изменения поступили, выводить в окно браузера: Дорогой товарищ, слишком долго копаетесь, кто-то уже изменил статью, вы конечно и дальше можете работать над этим вариантом, но пока вы не загрузите новые данные - от вас правок приниматься не будет.

  Ответить  
 
 автор: nas2net   (15.06.2009 в 15:01)   письмо автору
 
   для: cheops   (15.06.2009 в 14:42)
 

cheops, спасибо за разъяснения и чувство юмора! Думаю в моем случае подойдет комбинированный вариант: при выдаче статьи на редактирование ставить на нее флаг "занято" где-то на час, а если автор за час не догадался ни разу сохранить, тогда флаг меняем на "доступно для редактирования" и пусть "принимает правильное решение", если кто-то успеет поредактировать и сохраниться раньше него. Ну и конечно повесить большими красными буквами предупреждение при выдаче на редактирование, что мол у вас есть 1 час, чтобы хотя бы раз сохраниться.
Для меня такой вариант по силам, с Ajax буду еще долго разбираться.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования