Исправление форума "кривыми" руками

И снова здравствуйте, банда креативных программистов, кодирующих дизайнеров и БД-админов, способных оглушить всю рыбу в озере одним лишь SQL-запросом. В робких попытках погреться в лучах чужой славы, попытаюсь затесаться в ваши ряды и выложу в качестве взноса очередной рецепт из кухни народов MODx.

C недавним рассказом о выборе форума на самом выборе (лично для меня) была поставлена точка. Да и что продолжать, если все работает, устраивает меня, заказчика и посетителей сайта? Как выяснилось, устраивает не все. При использовании форума вскрылся маленький, но очень досадный глюк. Пользователь, создавший пост в теме форума, наделен властью редактировать и удалять свою запись. Правки проходили гладко, но вот при попытке удаления записи MODx выбрасывал сообщение об ошибке примерно такого содержания:

« Execution of a query to the database failed - Incorrect integer value: 'posts_count-1' for column 'posts_count' at row 1 »
SQL: UPDATE `mybase`.`mybase_myforum_topics` SET posts_count='posts_count-1',last_post_at='1280175316',last_post_user_id='8' WHERE id = 5

Тем не менее, при следующей попытке войти в ветку форума, удаляемой записи уже не было. Насторожил нюанс – хотя пост исчезал, количество записей, указываемое в теме на форуме, оставалось прежним. Не будучи знатоком PHP и SQL, можно все-таки догадаться о причинах таких возмущений со стороны движка. Все дело в том, что вычисляемое выражение 'posts_count-1' заключено в апострофы (кавычки). Возможно, такие вычисления поддерживаются версиями MySQL, отличными от моей, но я-то хочу чтобы все работало здесь и сейчас, именно данном сервере, без переустановок софта. Ну и ладно. Берем мясницкий нож и с немытыми руками лезем в сниппет. Степень кривизны рук не имеет значения.

Поскольку префикс, имя базы и таблицы могут меняться, искать нужное место в сниппете по тексту SQL-запроса бесполезно. Давайте-ка попробуем найти именно оскандалившийся кусочек ‘posts_count-1’. Заходим в папку, где лежат файлы сниппета (“…/siteroot/assets/snippets/myforum/”) и ищем файл, в котором есть такая строка символов. Задача облегчается, когда находится всего один такой файл: «myforum_db.class.inc.php». Откройте его в любом текстовом редакторе. Найдя в нем нужное место (в функции «removePost»), читаем строку кода:

  1.  
  2. $modx->db->update(
  3. array('posts_count' => 'posts_count-1',
  4. 'last_post_at' => $newLastRow['created_at'],
  5. 'last_post_user_id' => $newLastRow['author_id']),
  6. $modx->getFullTableName('myforum_topics'),
  7. 'id = '.$topicId
  8. );
  9.  

Вот оно. Именно здесь вычисляемое выражение заключается в кавычки. Править все ручками и выдумывать велосипед не интересно, поэтому включаем думалку. Где еще используется похожий код? Не думайте! Вы можете устать! Я и так скажу – он находится несколькими строками выше, в функции «addNewPost». Заметьте, исполнение этой функции не вызывает ошибки, хотя поле 'posts_count' обновляется, разница лишь в знаке операции: вместо вычитания единицы, функция прибавляет ее к имеющемуся значению. Хм… Нет, есть еще отличие. Операция производится не функцией MODx, а непосредственно SQL-запросом, вот так:

  1.  
  2. $modx->db->query('
  3. UPDATE
  4. '.$modx->getFullTableName('myforum_topics').'
  5. SET
  6. posts_count = posts_count+1,
  7. last_post_at = '.time().',
  8. last_post_user_id = '.intval($fields['author_id']).'
  9. WHERE
  10. id = '.intval($fields['topic_id']).'
  11. LIMIT 1'
  12. );
  13.  

Копируем этот фрагмент функции, вставляем его в «removePost», и вносим исправления по аналогии с исходным текстом. В результате получается что-то вроде этого:

  1.  
  2. $modx->db->query('
  3. UPDATE
  4. '.$modx->getFullTableName('myforum_topics').'
  5. SET
  6. posts_count = posts_count-1,
  7. last_post_at = '.$newLastRow['created_at'].',
  8. last_post_user_id = '.$newLastRow['author_id'].'
  9. WHERE
  10. id = '.$topicId.'
  11. LIMIT 1'
  12. );
  13.  

На этом месте я прекратил свое криворукое кодирование и отлучился на перекур. Впереди меня поджидали зловещие глюки, роковые баги и страшные сообщения от парсера. Курил я неторопливо, так что они меня, наверное, не дождались. По крайней мере, когда я вернулся за компьютер, ошибок не наблюдалось. Все работало гладко, количество сообщений на форуме подсчитывалось правильно, а отдельные наглые комменты в форуме удалялись без шума, пыли и претензий насчет «Incorrect integer value». Пользуйтесь на здоровье.

P.S. Наглый удаляемый коммент – этот тот, который не подтверждает мою точку зрения.

P.P.S. Комментируйте, друзья, не стесняйтесь :)

Автор статьи: Александр Поляков, lecosson@mail.ru

new comment 28.01.2011, 01:38:04

кул

new comment 07.02.2011, 00:44:46

Спасибо :)

new comment 29.05.2011, 09:22:10

http://Gardnet.tomsk.ru - Томский Torrent reSource ( Обмен файлами, музыка, видео, кино, сериалы, игры, сетевые игры, рейтинг, мобильная связь, автомобили, опрос, софт, реклама, спорт, Томск, объявления, порно, Рынок, новости, общение, развлечения, интернет, Знакомства, 18+, Чат ).

new comment 23.06.2011, 15:43:46

Superior thiknnig demonstrated above. Thanks!

new comment 24.06.2011, 12:02:07

az8hHC <a href="http://jzgowtmismmt.com/">jzgowtmismmt</a>

new comment 24.06.2011, 17:41:09

3IqEjb , [url=http://piphcwctnemf.com/]piphcwctnemf[/url], [link=http://ecfavrywdujy.com/]ecfavrywdujy[/link], http://aabcxchlbovp.com/

new comment 26.06.2011, 20:20:31

3W433i , [url=http://hpkxtvtlopdu.com/]hpkxtvtlopdu[/url], [link=http://ovqbxzbhjkib.com/]ovqbxzbhjkib[/link], http://lriysuhygsaf.com/

Добавить комментарий

Для форматирования используйте синтаксис Markdown. Если вы не можете разобрать символы в рисунке, нажмите на него для автоматического обновления
Если вы не можете разобрать символы в рисунке, нажмите на него для автоматического обновления
Код безопасности: