DataIncrement — дополнение к возможностям phpMyAdmin

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

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

    Проще показать в формате было-стало:

    Было

    image

    Стало

    image

    Задача


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

    Решение


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

    В результате получился сайт DataIncrement.com

    Как работает DataIncrement


    1. Подключаем свою базу данных на DataIncrement, используя host, name, pass, dbname (пароль сохраняется в куках браузера или в сессии, т.е. на сайте не храниться, если что). У вас должен быть пользователь с возможностью подключения с любого хоста.
    2. Регистрация всех действий происходит через подтверждение по почте. Возможно это спорное решение, но пока так. Поэтому идем в почту и жмем ссылку из письма. Таким образом подтверждаем подключение.
    3. После этого можно перейти к списку подключенных БД, на главной странце dataincrement.com
    4. Затем кликаем на подключенную БД — это будет страница со списком всех доступных таблиц.
    5. Далее нужно перейти на вкладку «Links» (вторая ссылка от названия базы «Пример базы» на картинках «Было-Стало»), где нужно настроить связь между таблицами для отображения связанных данных. С помощью записи не хитрого текста, например:

    @link city
        country_id = country.country_id
            name
        region_id = region.region_id
            name
    

    Где:

    • на первой строке: @link — это обозначение секции, а city — это имя таблицы
    • далее обязательно с новой строки и обязательно отступ слева
    • начинается описание полей таблицы city, для которых будет настроено отображение, т. е.
      country_id = country.country_id — это поле `city`.`country_id` = `country`.`country_id`
    • далее обязательно с новой строки и более глубоким отступом
    • название поля для дополнительного отображения, т. е. `country`.`name`

    Таким образом мы получаем отображение таблицы с картинки «Стало», где кроме реального значения поля, через точку с запятой отображается значение поля `country`.`name`. Таким же образом сделана настройка для другого поля `region_id `, которое связано как видно из настройки с полем `region`.`region_id`.

    image

    Редактирование


    Редактирование данных происходит по двойному клику в ячейке таблицы. Тогда внизу страницы появляется спец. панель где можно изменить значение и отправить данные на изменение.

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

    Для настройки поисковых запросов будет использоваться похожий синтаксис, как и для секций @link, только с ключевым словом @search

    @search city
        country_id = country.country_id 10
            name $*
    

    где отличие заключается в том, что:

    1. указывается ограничение возвращаемых строк, через пробел — это цифра 10
      country_id = country.country_id 10
    2. далее указываются поля для отображения, но через пробел, дополнительно указывается поисковый шаблон, где доллар $ — это введенное значение, а звездочка * — означает какие угодно символы.
      Сейчас у меня указано $* для поля `country`.`name`, т. е. поиск по имени будет работать по начальным буквам слов в указанном поле.
      Шаблон может иметь четыре варианта: $, *$, $*, *$*

    Заключение


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

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

    Заметка написана, как попытка не загромождать главную страницу DI всякими «лендингами» с описанием не понятно чего, но чтобы можно было дать ссылку на описание и принцип работы. К тому же сразу с независимой критикой, из серии — «вам же говорили».
    Поделиться публикацией

    Комментарии 16

      +2
      а это разве безопасно?
      Подключаем свою базу данных на DataIncrement, используя host, name, pass, dbname (пароль сохраняется в куках браузера или в сессии, т.е. на сайте не храниться, если что).
        0
        Смотря относительно чего мерить.
        1. Если относительно первого попавшегося приложения для телефона, чтобы быстро поправить какое-то поле в базе. Например, выключить подписку пользователю. Тогда вполне безопасно, потому что пароль храниться в куках браузера.
        2. А если относительно компа без выхода в интет — то под вопросом конечно.
          0
          Ну вы приколисты, а ничего, что у вас сайт даже без https. Т.е. все пароли к базе гоняются в каждом запросе в открытом виде.
            0

            Https это тоже не надёжно. Сейчас думаю сделать через скрипт.
            Суть в том, что вы скачивание к себе на сервер короткий скрипт-транслятор запросов. Таким образом некакие пароли не будут выглядывать на руку в принципе. Доступ к этому скрипту можно ограничить легко по ip и секретному ключу. Таким пароли будут гарантировано спрятаны, и проще в настройках, и логирование запросов делается в пять минут.

              0
              Первое правило в криптографии — не нужно выдумывать криптографический велосипед.

              Более, чем достаточно, поставить let's encrypt для начала. То что вы говорите, что данные только в куки передаются ничего особо не даёт к безопасности, так как безопасность на доверии — это не безопасность. Но то, что эти данные передаются в открытую по сути говорит о том, что о безопасности особо не задумывались. Тем более, что настройка Let's Encrypt бесплатна и делается в пару кликов, ладно бы вам нужно было сертификат за пару тысяч баксов покупать.

              Насчет ненадежности https, это уже смешно, достаточно его настроить в соответствии с советами профи. Вряд ли кто-то будет проводить атаку MITM, с подделкой сертификата в случае вашего сервиса, если им конечно не будут пользоваться админы каких-то банков.
        0
        боже мой!
          0

          извините, но неудобно пишется слитно

            +1
            пароль сохраняется в куках браузера или в сессии
            так в куках или в сессии? а то получается хранится
              0
              Изначально, сохраняется в сессии. Чтобы можно было просто закрыть страницу и пароль точно нигде не записался. А вообще на странице настроек базы, можно настроить где хранить данные. Это актуально для имени пользователя и пароля. Вариантов хранения три: на сервере, в сессии, или в куках браузера.

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

              Собственно для серверов за NAT'ом уже не подойдет…
                0

                Думал про это, поэтому одна из идей написать открытый скрипт, который будет выкладываться на удаленный сервер для транслировать запросов и возвращения результатов в DataIncrement, для отображения. Типа микросервис по http.
                Таким образом DI, вообще не будет в курсе параметров подключения к базе, а будет пользоваться лишь заданной ссылкой для отправки и получения данных.

                  +1
                  вам уже много людей намекнуло и прямым текстом сказало — худшую архитектуру всего «проекта» придумать сложно.
                    0
                    Относительно какой архитектуры вы считаете?
                +3
                ЭЭЭ… Но ведь phpMyAdmin прекрасно умеет делать это самостоятельно. Указываете связи между таблицами и в обзоре таблицы по кнопке Параметры есть Отображение связанного поля.
                  –1

                  Здорово, если так. Возможно это сделано как-то не очевидно, что я пропустил. Пма очень навороченный, им надо уметь пользоваться.
                  А он умеет показывать два поля, например? Или если сложная связь через таблицу.
                  А может ли он подсказывать id записей, если мы вводим значение из другого поля связанной таблицы, например?

                    0
                    Ну это вам уже лучше самостоятельно. Я не погружался в детали

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

                Самое читаемое