Статья

Ошибки новичков при работе с PHP и как их избежать 🧠

Оглавление

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 перестанет казаться «хаосом из скобок» — и станет надёжным инструментом, которым ты управляешь уверенно. 💪

* Упомянутые организации запрещены на территории РФ
Для ответа вы можете авторизоваться