Ниже — разбор задачек с очередного собеседования на должность веб-разработчика php в gaming индустрию. Если хотите научиться легко решать такие задачки, скачайте мою новую книгу по подготовке к тех. собеседованиям.

/**/

Задачи

Задача 1: что не так в коде?

Что не так в этом коде:

$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysql_query($query);

В данном фрагменте кода есть несколько проблем:

  1. Используется устаревшее расширение mysql, лучше использовать mysqli или PDO.

  2. Отсутствует проверка и экранирование входных данных из $_POST, что создает уязвимость для SQL-инъекций.

  3. Пароль хранится в открытом виде, что небезопасно. Лучше использовать хеширование паролей.

  4. Нет обработки ошибок запроса к БД — проверки на null результата запроса.

  5. Используется устаревшее соединение по протоколу mysql, лучше использовать mysqli или PDO с подготовленными выражениями для безопасности.

  6. Нет использования механизмов защиты от CSRF атак при работе с POST запросами.

Для улучшения кода следует:

  1. Перейти на современные mysqli или PDO.

  2. Использовать подготовленные выражения.

  3. Вводить CSRF защиту.

  4. Хешировать пароли.

  5. Обрабатывать ошибки и валидировать входные данные.


Задача 2: что не так в коде?

Что не так в этом коде:

<?php

$db = new mysqli('localhost', 'user', 'pass', 'database');

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $name = $_POST['name'];
    $email = $_POST['email'];
    if (empty($name) || empty($email)) {
        die("Ошибка: все поля обязательны для заполнения");
    }

    $stmt = $db->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
    $stmt->bind_param("ss", $name, $email);
    $stmt->execute();

} else {
    echo "
    <form method='POST'>
        Имя: <input type='text' name='name'>
        Email: <input type='text' name='email'>
        <input type='submit' value='Добавить пользователя'>
    </form>";
}

?>

Несколько замечаний к этому коду:

  1. Нет обработки ошибок при подключении к БД, проверки на NULL результата запроса.

  2. Возможна инъекция HTML/JavaScript в поля формы, т.к. выводятся напрямую без экранирования.

  3. Нет валидации email на корректность.

  4. Пароли лучше хранить не в открытом виде, а хешированными.

  5. Нет защиты от CSRF при отправке формы.

  6. Имя таблицы users в запросе лучше заменить на константу или переменную.

Для улучшения стоит:

  1. Добавить обработку ошибок БД.

  2. Экранировать вывод переменных.

  3. Валидировать входные данные.

  4. Добавить CSRF токены к форме.

  5. Использовать константы вместо «магических строк».

  6. Хешировать пароли в БД.


Задача 3: написать SQL

Есть таблица пользователей и таблица с спортивными ставками этих пользователей. Напишите SQL запрос, который выведет всех пользователей, которые ставили каждый месяц в 2022 году.

SELECT u.user_id, u.name
FROM users u
WHERE NOT EXISTS (
  SELECT 1 
  FROM (
    SELECT 1 AS month
    UNION ALL SELECT 2 
    UNION ALL SELECT 3 
    UNION ALL SELECT 4
    UNION ALL SELECT 5 
    UNION ALL SELECT 6 
    UNION ALL SELECT 7
    UNION ALL SELECT 8 
    UNION ALL SELECT 9 
    UNION ALL SELECT 10  
    UNION ALL SELECT 11 
    UNION ALL SELECT 12
  ) months
  LEFT JOIN bets b 
    ON b.user_id = u.user_id 
    AND MONTH(b.date) = months.month
    AND YEAR(b.date) = 2022
  WHERE b.id IS NULL
)

Суть запроса:

  1. С помощью UNION создаём таблицу с месяцами с 1 по 12.

  2. Левым соединением сопоставляем месяцы и ставки каждого пользователя.

  3. Фильтруем по году 2022.

  4. Проверяем, что нет ни одной ставки с NULL значением (то есть пропущенного месяца).

  5. В результат попадают только пользователи, которые делали ставки каждый месяц 2022 года.


Задача 4: угол между стрелками

Часы показывают 3 часа 15 минут, найдите угол между часовой и минутной стрелкой.

Давайте решим это пошагово:

  1. 3 часа — значит часовая стрелка находится на отметке 90+X градусов (360 градусов / 12 часов = 30 градусов за 1 час).

  2. 15 минут — значит минутная стрелка прошла 15/60 от полного круга, то есть 15*6 = 90 градусов (360 градусов / 60 минут = 6 градусов за 1 минуту).

  3. Таким образом, часовая стрелка на отметке 90+X градусов, минутная стрелка — на отметке 90 градусов.

  4. Угол между стрелками вычисляется как разность углов: 90 + X — 90 = X

  5. Остается узнать , чему равен X. Для этого вычислим, на сколько градусов сдвигается часовая стрелка за четверть часа: Решение: X = 360 / 12 / 4 = 7.5 (градусов)


PS: рекомендую курсы Otus PHP Pro по подготовке к работе веб-разработчиком php , а также свою книгу с разбором аналогичных задач из интервью.

Tags

Нет Ответов

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Рубрики


Подпишись на новости
👋

Есть вопросы?