Что такое базы данных и зачем они нужны
База данных — это организованное хранилище структурированных данных. Оно нужно для накопления информации, доступа к ней и управления ею. Такие хранилища можно сравнить с каталогами библиотек. Базы данных помогают хранить и обрабатывать огромные объемы информации в структурированном виде. У пользователя появляется возможность быстрого доступа к нужным сведениям.
Вот основные функции баз данных:
- хранение информации — от сведений о клиентах и продуктах до медиафайлов и логов. Данные остаются сохранными, доступными, могут храниться долго;
- организация данных, структурированных в виде взаимосвязанных таблиц. Такой подход упрощает поиск и анализ информации;
- управление информацией — добавление, изменение, удаление, поиск;
- совместный доступ, работа с данными, возможность обмениваться информацией;
- возможность выполнения сложных запросов, создания отчетов, анализа информации.
Есть два основных вида СУБД:
- реляционные — информация представлена в виде таблиц. Примеры: MySQL, PostgreSQL, SQL Server;
- NoSQL — подходят для хранения неструктурированных данных. Примеры: MongoDB, Cassandra, Redis.
Любой IT-специалист должен понимать основные принципы работы с БД.
Самые популярные БД
MySQL. Реляционная база данных с открытым исходным кодом. Одна из самых известных СУБД в мире. Удобна для создания приложений, блог-платформ, интернет-магазинов, других онлайн-сервисов. Проста в использовании, надежна, легко масштабируется под проекты разного размера.
PostgreSQL. Еще одна мощная реляционная база данных. Отличается высокой производительностью, подходит для крупных корпоративных сервисов, для научных разработок.
MongoDB. Гибкая NoSQL-СУБД для хранения неструктурированных данных. Хорошо масштабируется под проекты разного размера. Подходит для больших хранилищ, для веб- и мобильных приложений.
Redis. Еще одна NoSQL-база данных. Хранит данные в оперативной памяти для быстрого доступа к ним. Часто используется в качестве кэша, хранилища сессий, для обмена сообщениями, ускорения работы приложений.
Microsoft SQL Server. Коммерческое решение от Microsoft для корпоративных приложений на базе Windows. Легко масштабируется, интегрируется с другими продуктами Microsoft.
SQLite3. Встраиваемая реляционная СУБД. Удобна для хранения данных мобильных приложений и небольших сайтов, не требует отдельного сервера.
Подключение PHP для поддержки баз данных
Расскажем, как работает PHP в связке с некоторыми популярными СУБД.
Для MySQL
Для работы PHP с MySQL нужно установить соединение через mysqli или PDO.
Вариант подключения через mysqli:
- создаем объект mysqli с четырьмя параметрами: сервер, пользователь, пароль, БД;
- проверяем соединение на предмет корректной работы;
- работаем с базой;
- отключаемся.
Пример:
copy
$conn = new mysqli("localhost", "user", "pass", "db");
if ($conn->connect_error) { die("Ошибка"); }
// ... работа с базой...
$conn->close();
Вариант подключения с PDO:
- создаем объект PDO с DSN (строкой подключения) и учетными данными;
- ловим ошибки командой try...catch;
- работаем с базой;
- отключаемся (присваиваем null).
Пример:
try {
$conn = new PDO("mysql:host=localhost;dbname=db", "user", "pass");
// ... работа с базой ...
} catch(PDOException $e) {
echo "Ошибка: " . $e->getMessage();
}
$conn = null;
При любом раскладе важно соблюдать правила безопасности:
- не храните данные доступа прямо в коде;
- используйте подготовленные запросы для защиты от SQL-инъекций.
Вариант с mysqli проще конкретно для MySQL. При этом PDO универсальнее, так как поддерживает разные СУБД.
Для PostgreSQL
Для работы PHP с PostgreSQL всегда используется PDO — универсальный и безопасный вариант. Это делается так:
- создаем объект PDO с DSN (строкой подключения), именем пользователя, паролем;
- прописываем DSN для PostgreSQL: "pgsql:host=хост;port=порт;dbname=БД;user=пользователь;password=пароль";
- настраиваем обработку исключений;
- работаем с базой;
- закрываем соединение (присваиваем null).
Пример:
try {
$conn = new PDO("pgsql:host=localhost;port=5432;dbname=db;user=user;password=pass");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// ... работа с базой ...
} catch (PDOException $e) {
echo "Ошибка: " . $e->getMessage();
}
$conn = null;
Не забываем о безопасности, используем транзакции, обрабатываем ошибки. Здесь важно помнить несколько нюансов:
- как и с MySQL, нельзя хранить данные доступа в коде;
- используйте try...catch и исключения PDO;
- подготовленные запросы защищают от SQL-инъекций;
- транзакции объединяют запросы в одну операцию.
Для SQLite3
PHP подключается к SQLite3 через PDO. Для этого используется строка подключения вида "sqlite:путь_к_файлу_базы_данных".
Новый файл базы данных создается при первом подключении.
Пример подключения (PDO):
$dbfile = "path/to/your/database.sqlite";
try {
$conn = new PDO("sqlite:$dbfile");
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "Соединение установлено!";
} catch (PDOException $e) {
echo "Ошибка: " . $e->getMessage();
}
$conn = null;
При работе с SQLite3 важно обрабатывать ошибки через try-catch.
Достоинства SQLite3:
- простота (система не требует отдельного сервера);
- компактность;
- автономность (все данные хранятся в одном файле);
- совместимость с мобильными приложениями.
При этом для высоконагруженных проектов она не подходит.
Функции PHP для работы с БД
Теперь расскажем чуть подробнее об основных функциях языка программирования PHP, полезных при работе с базами данных.
Подключение к серверу
PHP умеет соединяться с базами данных. Этот процесс начинается с подключения. Представьте, что это как звонок на нужный номер. PDO (PHP Data Objects) служит для управления разными данными (MySQL, PostgreSQL и т.д.).
Механизмы создания объекта PDO с указанием строки подключения (DSN) мы уже описали в предыдущих разделах. Как только объект готов можно отправлять запросы к базе данных. Простые запросы отправляются методом query(). Для более сложных и безопасных вариантов используются подготовленные запросы с prepare() и execute(). Полученные данные приходят в виде набора строк, которые можно использовать непосредственно в PHP.
Благодаря правильному использованию PDO с созданием строк подключения, подготовкой запросов, обработкой ошибок работа с базами данных становится надежнее и безопаснее. У разных баз данных есть свои особенности, но механизм подключения идентичен: создание соединения, отправка запросов, обработка результатов.
Подключение к конкретной базе данных
Принцип подключения через PDO у разных баз примерно одинаковый. Но везде есть свои нюансы. Например, для MySQL нужно указывать кодировку. PostgreSQL может потребовать порт. Важно учитывать эти детали для корректной работы с данными.
Синтаксис SQL-запросов, функции, типы данных тоже отличаются. Например, MySQL для ограничения результатов использует LIMIT, а PostgreSQL — FETCH FIRST ... ROWS ONLY. Соответственно, запросы приходится адаптировать.
Есть разница и в обработке ошибок. PDO перехватывает исключения, но сообщения об ошибках в разных СУБД разные. Но если держать в голове различия между разными системами, можно создавать приложения, совместимые с несколькими версиями ПО.
Отправка запроса
После подключения к базе нужны запросы для работы с ней. В их основе лежат стандартные SQL-команды:
- получить данные (SELECT),
- добавить (INSERT),
- обновить (UPDATE, удалить (DELETE).
В PHP есть несколько способов работы с SQL-запросами. Самый простой – PDO::query(). Он подходит для простых запросов без параметров:
result = $pdo->query("SELECT * FROM users");.
Результатом становится массив, который можно обработать. Но этот способ небезопасен для пользовательских данных (возможны SQL-инъекции).
Безопасные запросы строятся на основе PDO::prepare() и PDOStatement::execute(). Они готовятся заранее. Затем значения подставляются методом execute(). Так быстрее и безопаснее:
$stmt = $pdo->prepare("SELECT * FROM users WHERE name = :name");
$stmt->execute(['name' => $userName]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
Команда SELECT возвращает данные. INSERT, UPDATE, DELETE меняют их, а заодно могут вернуть количество затронутых строк (rowCount()).
Для обработки результатов есть следующие опции:
- fetch() (одна строка);
- fetchAll() (все строки);
- fetchObject() (как объекты).
Команды fetch() и fetchAll() двигают курсор. Их нельзя вызывать по много раз.
Транзакции нужны для объединения запросов в одну операцию. Тут возможны разные варианты:
- beginTransaction(), commit() (если нет ошибок);
- rollBack() (если они есть).
Для отправки запросов есть разные варианты команд:
- query (для простых запросов);
- prepare/execute (для безопасных запросов с дополнительными параметрами).
Правильное использование всех этих методов — гарантия работы с базой данных в PHP.