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