Давным давно, когда я только начинал изучать PHP и тонкости составления запросов MySQL (2011 год) у меня возникла мысль написать обертку для MySQLi наподобие Doctrine для упрощения синтаксиса обращения к базе данных. На дворе уже 2019 и решил поделиться своим велосипедом на тему ORM.

И так, это DBX — движок базы данных MySQL для PHP на основе библиотеки MySQLi основанный на запросах вида структурного описания таблиц и полей базы данных в виде обычного массива с функцией статического кэширования запросов и автообновления хэша статики.

Вопреки всеобщей любви к PDO, была выбрана именно легковесная MySQLi функциональность, которая мягче и проще программируется и более лаконично вписывается в предложенное API DBX. Я даже не использовал composer, потому что у меня нет ни одного проекта, где я использую сторонние зависимости кроме самописных.

Собственно, рассмотрим пример объявления структуры простейшей тестовой базы данных и ее таблиц. Для начала подключим саму библиотеку с классом и отправим данные авторизации с хостом базы данных:

require_once './DBX.php';
$dbx_data  = ['localhost', 'root', 'root', 'dbx_test', '8889'];

Теперь представим, что нам нужно описать и создать таблицу в БД используя синтаксис обычного массива PHP:

<?php
/**
  * CREATE TABLE EXAMPLE
  */
$table_1 = 'example'; // table name
$query_1 = 'c'; // create table sql
$fields_1 = [
    'field_id' => [
        'type'   => 'num', // int
        'auto'   => true,  // auto increment
        'length' => 255,
        'fill'   => true   // not null
    ],
    'field_text' => [
        'type'   => 'text', // varchar
        'length' => 255,
        'fill'   => true
    ],
    'field_date' => [
        'type'   => 'time', // TIMESTAMP
        'value'  => date('Y-m-d')
    ]
];

?>

Здесь синтаксис простой. Я не использовал строгую типизацию и выбрал просто значения TEXT, NUMBER и TYMESTAMP. Конечно же, для более «рульной» структуры таблицы используется ключевое поле ID с автоинкрементом (не встречал случаев в реальных проектах, когда задание автоинкремента и ключа мешает проектированию запросов и связей таблиц). Для указания может ли поле быть пустым указывается параметр fill => true.

Типы запросов DataBaseX очень просты и содержат основные методы вроде select, insert, delete, update, drop, truncate и так далее.

К примеру запрос для создания таблицы:

// perform queries
$dbx::query("c", $table_1, $fields_1);

Или запрос добавления данных и структуры столбцов может выглядеть вот так:

// fields values for table_1 example
$fields_2 = [
    'field_id' => [
        'value' => 456
    ],
    'field_text' => [
        'value' => 'I have to add into my table'
    ],
    'field_date' => [
        'value'  => date('Y-m-d')
    ]
];
// perform queries
$dbx::query('i', $table_1, $fields_2);

Структура массива позволяет однажды описать базу данных и в последующем лишь манипулировать полями value для изменения данных, которые используются для формирования запросов.

Вот пример update инструкции, которую я упраздню в следующем примере:

// fields values for table_1 example
$fields_3 = [
    'field_id' => [
        'value' => 456
    ],
    'field_text' => [
        
        'new_value' => 'I was updated',
        'criterion_field' => 'field_id',
        'criterion_value' => 456
    ],
    'field_date' => [
        'value'  => date('Y-m-d')
    ]
];
// perform queries
$dbx::query('u', $table_1, $fields_3);


Мне показалось, что использование полей criterion_field и criterion_value усложняет систему, поэтому я создал запрос, который автоматически либо добавляет данные в БД, если они еще не были созданы, либо обновляет существующие данные. Этот запрос я назвал INJECT QUERY и вызывается он префиксом «in»:


// fields values for table_1 example
$fields_2 = [
    'field_id' => [
        'value' => 0
    ],
    'field_text' => [
        'value' => 'Yo if field_id = 0 it\'s an insert or if id exists it\'s an update'
    ],
    'field_date' => [
        'value'  => date('Y-m-d')
    ]
];
// perform queries
$dbx::query('in', $table_1, $fields_2);


Работает это на низком уровне так:

INSERT INTO `revolver__comments` (`field_id`, `field_content`) 
VALUES ('5', 'TEST UPDATE') 
ON DUPLICATE KEY UPDATE `field_id`='5', `field_content`='TEST UPDATE';

Все остальные запросы простейшие и описывать их не имеет смысла(смотрите примеры в файле тестов index.php), но я не могу не показать как работает запрос SELECT:

<?php 
// perform queries
$dbx::query('s|field_id|asc|100|0', $table_1, $fields_1);
?>

<?php
    // print structure
    print '<h2>DBX STRUCTURE</h2>';
    print '<pre><code>';
    print_r( $fields_1 );
    print '</code></pre>'; 
    // print result
    print '<h2>DBX QUERY RESULT</h2>';
    print '<pre><code>';
    print_r( $dbx::$result );
    print '</code><pre><hr />';
?>


Здесь с использованием префикса «s» можно сгруппировать параметры запроса s|field_id(order)|asc(direction)|100(limit)|0(offset).

Кроме прочего DBX обладает такой отличительностью, как встроенный файловый кэш на базе JSON статики. Каждый запрос изменения (INSERT, UPDATE, DELETE, TRUNCATE) вызывает пресчёт хэша в таблице хэшей кэша и автоматически обновляет статический кэш, что позволяет не думать о нагрузке на запросы SELECT.

В будущем я планирую до развить движок DBX и расширить возможности конструктора SQL запросов системой конфигурации UNION и JOIN, а также добавить новую из MySQL 8 поддержку базы данных на типе JSON структуры.

Сейчас DBX используется в моей системе управления контентом RevolveR и показывает неплохие характеристики (весь сайт при условии наличия обновленного кэша инициализируется одним запросом к БД и потребляет около 0.7 Mb оперативной памяти интерпретатора). А также мне очень удобно видеть всю структуру БД в одном отдельном файле, что в разы ускоряет наращивание и проектирование новых модулей.

Репозиторий проекта: DBX v1.1.1 на GitHub.

Комментарии (79)


  1. peresada
    04.02.2019 11:16
    +3

    Глянул код:
    1) Ни одного исключения \ нулевая обработка ошибок \ нулевая информативность об ошибках
    2) Код на 80% построен на `case` и хадукен if'ах
    3) информативнейшие комментарии

    // connect database
    public static function connect() {

    4) Поддерживать этот код сможете только вы (на самом деле любой, но никто в здравом уме это делать не будет)
    5) ООП? не, не слышали.
    6) Зачем аннотации, если писать в блокноте?

    Подитог: для собственного велосипеда и для хобби-программирования — ок, но зачем это тут?
    Итог: Для профессиональной разработки лучше использовать нормальную ORM и отказаться от принципа:
    Я даже не использовал composer, потому что у меня нет ни одного проекта, где я использую сторонние зависимости кроме самописных.


    1. xRevolveRx Автор
      04.02.2019 11:48
      -3

      $dbx::$result['status'] выведет все исключения, а также ошибки подключения и прочее.

      $dbx::$result['status']['sql_query_debug'] покажет построенный запрос MySQL.

      Код не задумывался, чтобы его поддерживал еще кто-то. Его, во-первых, не так много, во-вторых, ошибок в нем нет. JOIN, UNION и delete без WHERE statemant я реализую самостоятельно как и обещал.

      Нужен composer? Сделаю вам отдельную версию.

      Чем вам case не нравится? Можно было array keys использовать, но я решил на if написать.


      1. akdes
        04.02.2019 12:01
        +2

        Код не задумывался, чтобы его поддерживал еще кто-то.

        Зачем он тогда на хабре? Это противоречит Вашей задумке


        1. xRevolveRx Автор
          04.02.2019 12:18
          -1

          Какой задумке?


      1. Rukis
        04.02.2019 21:01

        во-вторых, ошибок в нем нет

        Что вы готовы на это поставить?


        1. xRevolveRx Автор
          04.02.2019 22:28
          -1

          Я вам минет отправлю через прослушку, если найдете серьезные баги и ошибки. Я не Билл, чтобы деньгами платить.


          1. Rukis
            04.02.2019 22:42

            Так всё таки у вас там могут быть ошибки?


            1. xRevolveRx Автор
              05.02.2019 10:21

              Нет ошибок.


              1. MetaDone
                05.02.2019 11:01

                $table_1 = 'create'; // table name
                $query_1 = 'c'; // create table sql
                
                $fields_1 = [
                    'field_id' => [
                        'type'   => 'num', // int
                        'auto'   => true,  // auto increment
                        'length' => 255,
                        'fill'   => true   // not null
                    ],
                    'field_text' => [
                        'type'   => 'text', // varchar
                        'length' => 255,
                        'fill'   => true
                    ],
                    'field_date' => [
                        'type'   => 'time', // TIMESTAMP
                        'value'  => date('Y-m-d')
                    ]
                ];
                
                // perform queries
                $dbx::query($query_1, $table_1, $fields_1);
                

                DBX QUERY RESULT
                Array
                (
                    [status] => Array
                        (
                            [CONNECTION] => 1
                            [DEBUG] =>  [#0] [%0]
                            [SERVER] => 5.7.25-0ubuntu0.18.04.2
                            [STATUS] => Uptime: 6434  Threads: 1  Questions: 179  Slow queries: 0  Opens: 133  Flush tables: 1  Open tables: 126  Queries per second avg: 0.027
                            [sql_query_debug] => CREATE TABLE IF NOT EXISTS create(`field_id` INT(255) AUTO_INCREMENT PRIMARY KEY NOT NULL, `field_text` VARCHAR(255)  NOT NULL, `field_date` TIMESTAMP);
                        )
                
                )
                

                есть


                1. xRevolveRx Автор
                  05.02.2019 13:53
                  -2

                  И чо? Кто так таблицы именует? У меня как в БЕМ принято.


                  1. MetaDone
                    05.02.2019 13:58
                    +2

                    пох вообще, mysql позволяет создать таблицу с таким именем, а ваша поделка выдаст ошибку


                    1. xRevolveRx Автор
                      05.02.2019 14:12
                      -2

                      Да ну? А что вы скажете на это?:D

                      Кароче. Давайте на чистоту. Я сделал вещь, которая с 2011 года почти не подвергалась изменениям и единственное, что я слышу из критики это отсутствие объектов и нестандартные кавычки. Также вы попытались и нашли одну несущественную ошибку в конфигурации запроса. Я избавил кучу людей от нужды разбираться в синтаксисе SQL и облегчил жизнь тем, кому нужно быстро и просто писать архитектуру базы(я сам свою CMS писал 3 месяца чистого времени если говорить про фулл тайм).

                      Все минусующие и критикующие — подобны этой козявке. Есть но где то в носу, мешается, но пользы не приносит.

                      А также давно доказано, что никто из вас не работает. Требуете офигенных бюджетов, чтобы взять какой-то барахло типа симфони и потом долго трахаться не успевая в сроки. Сами что либо написать не способны.

                      А если способны — давайте я покритикую вас ;)


                      1. MetaDone
                        05.02.2019 14:38
                        +1

                        раз уж вы решили пооткровенничать, то ловите, только не обижайтесь. вся ваша поделка — никому не впившийся говнокод, который кроме вас никто использовать не будет.
                        Хорошо, код не менялся с 2011 года. Это значит что за все это время вы не сталкивались с задачами сложнее, чем select * from table_name, что говорит о том, что вы так и стоите на месте без какого-либо развития.

                        Также вы попытались и нашли одну несущественную ошибку в конфигурации запроса

                        Ошибка есть и не одна. И это только при беглом осмотре, если копнуть глубже — найдется еще больше.
                        Я избавил кучу людей от нужды разбираться в синтаксисе SQL

                        и заставили учить свой пришибленный на голову синтаксис, при этом не обеспечив ни join, ни возможность выборки из нескольких таблиц, ни курсоры чтоб не все в память грузить, даже group by не смогли приделать.
                        вот вам пример нормального и понятного без употребления жестких наркотиков создания таблиц
                        Schema::create('flights', function (Blueprint $table) {
                                    $table->increments('id');
                                    $table->string('name');
                                    $table->string('airline');
                                    $table->timestamps();
                                });
                        

                        А также давно доказано, что никто из вас не работает.

                        галлюцинации в ваших приходах не считаются доказательством
                        объективной критики здесь в комментариях — куча, но вам, как и некоторым php-отшельникам типа coresky (советую объединить усилия с ним, получится «шедевр»), объяснять конструктивно абсолютно бесполезно и все что остается — поржать и радоваться что подобных php-мамонтов все же становится меньше и надеяться что рано или поздно все они вымрут.


                      1. zzzmmtt
                        05.02.2019 16:26

                        единственное, что я слышу из критики

                        Что вы слышите, и что вам пишут — две большие разницы.


                        1. xRevolveRx Автор
                          05.02.2019 20:09
                          -2

                          Идите в жопу плебеи… Какаду даже понятно, что с вами ни копейки не заработаешь — одни убытки от таких бакланов. Иди дальше свои фреймворки используй. Я б тебе ни копейки не дал вообще за твои тупарылые потуги саморазвития в ключе высоко-паттерной медленной и мучительной объектно-ориентированной порнухи.

                          Факт в том, что если продукт работает и приносит деньги то всем похер как он сделан. Мои проекты не требуют вообще модернизации лет по 10, а потом их просто переписывают заново.

                          Свободны, комики… Пилить не умеете и вас не жаль.


              1. Rukis
                05.02.2019 11:02

                Деньги платят те, кто считает, что ошибки могут быть. Платят за работу по поиску. Если у вас нет ошибок, почему бы не поставить на это что-то существенное и получить профит?


  1. akdes
    04.02.2019 11:29
    +2

    велосипеды это круто, если они едут вперёд, но в этом случае, я думаю лучше будет написать SQL, ибо он будет понятен и будет служить как само-документация.

    $fields_2 = [
    'field_id' => [
    'value' => 0
    ],
    'field_text' => [
    'value' => 'Yo if field_id = 0 it\'s an insert or if id exists it\'s an update'
    ],
    'field_date' => [
    'value' => date('Y-m-d')
    ]
    ];

    Смысл ORM убрать частичную необходимость написания SQL, но при этом оставить понимание, что происходит в коде… у вас этого не дано.


    1. xRevolveRx Автор
      04.02.2019 11:54
      -2

      вот здесь.


    1. Sabubu
      04.02.2019 15:03

      Вообще-то, смысл ORM в том, чтобы (как следует из названия: object-to-relational db mapping) иметь возможность загружать и сохранять объекты в реляционную базу данных.


      1. akdes
        04.02.2019 15:07

        мой комментарий не противоречит этому, а лишь затрагивает важную часть идеи, которую не учёл Автор


      1. xRevolveRx Автор
        04.02.2019 15:29

        Вам не кажестя, что объект по удобству и композиции проигрывает массиву в данном случае?


        1. SerafimArts
          04.02.2019 15:40

          Всё ровно наоборот. Ассоциативные массивы — это семантическая лапша, в которой не то что автокомплита, но и никакой валидации не предусмотрено.


        1. Sabubu
          04.02.2019 16:25

          Нет, и вот почему:

          — для объекта легко увидеть в коде, какие у него есть поля, каких типов, с какими комментариями. Для массива — как правило, нельзя, более того, часто вам могут приходить массивы разных форматов в зависимости от того, откуда вызвана функция

          — у объекта могут быть дополнительные методы для работы с ним


          1. xRevolveRx Автор
            04.02.2019 17:23
            -1

            Посмотрите, вся моя база данным CMS RevolveR. Меняю одно поле value для каждого столбца и делаю что хочу одной строчкой в последующем:
            github.com/xShiftx/RevolveR_CMS/blob/master/core/struct/DataBase.php

            А вот к примеру инсталлятор:

            github.com/xShiftx/RevolveR_CMS/blob/master/core/libraries/nodes/NodeSetup.php

            Ну или изменение редактирование ноды и комментария:

            github.com/xShiftx/RevolveR_CMS/blob/master/core/libraries/nodes/NodeIndex.php

            Объект был бы убожеством, имхо. А еще массивы работают раза в 4 быстрее.

            p.s.: резюмируем: я нарушил все каноны и подставил зарплату MySQL разработчиков, сильно упростив их работу. За это и минусуют. Ребят, я еще JOIN напишу и вы вообще испугаетесь без денег остаться? ;)


            1. serginhold
              04.02.2019 21:06
              +1

              минусуют за типичный код начинающего программиста, который ничего не знает и не умеет, а в конкретном случае еще и не пытается понял что тут советуют

              Объект был бы убожеством, имхо

              объекты как минимум позволяют задавать строгий тип для свойств, когда массиву же вообще до лампочки что в нем лежит

              остальной бред даже комментировать не хочется

              p.s. код по ссылке еще красивше чем здесь…


        1. zzzmmtt
          05.02.2019 11:43

          Объект выигрывает у массива по удобству и композиции, в данном случае так точно.

          $someModel->id = 1;
          $someModel->name = 'some name';
          $someModel->save();
          

          А в вашем случае нужно нагородить массив, который и читать то неудобно, да и как верно тут заметили — с автокомплитом беда (хотя расширения для того же шторма имеются).
          Вся прелесть объектов в ормках — описали структуру таблиц в отдельных классах, прописали там же связи (one2one, one2many, etc), описали свою бизнеслогику для работы с конкретными данными и всё! Нужна новая запись в таблице:
          $newRow = new SomeModel();
          $newRow->someFiled = $someValue;
          $newRow->save();
          

          либо:
          $newRow = new SomeModel(['someField'=>$someValue]);
          $newRow->save();
          

          Обернули в трай-кэтч — и дальше либо выдали ошибку, либо навесили апдейт (на duplicate key например).


  1. MetaDone
    04.02.2019 11:35
    +2

    Отсутствие namespaces
    Не установить через composer
    Кривой синтаксис на массивах, ключи которого нужно вылавливать из исходников
    Отсутствие тестов
    Хотите что-то легковесное — используйте https://github.com/auraphp/Aura.SqlQuery в связке с https://github.com/auraphp/Aura.Sql


    1. xRevolveRx Автор
      04.02.2019 12:23
      -1

      Про ауру не знал, спасибо.

      Тесты собраны так же на странице примеров инструкций: s1.bild.me/bilder/110417/6643232Untitled-1.png

      Показалось, что это просто ни к чему для такого скромного движка.


      1. MetaDone
        04.02.2019 12:29
        +1

        это не тесты, прочитайте про https://phpunit.de/


        1. xRevolveRx Автор
          04.02.2019 12:31
          -1

          Ещё раз спрошу, а зачем такому маленькому коду целый PHP Unit? Вы не заигрались случаем?


          1. MetaDone
            04.02.2019 12:44
            +1

            вы хотите чтоб другие люди это использовали. а зачем использовать чью-то поделку с непонятным синтаксисом и не факт что работающую стабильно?
            Вот например тут — пути к файлам кэша захардкожены и очень легко все сломать, да и смешивать выборки из базы с кэшем очень плохая мысль, были бы тесты — вы бы вынесли кеширование отдельно, проверили что папка для него вообще доступна и что хотя бы запрос к базе выходит такой какой ожидается
            и вместо phpunit вы вполне можете использовать phpt тесты


            1. xRevolveRx Автор
              04.02.2019 13:23
              -1

              Все с вами ясно. Разбираться не хотите — так и скажите. Библиотека на 3Кб для вас серьезная проблема интеграции и так сложно блин проверить есть ли папка кэша…

              Я бы вас даже на собеседование не позвал, если бы вы ко мне устраивались.

              Мне нельзя использовать сторонние библиотеки — каждое взятое решение приходится проверять в ручную. Вам легко говорить, когда вы сам не работаете и берете то, что нравится. У вас еще и наглости хватает требовать какой-то ерунды от бесплатно распространяемого ПО. Не хотите не берите — я просто поделился разработкой и идеями бесплатно.

              Если бы я поставил симфони и композер мне пришлось бы работать еще с 500 человеками, почти с каждым, кто писал код компонентов и объяснять, что эти люди точно также написали качественное ПО, которое будет вести себя предсказуемо.

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

              Я не пишу баг репорты — я сразу «звоню» в систему и говорю, что нужно исправить. И это исправляют очень быстро и если есть еще какие-то но, то они перерабатываются в считаные секунды. Так же звонят и мне и говорят, что нужно переработать. Никто мне коммиты не делает. Это лишнее.

              Это вы для задач своего бизнеса, который поддерживаете можете рекомендовать этих людей и их разработки, но есть вещи, которые работают в разы строже.


              1. MetaDone
                04.02.2019 13:47
                +1

                Библиотека на 3Кб для вас серьезная проблема интеграции и так сложно блин проверить есть ли папка кэша

                Проблема не в размере библиотеки, а в ее качестве — интегрировать кое-как написанное на коленке решение невыгодно в принципе
                Я бы вас даже на собеседование не позвал, если бы вы ко мне устраивались

                Я бы вас тоже. И переход на личности — хамство, в своих комментариях я вроде как с аргументами критикую ваше решение, а не вас.
                Мне нельзя использовать сторонние библиотеки — каждое взятое решение приходится проверять в ручную. Вам легко говорить, когда вы сам не работаете и берете то, что нравится. У вас еще и наглости хватает требовать какой-то ерунды от бесплатно распространяемого ПО. Не хотите не берите — я просто поделился разработкой и идеями бесплатно.

                Если вам нельзя использовать стороннее, что очень странно, то это не повод писать кое-как. Может быть для вашей самописной cms это и приемлемо, но для нормальных проектов ваше решение не прокатит. И я не требую ничего от вашей библиотеки, я возьму то что больше подойдет под мою задачу, а если мне будет чего-то не хватать — отправлю pull-request туда
                Если бы я поставил симфони и композер мне пришлось бы работать еще с 500 человеками, почти с каждым, кто писал код компонентов и объяснять, что эти люди точно также написали качественное ПО, которое будет вести себя предсказуемо.

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

                Ну вы еще не висите нигде, так что не переживайте
                Это вы для задач своего бизнеса, который поддерживаете можете рекомендовать этих людей и их разработки, но есть вещи, которые работают в разы строже

                Вы не используете стандартное экранирование или подготовленные выражения, так что о строгости не с этой библиотекой говорить


                1. xRevolveRx Автор
                  04.02.2019 14:04
                  -1

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

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

                  Если вы берете в руку дорогой утюг Бош с символом R — это не просто так. Таким утюгом за счет системной программы еще и гладить проще и разработчики у этого утюга есть и в том числе с ними можно связаться в любой момент не поднимая трубку телефона.

                  То же самое и с программным обеспечением, каким бы удачным и хорошим бы ни был код — без системы он ничто, а разработчиков среди программистов не так много как вам кажется. Они не прикладывают прослушку и системную программу к своему ПО вообще. Они то мне нафиг и не нужны потому что не гаранитируют что их ПО не подставится третьими лицами.

                  Пример. Колготки миними с прослушками и системой работали весьма неплохо — бабы подставляли давление на пальчиках ног с носка колготки и мужики испытывали приятные эмоции на половых органах. Они думали, что бабы им сипатизируют и у них происходит интимная связь. Кароче кайфовали они не долго, потому что однажды проститутка с грибками на ногтях подставила свои ноги и бабы только только разработавшись получали грибок ногтей и некрасивые мозоли на ступни через систему.

                  Я разработчик системный, я не умею просто брать и пользоваться вещами, у меня прослушка может поменяться до 15 раз за сутки и где гарантия что система не подставится, когда я возьму их код с их непроверенной прослушкой?

                  Меня фаберлик недавно подставила. Моя подруга просто помазалась ее кремом и мы разговорились, включилась программистка Фаберлик и спалила что я разрабатываюсь. Я пошел на кухню доставать кастрюлю из холодильника и она меня тут же подставила, я уронил эту кастрюлю прямо на ноготь указательного пальца о чем свидетельствует синяк. Еще случай. Товарищ slice, который разрабатывает Clover из-за личной неприязни порезал мне второй палец хотя мы даже лично не знакомы.

                  Буду я у этих ебланов что-то брать? Они подставят мне все 15 человек с которыми я живу и работаю круглосуточно…? Нет не буду.

                  Если у вас нет прослушки в организме — так вы и не говорите лишнего. Я в 10 лет уже был в президентской программе с систмой и могу вам рассказать еще больше.

                  Нельзя брать все что рекомендуют. Разработчиков на планете реальных всегда порядка 50 000 — остальные просто приживалы и у них мы ничего никогда не возьмем потому, что оно говно.

                  p.s.: intel 3 c прослушкой выигрывает i7 без системы.


                  1. peresada
                    04.02.2019 14:15

                    Что-то вообще не ожидал подобного комментария… Видимо не быть мне программисткой Фаберлик :(


                  1. MetaDone
                    04.02.2019 14:24
                    +1

                    Если вы берете в руку дорогой утюг Бош с символом R — это не просто так. Таким утюгом за счет системной программы еще и гладить проще и разработчики у этого утюга есть и в том числе с ними можно связаться в любой момент не поднимая трубку телефона.

                    Увидел знак на чайнике, попытался связаться с разработчиками. Коллеги попросили не употреблять на работе.


                    1. xRevolveRx Автор
                      04.02.2019 22:38

                      Послушайте лучше песенку и идите дальше в свой лес…

                      Есть такой термин радиотелепатия. Есть чипы ;)

                      p.s.: метадон говно… с героина чтоли отбился?


                      1. MetaDone
                        04.02.2019 22:47

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


                        1. xRevolveRx Автор
                          05.02.2019 10:29
                          -1

                          Ладно. Большинство о своем причастии рассказать не сможет, увы. А на хабре таких людей еще много(человек 15 в прослушку ко мне заглядывало). Карму сброшу через пару недель и поедем дальше. Больше я вам ни чего не расскажу. Но за вредность сломаю вам просто ядро на процессоре. Будете или новый покупать или сидеть на x86.

                          И это жаль, что эти древолы отрицают то, что им не дано получить. Мне вот без разницы шизофреником менясчитают или наркоманом. Моя жизнь удалась и я себе ни в чем не отказываю.

                          ФСБ еще меня поругали, что я с придурками разговариваю. Дословно: Зачем ты с этими придурками общаешься? Тебя мы не привлекаем потому что давно знаем, а они нам вообще не нужны. Подставили бы и нас еще так же как тебя.

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

                          Покеда…


                          1. oxidmod
                            05.02.2019 11:24

                            ФСБ свой софт на пыхе пишет?


                            1. SerafimArts
                              05.02.2019 12:26

                              Пишут. Приглашали меня лет 5 назад к ним, но там з/п уровня джунов в мелких конторах, а для получения допуска 2го уровня (с повышением з/п соответственно) нужно загран.паспорт сдать и быть невыездным. Ну и по технологиям там тоже всё очень тухло, софт на сертификацию надо сдавать, а это долго и муторно.


                  1. artemev
                    04.02.2019 14:25
                    +1

                    Этот комментарий многое объясняет...


                  1. SerafimArts
                    04.02.2019 15:45

                    Я вот читаю комменатрии и до сих пор не понимаю что за «прослушка» такая? Может кто-нибудь объяснить?

                    Вначале я думал, что это обычное тривиальное логгирование. Потом аналитика, вроде Centry или NewRelic. Потом подумал про «прослушку» от ФСБ (куда уж без этого в 2019ом-то году?). Теперь же я вообще не понимаю о чём автор…


                    1. MetaDone
                      04.02.2019 16:36

                      насколько я понял под «прослушкой» подразумевается некий скрытый канал в «системе», через который автор общается и принимает патчи от других разработчиков
                      «На западе давным давно принято, что любой разработчик помимо доступности в багтрекере и имейл имеет фидбэк в системе через прослушку, а мне все эти разработчики нафиг не нужны потому что меня системники за яйца подвесят, если окажется, что эти люди фиговые разработчики. И дело тут не в коде, а в мозгах, которые прикладываются по умолчанию и связях людей, которые этот код писали»
                      судя по этому отрывку, канал связи секретный, и у разработчиков PDO его нет, а у разработчиков mysqli он есть
                      «Я не пишу баг репорты — я сразу «звоню» в систему и говорю, что нужно исправить»
                      «Колготки миними с прослушками и системой работали весьма неплохо — бабы подставляли давление на пальчиках ног с носка колготки и мужики испытывали приятные эмоции на половых органах» — судя по всему канал связи один и тот же, скорее всего что-то типа телекинеза/телепатии/торсионных полей/другое сильное колдунство
                      как-то так, надеюсь, автор расскажет подробности. мне было бы очень интересно узнать о «прослушке» и «системе»
                      p.s. я ничего не употребляю, это лишь моя интерпретация слов автора


                      1. xRevolveRx Автор
                        04.02.2019 19:28

                        Поздно понимать. Оно редко к кому возвращается, но бывает абсолютно у всех в детстве.


                  1. M00nL1ght
                    04.02.2019 18:24

                    omg, что я только что прочитал? может кто то объяснить?


                    1. zzzmmtt
                      05.02.2019 11:47

                      Весна близко, обострение начинается видимо.


                  1. zzzmmtt
                    05.02.2019 11:46

                    А вы, я смотрю, вежливости то не обучены, равно как и русскому языку…


          1. Sabubu
            04.02.2019 15:07

            Чтобы, если я внес правки в код, я мог проверить, что он корректно работает. А как иначе? Вы мне предлагаете вручную каждую функцию проверять что ли?


    1. Sabubu
      04.02.2019 15:04

      Справедливости ради, половина JS библиотек и часть питоновских используют такой же «кривой синтаксис на массивах». Раздражает, когда одна и та же вещь в PHP воспринимается резко негативно, а в Node.JS — как острие прогресса.


      1. SerafimArts
        04.02.2019 15:50

        В 2000х годах в PHP это тоже было нормой, потом сообщество повзрослело. Сейчас же, имхо, JS переживает такое же время. Слишком молодое сообщество.

        А на питоне в основном пишут математики, которые довольно далеки от профессиональной разработки ПО, по-этому такой стиль и прижился.

        Опять же, повторюсь, это моё имхо и может вообще не совпадать с мнением большинства.


      1. kirilloid
        05.02.2019 15:16

        Очень смешно про "кривой синтаксис на массивах" в js, учитывая, что там вообще-то нет отдельно ассоциативных массивов (словарей, хешмапов) — там только объекты. А самое главное: какой (не кривой) синтаксис использует вторая половина библиотек на js, которые типа правильные?
        За Питон ничего не скажу, объекты с полями и словари там разное, но про местным библиотеки не в курсе.


        1. SerafimArts
          05.02.2019 22:08

          А самое главное: какой (не кривой) синтаксис использует вторая половина библиотек на js, которые типа правильные?


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


          1. kirilloid
            06.02.2019 19:08

            Так в том-то и дело, что различие из php ($a['foo'] vs $a->foo) неприменимо к js. Насколько мне известно, нет в js аналогичных двух способов делать, скажем так, data transfer / config object.
            Хотелось бы посмотреть на этот "правильный" vs "неправильный" синтаксис.


            1. SerafimArts
              06.02.2019 21:47

              Хотелось бы посмотреть на этот «правильный» vs «неправильный» синтаксис.


              Пример А (PHP -> JS)
              Возьму пример вот из этого коммента: habr.com/ru/post/438762/#comment_19711946

              Правильный:
              Schema.create('flights', (table: Blueprint) => {
                  table.increments('id');
                  table.string('name');
                  table.string('airline');
                  table.timestamps();
              });
              


              Неправильный:
              schema({
                create: [
                  flights: {
                    id: {type: "int", length: 11, increment: true},
                    name: {type: "varchar", length: 255},
                    airline: {type: "varchar", length: 255},
                    created_at: {type: "timestamp", default: db.expression('CURRENT_TIMESTAMP')},
                    updated_at: {type: "timestamp", nullable: true}
                  }
                ]
              });
              


  1. MLman
    04.02.2019 11:41
    +1

    xRevolveRx Маленькая синтаксческая ошибка: «Doctryne» -> «Doctrine»


    1. xRevolveRx Автор
      04.02.2019 11:41

      Спасибо!


    1. zzzmmtt
      05.02.2019 12:24

      Да море их там, Tymestamp например.


  1. dopusteam
    04.02.2019 12:54
    +1

    $dbx::query('s|field_id|asc|100|0', $table_1, $fields_1);


    Почему бы не сделать нормальные методы create\update\remove… вместо магических строк?

    Как парсится 's|field_id|asc|100|0'? регулярка? багоферма потенциальная?
    что если мне нужно пропустить один из параметров?
    что если у меня в названии колонки есть '|'?

    Жертвовать читабельностью и статическим анализом ради краткости не следует

    'field_id' => [
    'type' => 'num', // int
    'auto' => true, // auto increment
    'length' => 255,
    'fill' => true // not null
    ],

    зачем в массиве полей каждый ключ начинается с 'field_'?
    зачем свои наименования? 'fiil' => true, почему не not null например сразу? почему type 'num' — это int вдруг? абсолютно сбивает с толку

    Как это

    $fields_2 = [
    'field_id' => [
    'value' => 0
    ],
    'field_text' => [
    'value' => 'Yo if field_id = 0 it\'s an insert or if id exists it\'s an update'
    ],
    'field_date' => [
    'value' => date('Y-m-d')
    ]
    ];
    // perform queries
    $dbx::query('in', $table_1, $fields_2);


    вдруг превратилось в

    INSERT INTO `revolver__comments` (`field_id`, `field_content`)
    VALUES ('5', 'TEST UPDATE')
    ON DUPLICATE KEY UPDATE `field_id`='5', `field_content`='TEST UPDATE';


    откуда в запросе взялись field_content и куда делся field_date? Или это не связанные части? Что за
    'field_id' => [
    'value' => 0
    ],
    ? как задать другое ограничение например, на другие поля?

    Мне показалось, что использование полей criterion_field и criterion_value усложняет систему
    что это за поля вообще?


    1. kirilloid
      05.02.2019 15:18

      А разве в SQL можно в названии колонки использовать "|"? так-то претензия обоснованая, просто не сталкивался с таким.


      1. zzzmmtt
        05.02.2019 16:29

        Так не только в названии, в значение если запихнуть, как сие поделие себя поведёт?


  1. Sabubu
    04.02.2019 15:25

    Вы используете статические методы тут: https://github.com/xShiftx/Revolver_DBX/blob/master/DBX.php


    Но зачем тогда конструктор? Конструктор используется для создания объекта. У вас же нельзя создать 2 объекта, так как при создании второго вы в конструкторе перезапишете статические свойства ( host, user, pass ), которые использует первый объект. Уважаемый автор, я вижу, что вы не понимаете ООП, если вы хотите использовать классы, изучите их, пожалуйста. Или же пишите тогда код без классов.


    Ваш код очень тяжело читать и понимать. Вот смотрите:


    public static function query($dbx_q, $dbx_t, $dbx_f) {

    Непонятно, что значит q, t, f. Непонятно, какие данные в них надо поместить. Не надо писать, что это значит, на Хабре, просто дайте переменным понятные имена и добавьте комментарий в код. Согласитесь, это выглядит в разы лучше:


    /** Комментарий в формате phpDoc */
    public function query(string $sql, array $parameters = [])

    Непонятный код тут:


    if( isset($dbx_q[2]) ) {
        switch ($dbx_q[2]) {
             case 'asc':
                  $SQL_0 .= ' ASC';

    Из этого фрагмента кода непонятно, что именно хранится во втором элементе $dbx_q, что значит ноль в $SQL_0. Наверняка это есть в вашей голове, но я не телепат и понять это не могу.


    public static function setHash() {

    Непонятно, что такое hash. Комментариев в коде нет.


    while($row = mysqli_fetch_assoc($result)['field_'. explode('__', self::$sql_hash_table)[1]]) 

    Это непонятный код. Непонятно, что такое sql_hash_table, зачем ее разбивать по двойному подчеркиванию, и что там будет в элементе номер 1.


    $cacheFile = file_get_contents($_SERVER["DOCUMENT_ROOT"] .'/private/cache/'. self::$sql_hash_table .'.cache', true);

    Вы зря вписали кеш прямо в код, а не сделали внешним элементом. Из-за этого мы не можем даже поменять папку кеша, не говоря о замене кеша на redis или apcu. Вы работу с кешем даже в отдельную функию вынести поленились. Не пишите длинные простыни кода, разбивайте код на функции.


    public static function escape( $string ) {
            return htmlspecialchars(addslashes(preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $string)));

    Вы можете объяснить принцип работы этой функции? У меня ощущение, что вы просто поставили несколько функций наугад без какой-то теоретической основы.


    И, автор, где тесты? Вы тестировали, например, что при вставке данных в БД с помощью вашего класса символы с любыми кодами возвращаются в неизменном виде? У меня, судя по виду функции escape, есть ощущение, что это не так, и ваш класс искажает вставляемые данные.


    То, что в index.php — это не автоматизированные тесты, а ручные, так как надо визуально проверять, правильный ли результат вернула функция. И там нет теста, который бы проверял вставку символов со всеми возможными кодами, что они вставляются и возвращаются без искажений.


  1. SbWereWolf
    04.02.2019 21:55

    Как было сказано выше — как хобби проект для себя любимого — норм.
    Как продукт который могут использовать дургие — вообще нет.
    *цать лет назад возможно было бы «да», но не в 2019 когда для всего есть фреймворки и у каждого фремворка есть и ОРМ, и другой инструментарий, и «плагины», ответ уже «нет».


  1. AlexLeonov
    05.02.2019 00:51

    Да что же это такое… Как ни зайдешь в блог PHP что-то интересное почитать на ночь, про стандарты там, про PHP 8, про PHPConf в мае — так сразу шизофазия какая-то, mysqli и шизокод… Кто и зачем вытащил это из песочницы?


    1. rudinandrey
      05.02.2019 08:05

      это тот редкий случай, когда комментарии автора читать интереснее самого топика. Выше в ветке даже не шизофазия, а шизофрения, ну или соль какая то, я не знаю что он принимает.
      >> Кто и зачем вытащил это из песочницы?
      между PHP и Python идет «священная война», видимо это какой то войн из протестующего лагеря вытащил чисто поржать над PHPшниками :) лишний раз ткнуть носом, видишь ужас там какой, переходи на светлую сторону и все такое.


      1. Compolomus
        05.02.2019 08:21

        Там и в других статьях можно почитать. Js например :)


  1. Compolomus
    05.02.2019 02:58

    Когда фреймворки только зарождались, похожий велосипед я тоже писал, конечно выложить я бы его не осмелился). Но мне в году 2011 примерно понравился mysqli в ОО стиле, потому что методы и автокомплит, самих методов огромная куча, как функции в mysql расширении.
    Из минусов это совсем не удобная работа с плэйсхолдерами (сделал по аналогии как в PDO)
    Ну и затея была больше сделать query builder, чтоб не писать запросы.
    Ну а автор похоже адепт "Чистого кода"
    Может кто слышал про таких сектантов))


    1. vdem
      05.02.2019 14:13

      Я вообще не понял при чем здесь ORM (Object-Relation Mapping) в статье :)
      Сам тоже свой велосипед писал (и сейчас его конкретно переделываю, для небольших проектов самое то), и от концепции query builder решил отказаться, так как SQL всё же гораздо гибче и честно говоря его читать ИМХО проще, только самые простые запросы создаются автоматом, например вставка записи:

      $db->users[] = [null, 'john', 'john.smith@example.com'];
      

      Ну или если указывать названия столбцов
      $db->users[] = ['id' => null, 'name' => 'John', 'email' => 'john.smith@example.сom'];
      

      (вовсю используются магические методы и интерфейсы типа ArrayAccess)
      Так же можно вставлять и объекты, а выборка записей автоматом — или всё из таблицы, или одну запись по ключу, или писать свой SQL.
      $user = $db->users->id[15];
      

      Всего пара десятков классов в пакете.


      1. Compolomus
        05.02.2019 15:36

        Покажите? Тоже магию сильно напилил. Но как по мне, теряется читабельность


        1. vdem
          05.02.2019 16:50

          Только что закоммитил изменения, я уже пару месяцев не занимался проектом. Оно еще в стадии постоянного переделывания, и текущий вариант мне не особо нравится, и там надо еще избавиться от зависимостей от двух других самописных пакетов (конфигуратор и PSR-совместимый логгер). Ну и PHPDoc надо добавить/поправить, и тестов нет пока, и в работе этот вариант еще не использовался. Раньше был просто один класс, а сейчас для небольших проектов использую чистый PDO пока не закончу вот это поделие.

          Вот здесь оно

          test.php
          require_once('vendor/autoload.php');
          
          $config = new queasy\config\Config('config.php');
          $logger = new queasy\log\Logger($config->logger);
          $db = new queasy\db\Db($config->db, $logger);
          
          $logger->info($db->selectLocation(22));
          $db->address_locations[] = [
              [
                  'address',
                  'lat',
                  'long'
              ], [
                  [
                      '!!ijkl333---',
                      '!!123333---',
                      '!!456333---'
                  ], [
                      'FWEFEW',
                      'fwefwevw',
                      '4525t2tt'
                  ]
              ]
          ];
          
          $logger->debug('total records: ' . count($db->address_locations));
          $logger->debug($db->address_locations->id[12]);
          


          1. Compolomus
            05.02.2019 18:55

            Глянул, работы там еще много, я бы отказался от php 5.3, тем более у Вас там трэйты


            1. vdem
              05.02.2019 19:09

              Я бы с удовольствием отказался от поддержки PHP5.3, и насчет трейтов в курсе (они в 5.4 появились, я вот думаю как в этой версии с поддержкой 5.3 попроще обойтись без трейтов), но еще время от времени попадаются заказчики «что было хорошо для наших дедов, то будет хорошо и для нас» и их невозможно уговорить перейти на версию поновее (например ситуация когда есть некая огромная совсем легаси система и средств на ее переделывание под новые версии нет, и к ней нужно что-то более-менее отдельное допилить, например скрипт который будет запускаться через cron). Когда и если все пакеты будут более-менее готовы и в работе это поделие себя покажет удовлетворительно, возьмусь за версию для PHP7 (со всеми новыми фичами, так что она будет несовместима со старой), а к этой буду разве что при случае что-то допиливать. Как-то так. Вообще я когда еще с PHP4 имел дело (а тогда я в основном с C# и Java работал) то так руки и тянулись что-то этакое написать, так как повторять одно и тоже в каждом файле (инклуды и т.д.) явно антипаттерн, но тогдашние поделки были кошмарны (вот как раз на уровне тех самописных фреймворков, про которые тут время от времени попадаются статьи), да и PHP я толком не знал.


              1. Compolomus
                06.02.2019 02:44

                Боюсь 5.3 там уже не получится подерживать, один трэйт ещё можно обычным наследованием победить, ну и опять же, зависит от ситуации, если всего один трэйт, его надо тащить минимум в два класса, то я выбрал бы абстрактный класс, ну а так, вроде как текущий код уже не поехает на 5.3. С выходом семёрки забыл про php5, как страшный сон


            1. vdem
              05.02.2019 19:20

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


              1. SerafimArts
                05.02.2019 22:10

                Мне в них не нравится куча сторонних зависимостей, в том же Laravel простая страничка с одним запросом к базе подключает ~350 файлов.

                А что, это проблема? Всё равно же потом всё в опкеш прилетает и через DCE лишнее вырезается.


                1. vdem
                  05.02.2019 22:18

                  Да не проблема в общем, все равно не нравится. Для серьезных проектов все равно Laravel, а допилю я свою задумку до чего-то юзабельного или нет — еще неизвестно.


              1. Compolomus
                06.02.2019 02:53

                Композер впринципе помогает не писать много кода, выбрать запчасти с разных фв, сделать адаптеры, лара не очень нравится, вот отдельные запчасти ещё может куда не шло, но а так, какой то он монолитный что ли, если бы psr сразу бы все начали придерживаться, было бы удобнее.
                Ну а фв свой написать для понимания других стоит. В процессе приходит понимание, как там все внутри работает, и видишь плюсы и минусы разных решений


  1. zzzmmtt
    05.02.2019 11:49

    И так, это DBX — движок базы данных MySQL для PHP на основе библиотеки MySQLi основанный на запросах вида структурного описания таблиц и полей базы данных в виде обычного массива с функцией статического кэширования запросов и автообновления хэша статики.

    Движок? Серьёзно?


  1. Quiz
    06.02.2019 23:53

    Херовй из тебя фуллстек. Но идеи интересные.