almost 6 years ago

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

Создание базы данных и таблицы логинов

CREATE DATABASE my DEFAULT CHARACTER SET UTF8;
USE my;
CREATE TABLE logins (
  id INT UNIQUE AUTO_INCREMENT PRIMARY KEY,
  hostname VARCHAR(255) CHARACTER SET UTF8,
  type VARCHAR(255),
  address VARCHAR(255),
  login VARCHAR(255) CHARACTER SET UTF8,
  password VARCHAR(255) CHARACTER SET UTF8,
  alias VARCHAR(255) CHARACTER SET UTF8
);

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

  • hostname
    Адрес сервера, к которому относится логин. Лично я для простоты пишу без http://, и указываю https:// перед адресом только если подключение явно осуществляется по HTTPS

  • type
    Тип подключения. В моей ментальной модели учётных записей существуют следующие типы подключений:

    • http Подключение к веб-сайту через браузер, обычно такие пароли — от админских панелей веб-сайтов
    • ftp FTP подключение.
    • panel Это подключения к админской панели учётной записи на хостинге.
    • mysql Пароли от MySQL серверов напрямую
    • phpmyadmin Подключение к phpMyAdmin. Бывает, что напрямую подключение к MySQL серверу запрещено, а взаимодействие с БД осуществляется через интерфейс phpMyAdmin. В таком случае получается, что логины/пароли — от базы данных, а адрес относится к Сети, а не к Интернету. :)
    • address Адрес на сервере [hostname], который относится к учётной записи. Я пишу сюда путь до админской панели в случае [type] == "http", и название каталога на FTP сервере в случае [type] == "ftp". Для [type] == "mysql" и [type] == "phpmyadmin" сюда можно писать название базы данных. В общем, полезное поле.
    • alias Вряд ли вы веб-сайты, к которым у вас есть учётные записи, называете по [hostname]. Это поле содержит запоминающееся название этого веб-сайта. Оно очень важно, потому что поиск, который мы сделаем в сделующем разделе, будет искать по альясам.

Поиск по базе

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

INSERT INTO logins (alias, hostname, type, login, password, address)
  VALUES ('Рога и Копыта', 'kopyt.xx', 'http', 'batras', 'TOPSECRET', '/bx/admpanel');

Извлечение из таблицы сведений делается, например, так:

SELECT type, hostname, login, password, address FROM logins WHERE alias like '%Копыт%'; 

Однако, это, конечно, ужасно. Я всегда ищу по альясам, а типов не так уж и много, переживу, если СУБД мне выдаст не одну строчку, а пять. Поэтому воспользуемся PL-SQL и создадим процедуру, которая уменьшит требуемое количество набираемых символов.

DELIMITER //
CREATE PROCEDURE find_login(IN alias_str VARCHAR(255))
BEGIN
  SELECT type, hostname, login, password, address FROM logins
    WHERE alias LIKE CONCAT('%', alias_str, '%');
END// 

Использовали подмену разделителя команд, чтобы можно было вставить в тело процедуры точку с запятой. Теперь можно искать учётные записи по части альяса:

CALL find_login('Копыт');

Здесь я DELIMITER вернул обратно, конечно же. :) Всё, теперь жить можно. Аналогично можно сделать процедуру для укорочения INSERT INTO, но я думаю, что это уже жлобство.

 
comments powered by Disqus