"PHP" / Говнокод #1973 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
<?php
    public function run()
    {
        $db = Registry::get('Db');

        $db->transaction(Db_Database::START);

        $success = $db->query()->update()
            ->table('forum_topics')
            ->set('PostsCount = PostsCount - 1')
            ->set('LastPostID = ('
                . $db->query()
                    ->select()->fields('ID')
                    ->table('forum_posts')->order('ID', 1) // DESC
                    ->where('TopicID = %d', $this->post->topic->id)
                    ->limit(1)->compile()->getQuery()
                . ')')
            ->set('FirstPostID = ('
                . $db->query()
                    ->select()->fields('ID')
                    ->table('forum_posts')->order('ID')
                    ->where('TopicID = %d', $this->post->topic->id)
                    ->limit(1)->compile()->getQuery()
                . ')')
            ->where('ID = %d', $this->post->topic->id)
            ->compile()->run()->success()
        && $db->query()->update()
            ->table('forum_cats')
            ->set('PostsCount = PostsCount - 1')
            ->set('LastTopicID = ('
                . $db->query()
                    ->select()->fields('ID')
                    ->table('forum_topics')->order('LastPostID', 1) // DESC
                    ->where('CatID = %d', $this->post->topic->category->id)
                    ->limit(1)->compile()->getQuery()
                . ')')
            ->where('ID = %d', $this->post->topic->category->id)
            ->compile()->run()->success()
        && $db->query()->update()
            ->table('forum_posts')
            ->set('Deleted = 1')
            ->where('ID = %d', $this->post->id)
            ->compile()->run()->success();
        $db->transaction($success ? Db_Database::COMMIT : Db_Database::ROLLBACK);
        return $success;
    }

Вот такая вот жесть бывает. Изменение счетчиков на форуме (денормализация) с использованием альфа-версии кверибилдера. по-моему — устрашающе)

Запостил: Shock Shock, (Updated )

Комментарии (7) RSS

  • я не пшпист.. но выглядит вроде сносно, когда не всё в одну строку
    Ответить
  • для управления транзакцией надо знать имя класса и константы? "удобно", че
    а вообще такое кол-во кода ради апдейта счетчика это пиздец)
    Ответить
    • да, это была неудачная идея, проверено на практике))
      хотя, я сомневаюсь, что на, скажем, чистом скл можно сделать меньше кода... )))
      Ответить
  • Вообще используется нормальный sql-конструктор, вот только это плохой пример его употребления..
    Ответить
  • Это же Zend Framework! Я бы написал на чистом SQL или хотя бы разбил на логические куски. Кода может и не убавится, зато будет читабельнее и редактировабельнее 🙂
    Ответить
    • неа, это самописное. хотя стандарт именования действительно зендовский 🙂
      Ответить

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

Где здесь C++, guest?!

    А не использовать ли нам bbcode?


    8