zip_tasks/backend_php.md

305 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Подготовка к Колоквиумму
* [PDO и база данных MySQL](#pdo-и-база-данных-mysql)
* [Авторизация](#авторизация)
* [Редирект](#редирект)
* [Формат времени](#формат-времени)
* [Загрузка файлов](#загрузка-файлов)
* [Oсновные функции работы с массивом](#основные-функции-работы-с-массивом)
* [Основные функции работы со строками](#основные-функции-работы-со-строками)
## PDO и база данных MySQL
### PDO
1. Подключить PDO и связать с сервером
```php
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();
}
```
2. Использование select для sql запросов
```pdo
$query_result = $pdo->query($query);
$data = $query_result->fetchAll();
// Return the results as an associative array
return $data;
```
3. Использование prepare для защищённых запросов
```php
$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(); // Вернёт ассоциативный массив
```
4. Получить индекс вставленной записи
```php
$lastId = $pdo->lastInsertId();
```
### MySQL
Здесь собраны основные команды для MySQL
1. Создание таблицы
```sql
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
);
```
2. Выбрать все записи с определённым фильтром
```sql
SELECT id, title, content FROM posts WHERE category_id IN (1, 3)
```
3. Смешать одну таблицу с другой
```sql
SELECT p.id, p.title, cat.name
FROM posts p
INNER JOIN categories cat ON cat.id = p.category_id
WHERE cat.id > 2
```
4. Расчёт количества
```sql
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`).
5. Вставка значения
```sql
INSERT INTO posts (title, category_id)
VALUES ('Новый пост', 2);
INSERT INTO posts
VALUES (4, 'Пост', 'Контент', NULL, 3, 2, 1, 'publish');
```
6. Удаление
```sql
DELETE FROM posts
WHERE id = 3;
```
7. Обновить данные
```sql
UPDATE posts
SET title = 'Обновлённый заголовок', category_id = 3
WHERE id = 5;
```
8. Сортировка
```sql
SELECT id, title, created_at
FROM posts
ORDER BY created_at DESC;
```
## Авторизация
1. Установка пользователя по id
```php
function set_auth_user(int $user_id)
{
$_SESSION['user_id'] = $user_id;
}
```
2. Выход пользователя
```php
function logout()
{
$_SESSION['user_id'] = null;
}
```
3. Получить текущего пользователя
```php
/**
* 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;
}
```
4. Закодировать пароль перед отправкой в базу данных
```php
$password = 'MySecret123';
$hash = password_hash($password, PASSWORD_DEFAULT); // или PASSWORD_BCRYPT
```
5. Проверит строку на совпадение закодированного пароля
```php
$inputPassword = 'MySecret123';
$storedHash = $user->password;
if (password_verify($inputPassword, $storedHash)) {
echo 'Пароль верный!';
} else {
echo 'Неверный пароль!';
}
```
## Редирект
```php
/**
* Redirect to some url using header()
* @param string $url
* @return never
*/
function redirect_to(string $url)
{
header("Location: " . $url);
exit;
}
```
## Формат времени
```php
$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 |
## Загрузка файлов
```php
/**
* 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);` |