mysql_connect до сучасного PDO.try-catch).db.php.Ми навчилися створювати базу даних та таблицю users через графічний інтерфейс phpMyAdmin (Лекція 10). Але наша кінцева мета — навчити PHP-код спілкуватися з цією базою без ручного втручання людини. Скрипт повинен вміти автоматично додавати туди користувачів із форми реєстрації. У цій лекції ми створимо “Міст” між вашим вебзастосунком та сервером MySQL за допомогою сучасного стандарту PDO.
mysql_* до PDOІсторично в PHP існувало кілька способів “поговорити” з БД:
mysql_*): Наприклад, mysql_connect(). Він був вкрай небезпечним (вразливим до ін’єкцій) і його повністю видалили з сучасних версій PHP 7+. Ніколи не використовуйте його і не копіюйте старий код із форумів з цією приставкою!mysqli_real_escape_string.$pdo->query()).Для підключення за допомогою PDO нам необхідні 4 параметри:
localhost (або 127.0.0.1), оскільки база лежить на тому ж комп’ютері, що й PHP-скрипт.task_manager).root."" (просто пустий рядок), а в серверах MAMP (на Mac) зазвичай це "root".Всі ці налаштування (крім логіна й пароля) об’єднуються в один спеціальний рядок, що називається DSN (Data Source Name):
mysql:host=localhost;dbname=task_manager;charset=utf8mb4
try/catch)Що станеться, якщо ми помилимося в паролі або сервер бази “впаде”? PHP видасть на екран (користувачу) страшну Fatal Error (Uncaught PDOException: Access denied for user...), де будуть світитися системні шляхи вашого комп’ютера. Це провал безпеки.
Щоб “перехопити” можливу помилку підключення, використовується конструкція try-catch (Спробуй - Спіймай):
<?php
// Спроба виконати небезпечний код
try {
// Формуємо DSN рядок для драйвера MySQL
$dsn = 'mysql:host=localhost;dbname=task_manager;charset=utf8mb4';
// Створюємо новий Об'єкт PDO (з'єднуємося з БД!)
// Аргументи: 1) DSN, 2) Логін, 3) Пароль
$pdo = new PDO($dsn, 'root', '');
// Кажемо PDO: "Якщо трапиться будь-яка помилка в SQL, негайно генеруй PDOException"
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Якщо цей echo вивівся — підключення пройшло успішно (ПОКИ ТИМЧАСОВИЙ ДЕБАГ)
// echo "Підключено до Бази Даних успішно!";
} catch (PDOException $e) { // Якщо сталася помилка з'єднання, код стрибає сюди
// Користувачу показуємо дружнє повідомлення (або логуємо в файл):
die("На жаль, сервер бази даних тимчасово недоступний. Спробуйте пізніше. Деталі: " . $e->getMessage());
}
?>
db.phpПідключення до бази вам знадобиться майже НА КОЖНІЙ сторінці вашого проєкту (на головній для виведення новин, на сторінці реєстрації, в профілі). Ви не можете копіювати цей блок try-catch у 20 різних файлів! (Пам’ятаємо правило DRY).
Рішення:
db.php.try-catch), що описаний вище.index.php), на самому початку ви просто робите:
require_once 'db.php';Після цього виклику змінна-об’єкт $pdo стає глобально доступною у вашому index.php, і ви вільні робити з нею будь-які запити до бази!
mysql_* є застарілими і вкрай небезпечними. MySQLi - хороша альтернатива тільки для MySQL. PDO — це найбільш універсальний і безпечний сучасний стандарт абстракції БД в PHP.DSN рядок.try-catch, щоб користувачі не бачили системних паролів (PDOException).db.php (базовий приклад Рефакторингу та дотримання DRY).MySQLi? Що доведеться змінити програмісту, якщо бізнес перенесе свій сайт з бази MySQL на базу PostgreSQL в обох випадках технологій підключення?new PDO('mysql:host...', 'root', 'super_secret')) повинна знаходитися у файлі, що містить виключно код PHP без домішок та розширень у вигляді <!DOCTYPE html>, а закриваючий тег ?> там зовсім не бажано писати? Чим виклик файлу може погрожувати виводу Headers?try { ... } catch() { ... }. Що конкретно станеться з роботою PHP-скрипта (і виконанням решти коду нижче) якщо ми залишимо new PDO() прямо посеред документу БЕЗ обгортки (try/catch), а Базу Даних вимкнуть з розетки?require_once. Що гарантує суфікс _once, порівняно зі звичайним require? Чому для файлу бази (db.php) саме ця форма підключення є найправильнішою, особливо в складних проєктах на десятки файлів?