Ниже — разбор задачек с очередного собеседования на должность веб-разработчика 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 , а также свою книгу с разбором аналогичных задач из интервью.


Нет Ответов