Ошибка установки соединения с базой данных в wordpress

FULL OUTER JOIN (полное внешнее соединение)

Запрос с оператором FULL OUTER JOIN предназначен для соединения таблиц и вывода результирующей таблицы,
в которой данные полностью пересекаются по условию, указанному после ON, и дополняются записями
из первой (левой) и второй (правой) таблиц, даже если они не соответствуют условию. У записей,
которые не соответствуют условию, значение столбцов из другой таблицы будет NULL (неопределённым).

Пример 6. База данных и таблицы —
те же, что и в предыдущих примерах.

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

SELECT Parts.Part, Categories.Catnumb AS Cat, Categories.Price
FROM Parts FULL OUTER JOIN Categories
ON Parts.Cat = Categories.Catnumb

Результатом выполнения запроса будет следующая таблица:

Part Cat Price
Квартиры 505 210,00
Автомашины 205 160,00
Доски 10 105,00
Шкафы 30 77,00
Книги 160 NULL
NULL 45 65,00

В результирующей таблице есть записи Книги (из левой таблицы) и с категорией 45
(из правой таблицы), причём у первой из них неопределённая цена (столбец из правой таблицы), а у второй —
неопределённая часть (столбец из левой таблицы).

  • Страница 2 (Особенности соединения трёх и более таблиц)
  • Страница 3 (FULL JOIN для соединения непересекающихся результатов)

Интерфейсы Connection и DatabaseMetaData и класс DriverManager

JDBC обеспечивает программный интерфейс API, позволяющий при помощи языка программирования Java получать доступ к данным, хранимым в таких источниках, как реляционная база данных, а также обрабатывать их. API включает в себя пакет java.sql, называемый основным API для JDBC, а также пакет javax.sql, являющийся необязательным API для JDBC (он включен в поставку J2SE версии 1.4).

Описываемые здесь интерфейсы и класс можно найти в пакете java.sql.

Интерфейс Connection представляет сессию соединения с базой данных, обеспечиваемую драйвером. Он также обеспечивает методы для создания выражений, управления соединениями и их свойствами. Метод ConnectiongetMetaData:

бросает исключение SQLException.

Класс DriverManager является классом утилиты, управляющим JDBC-драйверами. Он содержит список зарегистрированных в системе JDBC-драйверов и устанавливает соединение с драйвером. Данный класс используется в основном для получения ссылки на объект Connection посредством метода getConnection:

  • getConnection(String url)
    Пытается установить соединение с URL-адресом заданной базы данных.

  • getConnection(String url, Properties info)
    Пытается установить соединение с URL-адресом заданной базы данных. Параметры: url – адрес в формате jdbc:subprotocol:subname, info – список произвольных пар тег/значение типа String, передаваемых в качестве аргументов соединения. Обычно должна быть включена хотя бы одна пара «имя пользователя»/«пароль».

  • getConnection(String url, String user, String password)
    Пытается установить соединение с URL-адресом заданной базы данных. Параметры: url – адрес в формате jdbc:subprotocol:subname, user – пользователь базы данных, от имени которого устанавливается соединение, password – пароль пользователя.

Интерфейс DatabaseMetaData обеспечивает информацию о самой базе данных. Некоторые методы в этом интерфейсе принимают форму строк. Метод, извлекающий информацию о свойстве, не поддерживаемом драйвером, бросает исключение SQLException.

Вот несколько методов данного интерфейса:

  • getDriverName
    Извлекает имя текущего JDBC-драйвера.

  • getDriverVersion
    Извлекает значение версии JDBC-драйвера в виде строки.

  • getDatabaseProductVersion
    Извлекает значение версии текущего продукта БД.

Программные задачи

  • Создайте программу, устанавливающую соединение с вашей базой данных

  • Отобразите информацию о базе данных и о драйвере, используемом для установки соединения

Методы для получения доступа к информации о базе данных доступны посредством интерфейса DatabaseMetaData, ассоциированного с соединением.

Возможное решение задачи.

Подключение при помощи PHP к MySQL с расширением PDO

PDO означает PHP Data Objects.

PDO_MYSQL реализует интерфейс PDO, предоставляемый РНР для подключения программы к базе данных MySQL.

В большинстве дистрибутивов Linux (например, CentOS и RedHat), PHP-PDO пакет уже входит в пакет PHP-MySQL. Таким образом, вам не придется искать и устанавливать пакет PHP-PDO. Все, что вам нужно сделать, это установить пакет PHP-MySQL, чтобы получить работающее расширение PDO_MYSQL PHP в вашей системе.

Создайте следующий файл MySQL-pdo.php в вашим Apache DocumentRoot:

<?php
  try {
    $conn = new PDO("mysql:host=localhost;dbname=andreyex", "root", "mySecretDBpass");

    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo 'Подключение к базе данных.<br>';

    $sql = 'SELECT name FROM employee';
    
    print "Имя Сотрудника:<br>";
    foreach ($conn->query($sql) as $row) {
        print $row . "<br>";
    }
    $conn = null;

  }
  catch(PDOException $err) {
    echo "Ошибка: не удается подключиться: " . $err->getMessage();
  }
?>

В приведенном выше:

  • новый PDO – Создаст новый объект PDO, который будет принимать следующие три аргумента:
    1. Строка подключения MySQL: будет в формате “mysql:host=$hostname;dbname=$dbname”. В приведенном выше примере, БД работает на локальном хосте, и мы подключаемся к базе данных andreyex.
    2. Имя пользователя для подключения к MySQL.
    3. Пароль для пользователя mysql.
  • $sql variable – создание запроса SQL, который вы хотите выполнить. В этом примере, мы выбираем столбец name из таблицы employee.
  • query($sql) – здесь мы выполняем SQL запрос, который мы только что создали.
  • foreach – вот здесь мы пробегаем по вышеуказанным командам и сохраняем их в переменной строке $, а затем мы показываем их с помощью команды печати.
  • В MySQL PDO, чтобы закрыть соединение, просто обнулите значение переменной $conn.

При вызове mysqli.php из вашего браузера, вы увидите следующий вывод, что свидетельствует о том, что PHP был в состоянии подключиться к базе данных MySQL и сделать выборку данных.

Подключение к базе данных.
Имя Сотрудника:
AndreyEx
Ruslan
Maria
Oleg

CROSS JOIN (перекрестное соединение)

Использование оператора SQL CROSS JOIN в наиболее простой форме — без условия соединения —
реализует операцию .
Результатом такого соединения будет сцепление каждой строки первой таблицы с каждой строкой второй таблицы. Таблицы
могут быть записаны в запросе либо через оператор CROSS JOIN, либо через запятую между ними.

Пример 9. База данных — всё та же, таблицы — Categories и Parts.
Реализовать операцию декартова произведения этих двух таблиц.

Запрос будет следующим:

SELECT (*) Categories CROSS JOIN Parts

Или без явного указания CROSS JOIN — через запятую:

SELECT (*) Categories, Parts

Запрос вернёт таблицу из 5 * 5 = 25 строк, фрагмент которой приведён ниже:

Catnumb Cat_name Price Part_ID Part Cat
10 Стройматериалы 105,00 1 Квартиры 505
10 Стройматериалы 105,00 2 Автомашины 205
10 Стройматериалы 105,00 3 Доски 10
10 Стройматериалы 105,00 4 Шкафы 30
10 Стройматериалы 105,00 5 Книги 160
45 Техника 65,00 1 Квартиры 505
45 Техника 65,00 2 Автомашины 205
45 Техника 65,00 3 Доски 10
45 Техника 65,00 4 Шкафы 30
45 Техника 65,00 5 Книги 160

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

Но для CROSS JOIN можно задать условие соединения! Результат будет совсем иным. При
использовании оператора «запятая» вместо явного указания CROSS JOIN условие соединения задаётся не
словом ON, а словом WHERE.

Пример 10. Та же база данных портала объявлений, таблицы Categories и Parts.
Используя перекрестное соединение, соединить таблицы так, чтобы данные полностью пересекались по
условию. Условие — совпадение идентификатора категории в таблице Categories и ссылки на категорию в таблице Parts.

Запрос будет следующим:

SELECT P.Part, C.Catnumb AS Cat, C.Price
FROM Parts P, Categories C
WHERE P.Cat = C.Cat_ID

Запрос вернёт то же самое, что и запрос в примере 1:

Part Cat Price
Квартиры 505 210,00
Автомашины 205 160,00
Доски 10 105,00
Шкафы 30 77,00

И это совпадение не случайно. Запрос c перекрестным соединением по условию соединения полностью
аналогичен запросу с внутренним соединением — INNER JOIN — или, учитывая, что слово INNER — не обязательное,
просто JOIN.

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

  • Страница 2 (Особенности соединения трёх и более таблиц)
  • Страница 3 (FULL JOIN для соединения непересекающихся результатов)

Поделиться с друзьями

Назад Вперёд>>>

Настройка завершения работы пользователей 1С:Предприятия — Effector saver

Для успешного выполнения резервного копирования в информационной базе не должно быть активных сеансов пользователей. Чтобы автоматически завершить работу пользователей перед выполнением бэкапа в программе предусмотрен соответствующий механизм. Для настройки завершения работы пользователей 1С:Предприятия перейдите на закладку «Отключить пользователей».

Важно: в бесплатной редакции программы не реализован данный функционал. В момент запуска резервного копирования пользователям необходимо покинуть базу 1С:Предприятия, иначе выгрузка базы не произойдет

Установите флаг «Завершить работу пользователей 1С:Предприятия». Из выпадающего меню выберете один из вариантов: «Завершить сеансы на сервере 1С:Предприятия» или «Вызвать штатное завершение работы пользователей».

В случае выбора «Завершить сеансы на сервере 1С:Предприятие» — отключение пользователей происходит путем принудительного завершения сеансов на сервере 1С:Предприятия. Этот вариант подходит только для клиент-серверных баз 1С:Предприятия.

Если Вы изменяли стандартные настройки сервера 1С, возможно потребуется изменить параметры, которые идут ниже. Установите флаг «Кластер требует авторизации», если в кластере 1С:Предприятия создан пользователь «Администратор кластера». Заполните поля: «Имя администратора кластера:» и «Пароль администратора кластера:».

Важно: не путайте данного пользователя с пользователем базы 1С:Предприятия и пользователем «Администратор центрального сервера». В консоли сервера 1С:Предприятия администраторы кластера расположены по следующему пути: «Console Root» — «1C:Enterprise 8.3 Central Servers» — «(*)имя компьютера» — «Кластеры» — «Локальный кластер» — «Администраторы»

В консоли сервера 1С:Предприятия администраторы кластера расположены по следующему пути: «Console Root» — «1C:Enterprise 8.3 Central Servers» — «(*)имя компьютера» — «Кластеры» — «Локальный кластер» — «Администраторы»

Установите флаг «Используется не стандартный порт агента сервера», если порт подключения к Агенту сервера отличный от стандартного.

Заполните поле «Порт агента сервера». Порт подключения к агенту сервера 1С:Предприятия по умолчанию — 1540.

Для определения порта агента сервера зайдите в Сервер 1С и при клике правой кнопкой мыши на имя компьютера из выпадающего меню выберете «Свойства» — «Параметры центрального сервера 1С:Предприятия» — «IP порт».

В случае выбора «Вызвать штатное завершение работы пользователей»

— отключение пользователей происходит путем вызова встроенного в типовые конфигурации механизма завершения работы пользователей. Данный механизм основан на использовании процедуры «Блокировка установки соединений с информационной базой».

Алгоритм выполнения следующий:

  • Запуск завершения работы пользователей;
  • Запуск выполнения задачи (архивирование, тестирование и исправление и т.д.);
  • Запуск разрешения работы пользователей.

Возможно Вас заинтересует: Установка и настройка параметров Резервное копирование средствами 1С:Предприятия 8

Как избежать этой ошибки в будущем

Хотя нет 100% защиты от ошибки установления соединения с базой данных Вордпресс, вы можете применять 2 рекомендации для сведения к минимуму вероятности отключения сайта:

  • Используйте хороший хостинг, который оптимизирован для работы с Вордпресс и который имеет хорошую техподдержку. Настроенный для работы с Вордпресс хостинг помогает избежать многих общих проблем с Вордпресс. Я пользуюсь хостингом Бегет.
  • Настройте бэкап. Установите хороший плагин, например, UpdraftPlus и настройте . Если что-то пойдет не так, у вас всегда будет копия для восстановления.
  1. База данных Вордпресс
  2. Очистка и оптимизация базы данных
  3. Как изменить префикс базы данных
  4. Безопасность Вордпресс. Подробное описание

Проверка соединения

Первое, что нужно сделать после соединения с СУБД — это выполнить проверку, что оно было успешным. Эта проверка нужна, чтобы исключить ошибку при подключении к БД. Неверные параметры подключения, неправильная настройка или высокая нагрузка заставит MySQL отвергать новые подключения. Все эти ситуации приведут к невозможности соединения, поэтому программист должен проверить успешность подключения к серверу, прежде чем выполнять следующие действия.

Соединение с MySQL устанавливается один раз в сценарии, а затем используется при всех запросах к БД.

Результатом выполнения функции будет значение специального типа — ресурс. Если подключение к MySQL не удалось, то функция вместо ресурса вернет логическое значение типа «ложь» — . Хорошей практикой будет всегда проверять результат выполнения этой функции и сравнивать его с ложью.

Соединение с MySQL и проверка на ошибки:

Функция просто возвращает текстовое описание последней ошибки MySQL.

Копирование числовых ячеек из 1С в Excel Промо

Решение проблемы, когда значения скопированных ячеек из табличных документов 1С в Excel воспринимаются последним как текст, т.е. без дополнительного форматирования значений невозможно применить арифметические операции. Поводом для публикации послужило понимание того, что целое предприятие с более сотней активных пользователей уже на протяжении года мучилось с такой, казалось бы на первый взгляд, тривиальной проблемой. Варианты решения, предложенные специалистами helpdesk, обслуживающими данное предприятие, а так же многочисленные обсуждения на форумах, только подтвердили убеждение в необходимости описания способа, который позволил мне качественно и быстро справиться с ситуацией.

Создание Базы Данных MySQL (При необходимости)

Этот шаг можно пропустить, если у вас уже есть база данных MySQL. Если вы являетесь пользователем Hostinger, вы можете легко создать новую БД через hPanel — панель управления хостингом Hostinger, следуя простой инструкции:

  1. Найдите меню «Базы данных MySQL» в разделе «Базы данных».
  2. Заполните все необходимые поля и нажмите «Создать».

Инструкции по созданию базы данных MySQL с помощью cPanel см. в этом руководстве (англ.). Однако имейте в виду, что это пустые базы данных. Вам нужно будет заполнить их данными, прежде чем вы сможете ими управлять.

Запишите учётные данные только что созданной базы данных MySQL для следующего шага. А также не забудьте имя пользователя и пароль к БД!

5 последних уроков рубрики «PHP»

Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.

Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак

В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение

В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

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

Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

Как разорвать связь в Эксель

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

  1. Открываем меню «Данные».
  2. Находим раздел «Подключения», и там – опцию «Изменить связи».
  3. После этого нажимаем на «Разорвать связь».

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

Описание проблемы

К таким транзакциям стоит относиться подозрительно и стараться их не допускать.

Проблемы, к которым могут приводить длительные транзакции, в первую очередь связаны с избыточным потреблением каких-либо ресурсов: избыточные блокировки, избыточное потребление tempdb при работе с MS SQL Server.

Информацию по типичным причинам избыточных блокировок вы сможете найти в статье «Типичные причины избыточных блокировок и методы оптимизации».

В этой методике будет рассмотрена ещё одно достаточно неприятное проявление — избыточное потребление места в tempdb при работе с MS SQL Server.

Решения, которые работали у других

Важно отметить, что не всегда они смогут сработать и у вас. Используйте на свой страх и риск и убедитесь, что у вас есть резервная копия, если что-то пойдет не так

Диппак Миттал (один из разработчиков) заявил, что его клиент получал ошибку, что база нуждается в восстановлении. Даже после этого ошибка не исчезла. Он пробовал различные вещи и в конце концов, вопрос был решен в урле сайта. Он пошел в phpmyadmin и выполнил следующий запрос:

UPDATE wp_options SET option_value=’YOUR_SITE_URL’ WHERE option_name=’siteurl’

1 UPDATE wp_options SET option_value=’YOUR_SITE_URL’WHERE option_name=’siteurl’

Где нужно указать свой адрес сайта вместо siteurl.

Cutewonders предположил, что они убрали содержимое active_plugins в wp_options таблице и отредактировали содержимое таблицы recently_edited. В основном это, как оказалось, решило проблему.

Sachinum предположил, что он был в состоянии подключиться к базе данных с помощью testconnection.php, поэтому он изменил пользователя wp-config.php от имени суперпользователя (root user). WordPress начал прекрасно работать.

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

На этом все! Увидимся в следующих уроках и полезных статьях. До скорых встреч.

Создание .dsn файла

Этот файл определяет формат базы данных и ее физическое расположение, а также параметры
работы с этой БД ее ODBC-драйвера. Он является обычным текстовым файлом в формате Windows
.INI и может быть создан либо вручную, либо с помощью Control
Panel. Под Windows 95/98 соответствующий значок называется
ODBC Data Sources
(32-bit), а под Windows 2000 он
«скрывается» в папке Administrative Tools под
именем Data Sources (ODBC).

В окне ODBC Data Source Administrator переходим на
вкладку File DSN. По умолчанию все .dsn файлы сохраняются
в папке Program Files\Common Files\ODBC\Data Sources,
однако их физическое местоположение никак не влияет на работу приложения. Для создания
нового .dsn файла нажимаем на кнопку Add… и в
появившемся диалоговом окне Create New Data Source
выбираем подходящий из списка установленных ODBC-драйверов. Нажимаем на кнопку
Next > и вводим имя создаваемого файла (кнопка
Browse… позволяет не только обозвать файл, но и
выбрать папку, в которой он будет сохранен). Еще раз нажимаем
Next >, проверяем, правильно ли заданы имя файла
и тип драйвера, нажимаем Finish и попадаем в окно
Configure Connection, внешний вид которого зависит от
выбранного типа драйвера (например, для драйвера Visual FoxPro здесь можно задать путь к
файлам базы данных и параметры сортировки). Теперь окно Администратора можно закрыть.

Примечание: готовое приложение должно поставляться вместе с .dsn файлом
или уметь корректно генерировать его при необходимости, что предпочтительнее.

Установление соединения

Вначале необходимо создать дескриптор соединения с помощью функции

RETCODE SQLAllocConnect(
   HENV henv,
   HDBC* phdbc
);

Через параметр henv передается дескриптор окружения,
в контексте которого будет выполняться соединение. Созданный дескриптор соединения будет
записан в переменную по адресу phdbc. Пример
использования:

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

RETCODE SQLSetConnectOption(
   HDBC hdbc,
   SWORD swOption,
   SDWORD sdwValue
);

Через параметр hdbc передается дескриптор соединения;
параметр swOption должен содержать идентификатор
характеристики, а параметр sdwValue — назначаемое
ей значение. Например, для того, чтобы драйвер БД самостоятельно обслуживал результаты
выполнения операторов, используется вызов

Последним шагом является собственно установление соединения, выполняемое с помощью функции

RETCODE SQLDriverConnect(
   HDBC hdbc,
   HWND hWnd,
   UCHAR* pConnStr,
   SWORD swConnStrLen,
   UCHAR* pCompStr,
   SWORD swCompStrLen,
   SWORD* pswCompStrLen,
   UWORD uwDrvCompletion
);

Описание параметров:

hdbc
Дескриптор соединения.
hWnd
Дескриптор окна, поверх которого будут выводиться диалоговые
окна, если потребуется ввод дополнительной информации пользователем. Может быть равен
NULL.
pConnStr
Строка, определяющая источник данных. При использовании .dsn
файла она должна иметь вид FILEDSN=полное_имя_файла.
swConnStrLen
Длина строки, адресуемой параметром
pConnStr. Для строк, завершающихся двоичным нулем
(в частности, строк C/C++), можно указывать значение SQL_NTS.
pCompStr
Адрес буфера для записи в него completion
string (заполненной строки), полностью определяющей источник данных. При
использовании .dsn файла в этот буфер будет скопирован его текст.
swCompStrLen
Размер буфера, адресуемого параметром
pCompStr.
pswCompStrLen
Адрес переменной, в которую будет записана реальная длина
строки, скопированной по адресу pCompStr. Этот параметр
можно задать равным NULL.
uwDrvCompletion
Определяет, должен ли драйвер запрашивать у пользователя ввод
информации, если она необходима для установления соединения. Параметр может принимать
одно из следующих значений:
SQL_DRIVER_PROMPT
всегда запрашивать ввод информации;
SQL_DRIVER_COMPLETE
запрашивать ввод информации в том случае, если ее недостаточно или она ошибочна;
SQL_DRIVER_NOPROMPT
не запрашивать ввод информации и выводить сообщение, если ее недостаточно или она
ошибочна.

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

Повторное использование подключения к базе данных

Одна из перегруженных версий конструктора DbContext принимает объект подключения DbConnection из пространства имен System.Data.Common. Использование этого объекта может быть полезно, если вы хотите указать в нескольких объектах контекста один и тот же объект подключения и не хотите каждый раз указывать имя базы данных или строки подключения. Т.е. объект DbConnection может храниться в определенном месте приложения и вы можете ссылаться на него всякий раз, когда создаете объект контекста. Ниже показан пример:

В этом примере мы создали класс DbConnectionToMyShop, для подключения к базе данных MyShop. Объект этого класса передается в конструкторе по умолчанию класса контекста. Мы также создали для удобства перегруженный конструктор — в коде приложения вы можете просто передать нужный объект подключения. Классы подключений можно определить в одном файле и затем использовать повсеместно в приложении. Второй параметр в этом конструкторе contextOwnsConnection указывает, нужно ли очищать объект подключения при удалении объекта контекста.

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Работатека
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: