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