commit c639d359986b0bd84d455de2eedaf855d1b45f17 Author: steve_dekart Date: Thu Jul 3 11:31:59 2025 +0200 Добавить backend_php.md diff --git a/backend_php.md b/backend_php.md new file mode 100644 index 0000000..4edb6ac --- /dev/null +++ b/backend_php.md @@ -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);` | \ No newline at end of file