Добавить backend_php.md
This commit is contained in:
commit
c639d35998
305
backend_php.md
Normal file
305
backend_php.md
Normal 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);` |
|
||||
Loading…
x
Reference in New Issue
Block a user