Топ ошибок начинающих PHP разработчиков: от А до Я

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Топ ошибок начинающих PHP разработчиков: от А до Я

PHP остается одним из самых популярных языков для веб-разработки. Однако на пути новичка часто встречаются грабли, которые могут стоить часов отладки. В этой статье мы разберем самые распространенные ошибки начинающих PHP-разработчиков — от синтаксических до логических. Каждая ошибка сопровождается примером кода и правильным решением. Поехали!

1. Ошибки в работе с переменными и типами данных

PHP — язык с динамической типизацией, что часто вводит новичков в заблуждение. Самая частая ошибка — путаница между строгим и нестрогим сравнением.

1.1. Использование == вместо ===

Оператор == приводит типы, что может дать неожиданный результат.

// Плохо: нестрогое сравнение
$value = 0;
if ($value == "0abc") {
    echo "Равно!"; // Выведет "Равно!", потому что "0abc" приводится к 0
}

// Хорошо: строгое сравнение
if ($value === "0abc") {
    echo "Равно!"; // Не выполнится, типы разные
}

1.2. Игнорирование isset() и empty()

Попытка обратиться к несуществующему ключу массива — классика.

// Плохо: вызовет Warning
$data = [];
echo $data['name']; // Notice: Undefined index

// Хорошо: проверяем существование
if (isset($data['name'])) {
    echo $data['name'];
}

// Или с проверкой на пустоту
if (!empty($data['name'])) {
    echo $data['name'];
}

2. Проблемы безопасности: SQL-инъекции и XSS

Безопасность — ахиллесова пята многих новичков. Две главные угрозы: SQL-инъекции и межсайтовый скриптинг (XSS).

2.1. Неэкранированный ввод в SQL-запросах

Никогда не вставляйте пользовательские данные напрямую в запрос!

// Плохо: уязвимость для инъекций
$username = $_POST['username'];
$query = "SELECT * FROM users WHERE username = '$username'";

// Хорошо: используем подготовленные выражения (PDO)
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username");
$stmt->execute(['username' => $username]);
$result = $stmt->fetchAll();

2.2. Вывод данных без экранирования

Если вы выводите данные, полученные от пользователя, обязательно экранируйте HTML.

// Плохо: XSS уязвимость
echo "Привет, " . $_GET['name'];

// Хорошо: используем htmlspecialchars()
echo "Привет, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');

3. Ошибки в работе с функциями и областями видимости

Новички часто путают области видимости переменных и неправильно обрабатывают ошибки в функциях.

3.1. Забыли про global или передачу параметров

Внутри функции переменные извне не видны, если их не объявить специально.

// Плохо: переменная $count не определена внутри функции
$count = 0;
function increment() {
    $count++; // Warning: Undefined variable
}

// Хорошо: передаем параметр
function increment($count) {
    return $count + 1;
}
$count = increment($count);

// Или используем global (но это плохая практика)
function incrementGlobal() {
    global $count;
    $count++;
}

3.2. Игнорирование возвращаемых значений

Многие функции возвращают false или null при ошибке. Проверяйте это!

// Плохо: не проверяем результат
$file = fopen('file.txt', 'r');
fwrite($file, 'data'); // Если файл не открылся — ошибка

// Хорошо: проверяем
if ($file = fopen('file.txt', 'r')) {
    fwrite($file, 'data');
    fclose($file);
} else {
    echo "Не удалось открыть файл";
}

4. Типичные логические и архитектурные ошибки

Эти ошибки связаны с неправильным пониманием работы PHP или плохим проектированием.

4.1. Смешивание HTML и PHP без шаблонизатора

Писать HTML внутри PHP-строк — прямой путь к аду поддержки.

// Плохо: HTML в PHP-строке
echo "<div class='user'><h2>" . $name . "</h2></div>";

// Хорошо: отделяем логику от представления
// Шаблон (template.php):
// <div class="user"><h2><?= $name ?></h2></div>
// В контроллере:
include 'template.php';

4.2. Забыли про exit после редиректа

После header('Location: ...') скрипт продолжает выполняться, если не остановить его.

// Плохо: код продолжает выполняться
header('Location: /dashboard.php');
// ... тут может быть опасный код

// Хорошо: сразу завершаем скрипт
header('Location: /dashboard.php');
exit;

4.3. Неправильная работа с сессиями

Сессию нужно запускать до любого вывода.

// Плохо: вывод до session_start()
echo "Привет";
session_start(); // Warning: Cannot send session cookie

// Хорошо: session_start() в самом начале
session_start();
echo "Привет";

Заключение

Мы разобрали 10 типичных ошибок начинающих PHP-разработчиков — от нестрогих сравнений до SQL-инъекций и проблем с редиректами. Запомните главные правила: