Статья

📘 Глава 14. Подключение к MySQL с помощью PDO

Переходим к более современному и гибкому способу работы с базами данных — PDO (PHP Data Objects).


❓ Почему PDO?

  • Поддерживает разные базы данных (MySQL, SQLite, PostgreSQL и др.)

  • Умеет подготавливать запросы (prepare), защищая от SQL-инъекций

  • Более объектно-ориентированный стиль


🧱 1. Подключение к MySQL

$dsn = "mysql:host=localhost;dbname=guestbook;charset=utf8mb4";
$user = "root";
$password = "password";

try {
    $pdo = new PDO($dsn, $user, $password);
    // Включим режим исключений
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("Database connection failed: " . $e->getMessage());
}

💾 2. Добавление сообщения

if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $author = trim($_POST["author"]);
    $text = trim($_POST["text"]);

    if ($author && $text) {
        $stmt = $pdo->prepare("INSERT INTO messages (author, text) VALUES (?, ?)");
        $stmt->execute([$author, $text]);

        header("Location: " . $_SERVER["PHP_SELF"]);
        exit;
    } else {
        echo "Please fill in both fields.";
    }
}

📥 3. Получение сообщений

$stmt = $pdo->query("SELECT * FROM messages ORDER BY created_at DESC");
$messages = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($messages as $message) {
    echo "<p><strong>" . htmlspecialchars($message["author"]) . ":</strong> "
        . htmlspecialchars($message["text"]) . "</p>";
}

🧪 4. Полный пример — index.php

<?php
$dsn = "mysql:host=localhost;dbname=guestbook;charset=utf8mb4";
$user = "root";
$password = "password";

try {
    $pdo = new PDO($dsn, $user, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die("DB Error: " . $e->getMessage());
}

if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $author = trim($_POST["author"]);
    $text = trim($_POST["text"]);

    if ($author && $text) {
        $stmt = $pdo->prepare("INSERT INTO messages (author, text) VALUES (?, ?)");
        $stmt->execute([$author, $text]);
        header("Location: " . $_SERVER["PHP_SELF"]);
        exit;
    } else {
        echo "Please fill in both fields.";
    }
}
?>

<form method="post">
    <input type="text" name="author" placeholder="Your name">
    <br>
    <textarea name="text" placeholder="Your message"></textarea>
    <br>
    <button type="submit">Send</button>
</form>

<hr>

<?php
$stmt = $pdo->query("SELECT * FROM messages ORDER BY created_at DESC");
$messages = $stmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($messages as $message) {
    echo "<p><strong>" . htmlspecialchars($message["author"]) . ":</strong> "
        . htmlspecialchars($message["text"]) . "</p>";
}
?>

✅ Что ты изучил:

  • Подключение к базе через PDO

  • Использование prepare() и execute()

  • Обработка исключений (try/catch)

  • Извлечение всех данных через fetchAll()


В следующей главе мы сделаем обёртку-класс для PDO, чтобы вынести работу с базой в отдельный файл и писать код ещё чище.

PHP
Для ответа вы можете авторизоваться