Ответ
Для безопасной и эффективной записи в PHP я всегда использую PDO (PHP Data Objects). Это универсальный интерфейс, поддерживающий множество СУБД (MySQL, PostgreSQL, SQLite) и предоставляющий защиту от SQL-инъекций через подготовленные выражения (prepared statements).
Базовый пример записи с PDO:
// Конфигурация подключения
$host = 'localhost';
$dbname = 'my_app';
$username = 'app_user';
$password = 'secure_password';
// Создание подключения с обработкой ошибок через исключения
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
// Данные для вставки
$userName = 'Алексей';
$userEmail = 'alex@example.com';
// 1. Подготовленный запрос с именованными плейсхолдерами
$sql = "INSERT INTO users (name, email, created_at) VALUES (:name, :email, NOW())";
$stmt = $pdo->prepare($sql);
// 2. Привязка значений к плейсхолдерам (это и есть защита от инъекций)
$stmt->bindParam(':name', $userName, PDO::PARAM_STR);
$stmt->bindParam(':email', $userEmail, PDO::PARAM_STR);
// 3. Выполнение
$stmt->execute();
// Получить ID последней вставленной записи (если есть AUTO_INCREMENT)
$newUserId = $pdo->lastInsertId();
echo "Запись успешно добавлена, ID: $newUserId";
} catch (PDOException $e) {
// В продакшене логируем исключение, пользователю показываем общее сообщение
error_log("Database error: " . $e->getMessage());
echo "Произошла ошибка при сохранении данных.";
}
Ключевые практики, которые я соблюдаю:
- Всегда используйте подготовленные выражения. Никогда не подставляйте переменные напрямую в строку запроса.
- Устанавливайте корректную кодировку (utf8mb4) для поддержки всех символов, включая эмодзи.
- Включайте режим исключений (ERRMODE_EXCEPTION) для централизованной обработки ошибок.
- Используйте транзакции для группировки нескольких операций записи в одну атомарную операцию.
- В современных фреймворках (Laravel, Symfony) эту работу берут на себя ORM (Eloquent, Doctrine), но под капотом они используют те же принципы.