Ошибки новичков при работе с PHP и как их избежать 🧠
- 1. Игнорирование ошибок и предупреждений
- 2. Путаница между = и ==
- 3. Непонимание области видимости переменных
- 4. Отсутствие валидации данных из формы
- 5. SQL-инъекции 😱
- 6. Хранение паролей в открытом виде
- 7. Непонимание разницы между include, require, include_once, require_once
- 8. Отсутствие фильтрации вывода (XSS)
- 9. Игнорирование кодировки
- 10. Смешивание логики и шаблонов
- 11. Использование магических чисел
- 12. Отсутствие комментариев
- 13. Пренебрежение session_start()
- 14. Отсутствие обработки ошибок при подключении к БД
- 15. Загрузка файлов без проверки
- 16. Работа без exit после редиректа
- 17. Использование @ для скрытия ошибок
- 18. Пренебрежение безопасностью сессий
- 19. Отсутствие exit() после die() в критических местах
- 20. Отсутствие структуры проекта
- 21. Игнорирование версий PHP
- 22. Использование старого стиля кода
- 23. Отсутствие тестов
- 24. Непонимание ошибок типа «Headers already sent»
- 25. Отсутствие .env и хранение паролей в коде
- 26. Неправильная работа с массивами
- 27. Копипаста без понимания
- 28. Отсутствие обработки пустых значений
- 29. Сложные условия в одну строку
- 30. Неиспользование документации
- Итог
PHP — удобный язык, особенно для старта. Он понятный, не требует сложной настройки и быстро даёт результат. Но у каждого новичка на пути появляются типичные грабли: ошибки, которые вроде бы мелкие, но ломают весь сайт.
Разберём самые частые ошибки и простые способы их избежать.
1. Игнорирование ошибок и предупреждений
Многие новички просто отключают ошибки, чтобы не мешали.
error_reporting(0);
А потом удивляются, почему «ничего не работает».
📍 Как правильно:
На этапе разработки включай показ ошибок:
error_reporting(E_ALL);
ini_set('display_errors', 1);
А на продакшне — наоборот, вывод отключи, но пиши всё в лог:
ini_set('display_errors', 0);
ini_set('log_errors', 1);
ini_set('error_log', 'errors.log');
2. Путаница между =
и ==
Классика:
if ($a = 5) { ... }
А хотел проверить, равно ли $a пяти. В итоге код не сравнивает, а присваивает.
📍 Как правильно:
Используй ===
(строгое сравнение):
if ($a === 5) { ... }
Так ты не только сравниваешь значение, но и тип.
3. Непонимание области видимости переменных
Переменные внутри функции не видят внешние:
$name = "Иван";
function sayHello() {
echo $name; // ошибка: undefined variable
}
📍 Как правильно:
Передай переменную через аргумент:
function sayHello($name) {
echo "Привет, $name!";
}
sayHello("Иван");
4. Отсутствие валидации данных из формы
Новички часто напрямую используют $_POST
:
$email = $_POST['email'];
А если поле не передали? Получишь предупреждение и дырку в безопасности.
📍 Как правильно:
Проверяй всё:
$email = $_POST['email'] ?? '';
$email = trim($email);
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "Неверный формат email!";
}
5. SQL-инъекции 😱
Одна из самых опасных ошибок:
$query = "SELECT * FROM users WHERE email = '$_POST[email]'";
Хакер вводит anything' OR '1'='1
— и получает все данные.
📍 Как правильно:
Используй PDO и подготовленные запросы:
$stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?");
$stmt->execute([$_POST['email']]);
6. Хранение паролей в открытом виде
Если ты сохраняешь пароли как есть — привет, утечки.
📍 Как правильно:
Хешируй:
$hash = password_hash($password, PASSWORD_DEFAULT);
if (password_verify($password, $hash)) {
echo "Ок!";
}
PHP сам выбирает надёжный алгоритм и соль.
7. Непонимание разницы между include
, require
, include_once
, require_once
-
include
— если файла нет, PHP выдаст предупреждение. -
require
— если файла нет, всё упадёт. -
_once
— не позволит подключить один и тот же файл дважды.
📍 Рекомендация:
Используй require_once
для конфигов и функций, include
— для шаблонов.
8. Отсутствие фильтрации вывода (XSS)
Вывод без фильтрации — это прямой путь к XSS:
echo $_GET['name'];
Хакер вводит <script>alert('взлом')</script>
— и код выполняется в браузере.
📍 Как правильно:
echo htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');
9. Игнорирование кодировки
PHP может неожиданно «сломать» кириллицу, если не указать кодировку.
📍 Как правильно:
-
В HTML:
<meta✱ charset="utf-8">
-
В PHP:
header('Content-Type: text/html; charset=utf-8');
- В базе:
utf8mb4
10. Смешивание логики и шаблонов
Новички часто всё пишут в одном файле: и обработку формы, и HTML, и запросы к БД.
Через месяц в таком коде невозможно разобраться.
📍 Как правильно:
Раздели слои:
-
index.php
— контроллер; -
model.php
— логика и запросы; -
view.php
— HTML-шаблон.
11. Использование магических чисел
Пишут так:
if ($status == 3) { ... }
И никто не помнит, что значит «3».
📍 Как правильно:
const STATUS_ACTIVE = 3;
if ($status === STATUS_ACTIVE) { ... }
Теперь понятно без комментариев.
12. Отсутствие комментариев
Многие считают, что комментарии не нужны.
Но если ты вернёшься к коду через месяц — будешь ругаться сам на себя.
📍 Как правильно:
Пиши коротко, но по делу:
// Проверяем, авторизован ли пользователь
if (!isset($_SESSION['user_id'])) { ... }
13. Пренебрежение session_start()
Иногда новички забывают его вызывать, а потом удивляются, почему сессия не работает.
📍 Как правильно:
session_start();
$_SESSION['user'] = 'Иван';
И вызывать нужно в самом начале скрипта, до вывода HTML.
14. Отсутствие обработки ошибок при подключении к БД
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
Если база недоступна — сайт падает.
📍 Как правильно:
try {
$pdo = new PDO($dsn, $user, $pass);
} catch (PDOException $e) {
error_log($e->getMessage());
die("Ошибка подключения");
}
15. Загрузка файлов без проверки
Многие принимают любой файл и сразу сохраняют. Опасно.
📍 Как правильно:
Проверь тип, размер и расширение:
if ($_FILES['file']['size'] > 2000000) die('Слишком большой файл');
$ext = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
if (!in_array($ext, ['jpg', 'png', 'gif'])) die('Неверный формат');
16. Работа без exit
после редиректа
header("Location: home.php");
Но скрипт дальше продолжает выполняться.
📍 Как правильно:
header("Location: home.php");
exit;
17. Использование @
для скрытия ошибок
Оператор @
глушит любые ошибки. Это как заклеить лампочку «Check Engine».
📍 Как правильно:
Никогда не используй @
. Лучше исправь ошибку.
18. Пренебрежение безопасностью сессий
Если не регенерировать ID, злоумышленник может угадать сессию.
📍 Как правильно:
session_start();
session_regenerate_id(true);
19. Отсутствие exit()
после die()
в критических местах
Некоторые думают, что die()
= exit()
. Это так, но стиль лучше поддерживать единый.
📍 Совет:
Используй exit;
везде, где нужно остановить выполнение.
20. Отсутствие структуры проекта
Файлы валяются в одной папке: test.php
, script1.php
, file2.php
.
Разработчику самому сложно понять, что где.
📍 Как правильно:
Создай структуру:
/app
/models
/views
/controllers
/config
/public
Так делают все фреймворки — и не просто так.
21. Игнорирование версий PHP
Код, который работал на PHP 7.2, может не заработать на 8.3.
📍 Как правильно:
Проверяй версию:
echo PHP_VERSION;
И следи за функциями, которые устарели.
22. Использование старого стиля кода
Например, короткие теги <?
или <?=
.
На некоторых серверах они не работают.
📍 Как правильно:
Пиши всегда:
<?php echo $var; ?>
23. Отсутствие тестов
Новички редко проверяют код автоматически, а зря.
Один тест может спасти от десятков багов.
📍 Как начать просто:
composer require --dev phpunit/phpunit
И пиши базовые тесты на функции.
24. Непонимание ошибок типа «Headers already sent»
Ошибка «Cannot modify header information» появляется, если ты уже вывел текст до header()
.
📍 Как избежать:
Выводи заголовки до HTML.
И проверь, нет ли лишних пробелов в начале или конце файла.
25. Отсутствие .env
и хранение паролей в коде
Файл config.php
с паролями часто попадает в GitHub.
Опасно.
📍 Как правильно:
Используй .env
:
DB_USER=user
DB_PASS=secret
и подключай через библиотеку phpdotenv
.
26. Неправильная работа с массивами
$arr = ['one', 'two'];
echo $arr['two']; // ошибка
📍 Как правильно:
Или используй числовые индексы, или ассоциативные:
$arr = ['first' => 'one', 'second' => 'two'];
echo $arr['second'];
27. Копипаста без понимания
Многие копируют код из Stack Overflow, не понимая, что он делает.
Иногда этот код даже опасен.
📍 Совет:
Перед тем как вставить — прочитай и пойми. И лучше протестируй на локалке.
28. Отсутствие обработки пустых значений
if ($_POST['login']) ...
Если поля нет — ошибка.
📍 Как правильно:
if (!empty($_POST['login'])) ...
29. Сложные условия в одну строку
if ($user && $role == 'admin' || !$banned && $age > 18) ...
Через неделю ты сам не поймёшь, что хотел сказать.
📍 Как правильно:
Разбей на части:
$isAdmin = $role === 'admin';
$isAdult = $age > 18;
if ($user && $isAdmin && $isAdult && !$banned) ...
30. Неиспользование документации
Многие ищут ответы на форумах, а не в php.net.
А там всё — с примерами, описаниями и советами.
📍 Совет:
Если не уверен, как работает функция — проверь в официальной документации.
Итог
Ошибки — часть обучения. Каждый, кто пишет на PHP, проходил через них.
Главное — не бояться разбираться, почему что-то не работает.
Запомни:
✅ включай ошибки,
✅ фильтруй ввод и вывод,
✅ хешируй пароли,
✅ не храни пароли в коде,
✅ разделяй логику и шаблоны.
И тогда PHP перестанет казаться «хаосом из скобок» — и станет надёжным инструментом, которым ты управляешь уверенно. 💪
* Упомянутые организации запрещены на территории РФ