Подключение к базе данных
Файлы подходят для небольших данных. Когда записей тысячи и нужен быстрый поиск, данные хранят в базе: они лежат в таблицах, а запросы пишут на языке SQL. В PHP с базами работают через PDO — единый набор команд для MySQL, PostgreSQL, SQLite и других.
Примеры этого урока используют базу SQLite в памяти. Браузерная песочница сайта базу не поддерживает, поэтому кнопки «Запустить» у них нет — выполните их у себя.
Подключение
Объект PDO создают, передав строку подключения:
<?php
$pdo = new PDO('sqlite::memory:');Строка sqlite::memory: означает временную базу, которая исчезнет в конце скрипта, — удобно для учёбы и тестов. Для MySQL строка подключения выглядит иначе и дополняется логином и паролем: new PDO('mysql:host=localhost;dbname=shop;charset=utf8mb4', $user, $password). Всё остальное в коде остаётся прежним.
Создание таблицы и добавление строк
Запросы, которые ничего не возвращают, выполняет метод exec():
<?php
$pdo = new PDO('sqlite::memory:');
$pdo->exec('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)');
$pdo->exec("INSERT INTO users (name, age) VALUES ('Анна', 25), ('Олег', 31)");
echo $pdo->query('SELECT COUNT(*) FROM users')->fetchColumn(); // 2Выборка строк
Метод query() выполняет запрос SELECT, а fetchAll() возвращает все найденные строки. С режимом PDO::FETCH_ASSOC каждая строка — ассоциативный массив:
<?php
$pdo = new PDO('sqlite::memory:');
$pdo->exec('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)');
$pdo->exec("INSERT INTO users (name, age) VALUES ('Анна', 25), ('Олег', 31)");
$users = $pdo->query('SELECT name, age FROM users ORDER BY age')->fetchAll(PDO::FETCH_ASSOC);
foreach ($users as $user) {
echo "{$user['name']}: {$user['age']}\n";
}Одна строка
Когда нужна одна запись, вместо fetchAll() вызывают fetch(). Если ничего не найдено, он возвращает false:
<?php
$pdo = new PDO('sqlite::memory:');
$pdo->exec('CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)');
$pdo->exec("INSERT INTO users (name, age) VALUES ('Анна', 25)");
$user = $pdo->query('SELECT name FROM users WHERE id = 1')->fetch(PDO::FETCH_ASSOC);
echo $user['name']; // АннаОшибки
При ошибке в запросе PDO бросает исключение PDOException:
<?php
$pdo = new PDO('sqlite::memory:');
try {
$pdo->query('SELECT * FROM missing_table');
} catch (PDOException $e) {
echo 'Ошибка запроса';
}Текст исключения посетителю не показывают: в нём могут быть названия таблиц и другие подробности. Его записывают в журнал, а на странице выводят общее сообщение.
Частая ошибка
В запросах этого урока все значения записаны прямо в тексте SQL. Так можно делать только с данными, которые написали вы сами. Подставлять в запрос данные от пользователя склейкой строк нельзя — как это делать правильно, разобрано в следующем уроке.