Добавить backend_php.md

This commit is contained in:
steve_dekart 2025-07-03 11:31:59 +02:00
commit c639d35998

305
backend_php.md Normal file
View File

@ -0,0 +1,305 @@
# Подготовка к Колоквиумму
* [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);` |