1. PHP / Говнокод #6077

    +158

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    class Query {
      protected $baseTable;
      protected $baseTableAlias;
      protected $whereGroup;
    
      protected $joins = array();
      protected $fields = array();
    
      protected $executed = FALSE;
      protected $resource = NULL;
    
    
      function __construct($base_table = 'node', $alias = 'n') {
        $this->whereGroup = new QueryWhereGroup();
        $this->baseTable = $base_table;
        $this->baseTableAlias = empty($alias) ? $base_table : $alias;
      }
    
      function select($fields) {
        settype($fields, 'array');
        foreach ($fields as $alias => $field) {
          if (is_numeric($alias)) {
            $this->fields[] = $field;
          }
          else {
            $this->fields[$alias] = "$field as $alias";
          }
        }
    
        return $this;
      }
    
      /**
       * @param QueryWhereGroup $whereGroup
       * @return Query
       */
      function where($whereGroup) {
        call_user_func_array(array($this->whereGroup, 'cond'), func_get_args());
        return $this;
      }
    
      function createWhereGroup() {
        return new QueryWhereGroup();
      }
    
      function join($table, $alias = NULL, $condition, $join_type = 'INNER') {
        if (!$alias) {
          $alias = $table;
        }
    
        if (is_array($condition)) {
          $condition = 'USING ('. join(', ', $condition) .')';
        }
        if (!preg_match('/^ON|USING/i', $condition)) {
          $condition = 'ON '. $condition;
        }
    
        $this->joins[$alias] = "$join_type JOIN $table $alias $condition";
        return $this;
      }
    
      function compile() {
        $select_fields = join(', ', array_unique($this->fields));
        $joins_list = join("\n", $this->joins);
        $where_conditions = $this->whereGroup->compile();
    
        if (!empty($where_conditions)) {
          $where_conditions = 'WHERE '. $where_conditions;
        }
    
        return "SELECT $select_fields FROM {{$this->baseTable}} {$this->baseTableAlias} \n $joins_list $where_conditions";
      }
    
      function args() {
        return $this->whereGroup->args;
      }
    
      function execute() {
        return db_query($this->compile(), $this->args());
      }
    
      function fetchAll() {
        $res = $this->execute();
        while($row = db_fetch_object($res)) {
          $rows[] = $row;
        }
        return $rows;
      }
    }

    построитель запросов (drupal 6)
    wheregroup здесь http://govnokod.ru/6076

    Запостил: vectoroc, 23 Марта 2011

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

    • Тут ничего такого плохого
      Ответить
    • Мне вот не понятно как тут limit, order, group проставлять. Да и слишком громкое название у класса Query, который занимается только Selectом.
      Ответить
      • ээ? SELECT возвращает курсор в отличие от других инструкций
        Ответить
        • Не понял вашего замечания.
          Ответить
          • а, пехепешник...
            Ответить
            • И всё же. Поясните, а то мне убогому не понятно.
              Ответить
              • селект возвращает данные, инсерт - нет.
                совсем уже с этим вашим мускулом азы не знаете...
                Ответить
                • Всё равно не понимаю как "селект возвращает данные, инсерт - нет" противоречит "слишком громкое название у класса Query, который занимается только Selectом."?
                  Ответить
                  • тогда придётся просто поверить, что выборка и прочий DML таки можно функционально разделить :-P

                    в любом случае, этот "конструктор запросов" сказочно убог (речь не об отсутствии INSERT et al), и пора уже сейчас задуматься об его переписывании


                    спойлер: я сказал задуматься, а не бросаться сразу писать килостроки хуйни :-P
                    Ответить
                    • Есть предложения, как переписать? Интересно будет послушать.
                      И да, это просто велосипед, написанный на коленке, не претендующий на что либо
                      Ответить
                      • Смотрите готовые решения в разных фреймворках.
                        Ответить
                      • Если бы мне вдруг захотелось прикрыть мутным пхпшным велосипедом прозрачную логику SQL, то я бы инкапсулировал множества и реализовал операции над ними
                        Ответить
      • Я у себя уже переименовал в SelectQuery
        limit, order, group несложно встроить, я думаю.
        Ответить
    • В мои ноздри вполз запах чего-то вкусного, и снилось, будто бы сосал я с причмокиванием хуище Ивана, а он кончил, да так много, так вкусно, что я не только язык утопил в благодати, но и носом почувствовал запах чего-то, никогда не осязаемого. Моя рука ещё щупала холодную пустоты вдавленности, где недавно спал мой желанный, а ноги уже сами по себе спешили на кухню, "держа нос по ветру". Свежий и облизывающийся кок колдовал у духовки, и даже голая попка с открытой щелью наклонённого повара с карамельным входом в шоколадные закрома любимой попочки вещала, что приготовлено нечто этакое.
      Ответить

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