12 KiB
12 KiB
Подготовка к Колоквиумму
- PDO и база данных MySQL
- Авторизация
- Редирект
- Формат времени
- Загрузка файлов
- Oсновные функции работы с массивом
- Основные функции работы со строками
PDO и база данных MySQL
PDO
- Подключить PDO и связать с сервером
define('BASE_PATH', __DIR__);
try {
$dsn = "mysql:host=" . DB_AUTH['db_host'] .
";port=" . DB_AUTH['db_port'] .
";dbname=" . DB_AUTH['db_name'] .
";charset=" . DB_AUTH['db_charset'];
$pdo = new PDO($dsn, DB_AUTH['db_username'], DB_AUTH['db_password'], [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
} catch (PDOException $e) {
echo "Connection db error: " . $e->getMessage();
die();
}
- Использование select для sql запросов
$query_result = $pdo->query($query);
$data = $query_result->fetchAll();
// Return the results as an associative array
return $data;
- Использование prepare для защищённых запросов
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$email = 'test@example.com';
$stmt->bindParam(':email', $email);
$stmt->execute();
// Или проще
// $stmt->execute([':email' => 'test@example.com']);
$data = $stmt->fetchAll(); // Вернёт ассоциативный массив
- Получить индекс вставленной записи
$lastId = $pdo->lastInsertId();
MySQL
Здесь собраны основные команды для MySQL
- Создание таблицы
CREATE TABLE posts (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content TEXT NOT NULL,
image_url VARCHAR(255) NULL,
some_var INT NOT NULL,
category_id INT NOT NULL,
author_id INT NOT NULL,
status VARCHAR(20) NOT NULL CHECK (status IN ('publish', 'pending')),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE CASCADE
);
- Выбрать все записи с определённым фильтром
SELECT id, title, content FROM posts WHERE category_id IN (1, 3)
- Смешать одну таблицу с другой
SELECT p.id, p.title, cat.name
FROM posts p
INNER JOIN categories cat ON cat.id = p.category_id
WHERE cat.id > 2
- Расчёт количества
SELECT cat.name, COUNT(p.id) AS posts_count
FROM posts p
INNER JOIN categories cat ON cat.id = p.category_id
GROUP BY cat.name
HAVING posts_count > 3;
**Заметка: **
WHERE — фильтрует строки до группировки (до агрегирования).
HAVING — фильтрует группы, полученные после агрегирования (GROUP BY).
- Вставка значения
INSERT INTO posts (title, category_id)
VALUES ('Новый пост', 2);
INSERT INTO posts
VALUES (4, 'Пост', 'Контент', NULL, 3, 2, 1, 'publish');
- Удаление
DELETE FROM posts
WHERE id = 3;
- Обновить данные
UPDATE posts
SET title = 'Обновлённый заголовок', category_id = 3
WHERE id = 5;
- Сортировка
SELECT id, title, created_at
FROM posts
ORDER BY created_at DESC;
Авторизация
- Установка пользователя по id
function set_auth_user(int $user_id)
{
$_SESSION['user_id'] = $user_id;
}
- Выход пользователя
function logout()
{
$_SESSION['user_id'] = null;
}
- Получить текущего пользователя
/**
* Get current user id and username. If user is not authorized - false.
* @return UserModel|false
*/
function get_auth_user(): bool|array
{
if (isset($_SESSION['user_id'])) {
$user = $pdo->select('SELECT * FROM users WHERE id = ' . $_SESSION['user_id'] . ';'); // Написать самому
if (empty($user))
return false;
return $user;
} else
return false;
}
- Закодировать пароль перед отправкой в базу данных
$password = 'MySecret123';
$hash = password_hash($password, PASSWORD_DEFAULT); // или PASSWORD_BCRYPT
- Проверит строку на совпадение закодированного пароля
$inputPassword = 'MySecret123';
$storedHash = $user->password;
if (password_verify($inputPassword, $storedHash)) {
echo 'Пароль верный!';
} else {
echo 'Неверный пароль!';
}
Редирект
/**
* Redirect to some url using header()
* @param string $url
* @return never
*/
function redirect_to(string $url)
{
header("Location: " . $url);
exit;
}
Формат времени
$date = new DateTime('now', new DateTimeZone('Europe/Moscow'));
$date = new DateTime($user->created_at);
echo $date->format('Y-m-d H:i:s'); // например: 2025-07-03 12:30:00
| Символ | Значение | Пример |
|---|---|---|
| Y | Год, 4 цифры | 2025 |
| m | Месяц с ведущим нулём | 07 |
| d | День месяца с нулём | 03 |
| H | Часы (24-часовой формат) | 14 |
| i | Минуты | 05 |
| s | Секунды | 09 |
Загрузка файлов
/**
* Upload file to server
* @param array $file
* @param string $subfolder_name like 'products/'
* @param string $file_type (image, ...)
* @return string|false
*/
function upload_file(array $file, string $subfolder_name, string $file_type)
{
if (isset($file) && $file['error'] === UPLOAD_ERR_OK) {
$uploadDir = BASE_PATH . '/media/';
// Create new unique filename
$fileName = pathinfo($file['name'], PATHINFO_FILENAME);
$fileExtension = pathinfo($file['name'], PATHINFO_EXTENSION);
$newFileName = $fileName . '_' . uniqid() . '.' . $fileExtension;
// media/{subfolder_name}/{new_file.png}
$uploadFile = $uploadDir . $subfolder_name . $newFileName;
$filepath_db = $subfolder_name . $newFileName;
// Get file type
$fileType = mime_content_type($file['tmp_name']);
// if subfolder is not exists
if (!is_dir($uploadDir . $subfolder_name)) {
mkdir($uploadDir . $subfolder_name, 0775, true);
}
// Upload file to server
if (strpos($fileType, 'image') === 0) {
if (move_uploaded_file($file['tmp_name'], $uploadFile)) {
return $filepath_db;
} else {
return false;
}
}
}
return false;
}
/**
Основные функции работы с массивом
| Функция | Описание | Пример |
|---|---|---|
array_push() |
Добавляет элементы в конец массива | array_push($arr, $val); |
array_pop() |
Удаляет последний элемент массива | $val = array_pop($arr); |
array_shift() |
Удаляет первый элемент массива | $val = array_shift($arr); |
array_unshift() |
Добавляет элемент в начало массива | array_unshift($arr, $val); |
count() |
Возвращает количество элементов | $len = count($arr); |
in_array() |
Проверяет, есть ли значение в массиве | in_array($val, $arr); |
array_keys() |
Возвращает все ключи массива | $keys = array_keys($arr); |
array_values() |
Возвращает все значения массива | $values = array_values($arr); |
array_merge() |
Объединяет несколько массивов | $merged = array_merge($arr1, $arr2); |
array_map() |
Применяет функцию к каждому элементу массива | $result = array_map('trim', $arr); |
array_filter() |
Фильтрует элементы массива по условию | $filtered = array_filter($arr, fn($v) => $v > 5); |
sort() |
Сортирует массив по значениям (по возрастанию) | sort($arr); |
ksort() |
Сортирует массив по ключам | ksort($arr); |
explode() |
Преобразует строку в массив по разделителю | $arr = explode(',', $str); |
implode() |
Преобразует массив в строку с разделителем | $str = implode(',', $arr); |
Основные функции работы со строками
| Функция | Описание | Пример |
|---|---|---|
strlen() |
Возвращает длину строки (по байтам) | $len = strlen($str); |
mb_strlen() |
Возвращает длину строки | $len = mb_strlen($str); |
strpos() |
Находит позицию первого вхождения подстроки | $pos = strpos($str, 'abc'); |
str_replace() |
Заменяет вхождения подстроки в строке | $newStr = str_replace('old', 'new', $str); |
substr() |
Возвращает часть строки по позиции и длине | $part = substr($str, 2, 5); |
trim() |
Удаляет пробелы (или другие символы) в начале и конце | $trimmed = trim($str); |
strtolower() |
Преобразует строку в нижний регистр | $lower = strtolower($str); |
strtoupper() |
Преобразует строку в верхний регистр | $upper = strtoupper($str); |
explode() |
Разбивает строку на массив по разделителю | $arr = explode(',', $str); |
implode() |
Объединяет элементы массива в строку | $str = implode(',', $arr); |
htmlspecialchars() |
Экранирует спецсимволы для вывода в HTML | $safe = htmlspecialchars($str); |
sprintf() |
Форматирует строку с подстановкой | $text = sprintf("Hello %s", $name); |
str_repeat() |
Повторяет строку несколько раз | $rep = str_repeat('abc', 3); |