Ниже — разбор задачек с очередного собеседования на должность веб-разработчика php в gaming индустрию. Если хотите научиться легко решать такие задачки, скачайте мою новую книгу по подготовке к тех. собеседованиям.
/**/
Задачи
Задача 1: что не так в коде?
Что не так в этом коде:
$username = $_POST['username']; $password = $_POST['password']; $query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'"; $result = mysql_query($query);
В данном фрагменте кода есть несколько проблем:
-
Используется устаревшее расширение mysql, лучше использовать mysqli или PDO.
-
Отсутствует проверка и экранирование входных данных из $_POST, что создает уязвимость для SQL-инъекций.
-
Пароль хранится в открытом виде, что небезопасно. Лучше использовать хеширование паролей.
-
Нет обработки ошибок запроса к БД — проверки на null результата запроса.
-
Используется устаревшее соединение по протоколу mysql, лучше использовать mysqli или PDO с подготовленными выражениями для безопасности.
-
Нет использования механизмов защиты от CSRF атак при работе с POST запросами.
Для улучшения кода следует:
-
Перейти на современные mysqli или PDO.
-
Использовать подготовленные выражения.
-
Вводить CSRF защиту.
-
Хешировать пароли.
-
Обрабатывать ошибки и валидировать входные данные.
Задача 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>"; } ?>
Несколько замечаний к этому коду:
-
Нет обработки ошибок при подключении к БД, проверки на NULL результата запроса.
-
Возможна инъекция HTML/JavaScript в поля формы, т.к. выводятся напрямую без экранирования.
-
Нет валидации email на корректность.
-
Пароли лучше хранить не в открытом виде, а хешированными.
-
Нет защиты от CSRF при отправке формы.
-
Имя таблицы users в запросе лучше заменить на константу или переменную.
Для улучшения стоит:
-
Добавить обработку ошибок БД.
-
Экранировать вывод переменных.
-
Валидировать входные данные.
-
Добавить CSRF токены к форме.
-
Использовать константы вместо «магических строк».
-
Хешировать пароли в БД.
Задача 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 )
Суть запроса:
-
С помощью UNION создаём таблицу с месяцами с 1 по 12.
-
Левым соединением сопоставляем месяцы и ставки каждого пользователя.
-
Фильтруем по году 2022.
-
Проверяем, что нет ни одной ставки с NULL значением (то есть пропущенного месяца).
-
В результат попадают только пользователи, которые делали ставки каждый месяц 2022 года.
Задача 4: угол между стрелками
Часы показывают 3 часа 15 минут, найдите угол между часовой и минутной стрелкой.
Давайте решим это пошагово:
-
3 часа — значит часовая стрелка находится на отметке 90+X градусов (360 градусов / 12 часов = 30 градусов за 1 час).
-
15 минут — значит минутная стрелка прошла 15/60 от полного круга, то есть 15*6 = 90 градусов (360 градусов / 60 минут = 6 градусов за 1 минуту).
-
Таким образом, часовая стрелка на отметке 90+X градусов, минутная стрелка — на отметке 90 градусов.
-
Угол между стрелками вычисляется как разность углов: 90 + X — 90 = X
-
Остается узнать , чему равен X. Для этого вычислим, на сколько градусов сдвигается часовая стрелка за четверть часа: Решение: X = 360 / 12 / 4 = 7.5 (градусов)
PS: рекомендую курсы Otus PHP Pro по подготовке к работе веб-разработчиком php , а также свою книгу с разбором аналогичных задач из интервью.
Нет Ответов