Введение
PHP остаётся одним из самых популярных языков для веб-разработки, несмотря на появление множества альтернатив. Однако новички часто допускают типичные ошибки, которые могут привести к уязвимостям, снижению производительности или просто к неработающему коду. В этой статье мы разберём топ-5 ошибок начинающих PHP-разработчиков, покажем примеры неправильного кода и дадим рекомендации по их исправлению. Материал будет полезен как тем, кто только начинает изучать PHP, так и тем, кто хочет освежить знания.
1. Игнорирование безопасности: SQL-инъекции и XSS
Самая распространённая и опасная ошибка — недостаточная фильтрация пользовательских данных. Многие новички берут данные напрямую из $_GET или $_POST и подставляют их в SQL-запросы или выводят на страницу без экранирования.
Неправильный код (SQL-инъекция)
<?php
$username = $_POST['username'];
$password = $_POST['password'];
// Уязвимый запрос
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($conn, $sql);
?>
Если злоумышленник введёт в поле username значение ' OR '1'='1, запрос вернёт всех пользователей, и вход будет выполнен без пароля.
Правильный код (использование подготовленных выражений)
<?php
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();
?>
То же касается вывода данных в HTML. Всегда используйте htmlspecialchars() для экранирования специальных символов:
<?php
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
?>
2. Пренебрежение строгой типизацией
PHP — язык с динамической типизацией, и новички часто полагаются на автоматическое приведение типов. Это может приводить к неожиданным результатам, особенно при сравнениях.
Пример неочевидного поведения
<?php
$value = "100 apples";
if ($value == 100) {
echo "Равно 100"; // Выведет "Равно 100"!
}
?>
Строка "100 apples" неявно приводится к числу 100, поэтому условие истинно. Используйте строгое сравнение (===) и строгую типизацию в современных проектах:
Рекомендации
- Объявляйте
declare(strict_types=1);в начале каждого файла. - Используйте строгое сравнение
===и!==вместо==и!=. - Явно указывайте типы аргументов и возвращаемых значений функций.
<?php
declare(strict_types=1);
function calculateTotal(float $price, int $quantity): float {
return $price * $quantity;
}
?>
3. Утечки памяти и неэффективная работа с ресурсами
Новички часто забывают закрывать файлы, соединения с БД или освобождать память после работы с большими данными. В PHP сборщик мусора работает автоматически, но это не значит, что можно игнорировать управление ресурсами.
Типичная ошибка: не закрытое соединение
<?php
$conn = new mysqli($host, $user, $pass, $db);
// ... много кода ...
// Забыли вызвать $conn->close();
?>
Правильный подход: использование try-finally или менеджеров ресурсов
<?php
$conn = new mysqli($host, $user, $pass, $db);
try {
// работа с БД
} finally {
$conn->close();
}
?>
Для работы с файлами используйте fopen()/fclose() в паре, а для больших массивов — unset() после использования. В современных версиях PHP можно применять генераторы (yield) для обработки больших наборов данных без загрузки всего в память.
4. Смешивание логики и представления
Классическая ошибка начинающих — писать HTML-код прямо внутри PHP-файлов, смешивая бизнес-логику с выводом. Это делает код нечитаемым, сложным для поддержки и тестирования.
Пример плохого кода
<?php
$users = getUsers();
echo "<table>";
foreach ($users as $user) {
echo "<tr><td>" . $user['name'] . "</td></tr>";
}
echo "</table>";
?>
Рекомендации
- Используйте шаблонизаторы (Twig, Blade) или хотя бы отделяйте PHP-логику от HTML.
- Применяйте MVC-подход: модели для данных, контроллеры для логики, представления для вывода.
- Избегайте
echoвнутри циклов для генерации разметки — лучше собирать данные в массив и передавать в шаблон.
<!-- Пример с использованием простого шаблона -->
<?php $users = getUsers(); ?>
<table>
<?php foreach ($users as $user): ?>
<tr><td><?= htmlspecialchars($user['name']) ?></td></tr>
<?php endforeach; ?>
</table>
5. Игнорирование современных стандартов и инструментов
Многие новички пишут на PHP так, как учили 10 лет назад: используют mysql_* функции (устарели с PHP 7), не используют автозагрузку классов, не применяют PSR-стандарты и Composer. Это приводит к плохой архитектуре и проблемам с совместимостью.
Что делать вместо этого
- Используйте PDO или mysqli (объектно-ориентированный стиль) вместо
mysql_*. - Подключайте зависимости через Composer и используйте ав