Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Подключение к базе данных

Файлы подходят для небольших данных. Когда записей тысячи и нужен быстрый поиск, данные хранят в базе: они лежат в таблицах, а запросы пишут на языке 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. Так можно делать только с данными, которые написали вы сами. Подставлять в запрос данные от пользователя склейкой строк нельзя — как это делать правильно, разобрано в следующем уроке.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.