zip_tasks/backend_php.md

12 KiB
Raw Permalink Blame History

Подготовка к Колоквиумму

PDO и база данных MySQL

PDO

  1. Подключить PDO и связать с сервером
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();
}
  1. Использование select для sql запросов
$query_result = $pdo->query($query);
$data = $query_result->fetchAll();

// Return the results as an associative array
return $data;
  1. Использование prepare для защищённых запросов
$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(); // Вернёт ассоциативный массив
  1. Получить индекс вставленной записи
$lastId = $pdo->lastInsertId();

MySQL

Здесь собраны основные команды для MySQL

  1. Создание таблицы
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
);
  1. Выбрать все записи с определённым фильтром
SELECT id, title, content FROM posts WHERE category_id IN (1, 3)
  1. Смешать одну таблицу с другой
SELECT p.id, p.title, cat.name
FROM posts p
INNER JOIN categories cat ON cat.id = p.category_id
WHERE cat.id > 2
  1. Расчёт количества
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).

  1. Вставка значения
INSERT INTO posts (title, category_id)
VALUES ('Новый пост', 2);

INSERT INTO posts
VALUES (4, 'Пост', 'Контент', NULL, 3, 2, 1, 'publish');
  1. Удаление
DELETE FROM posts
WHERE id = 3;
  1. Обновить данные
UPDATE posts
SET title = 'Обновлённый заголовок', category_id = 3
WHERE id = 5;
  1. Сортировка
SELECT id, title, created_at
FROM posts
ORDER BY created_at DESC;

Авторизация

  1. Установка пользователя по id
function set_auth_user(int $user_id)
{
    $_SESSION['user_id'] = $user_id;
}
  1. Выход пользователя
function logout()
{
    $_SESSION['user_id'] = null;
}
  1. Получить текущего пользователя
/**
 * 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;
}
  1. Закодировать пароль перед отправкой в базу данных
$password = 'MySecret123';
$hash = password_hash($password, PASSWORD_DEFAULT); // или PASSWORD_BCRYPT
  1. Проверит строку на совпадение закодированного пароля
$inputPassword = 'MySecret123';
$storedHash = $user->password;

if (password_verify($inputPassword, $storedHash)) {
    echo 'Пароль верный!';
} else {
    echo 'Неверный пароль!';
}

Редирект

/**
 * Redirect to some url using header()
 * @param string $url
 * @return never
 */
function redirect_to(string $url)
{
    header("Location: " . $url);
    exit;
}

Формат времени

$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

Загрузка файлов

/**
 * 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);