Топ ошибок начинающих 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-инъекций и проблем с редиректами. Запомните главные правила:
- Всегда используйте
===вместо==, если не уверены. - Никогда не доверяйте пользовательскому вводу — экранируйте и валидируйте.
- Проверяйте возвращаемые значения функций и ресурсов.
- Отделяйте логику от представления (MVC или шаблоны).
- Не забывайте про
exitБлоги
Рекомендаций по книгам
Читайте также