Если совсем по полочкам раскладывать, то:
- Ваша строчка 9 проверяет не равны ли captcha в $_POST и rand_code в $_SESSION.
- Ваша строчка никак не проверяет, чтобы эти переменные существовали / были определены, поэтому когда их нет - PHP информирует вас об этом (Notice) - прямым текстом говорит, что в упомянутых массивах нет таких индексов (элементов).
- Чтобы устранить PHP Notice, необходимо всегда проверять, заданы ли необходимые переменные:
1. В самом простом случае:
if (
( isset( $_POST['captcha'] ) && isset( $_SESSION['rand_code'] ) ) // переменные / индексы определены
&& $_POST['captcha'] != $_SESSION['rand_code'] // собственно, сравнение значений
) {
// остальной код
}
2. В реальных условиях чаще всего это происходит в контексте функций / методов и когда идет ряд проверок, принято использовать подход "fail early" (вариации - quit early, bail out early) – проверки идут не вложенными, а одна за одной, наиболее ожидаемые - первыми. Пример аналогичного фрагмента кода с учетом этой практики:
function some_method_name() {
// Если индексы не существуют или они приводятся к false - выходим из логики
if ( empty( $_POST['captcha'] ) || empty( $_SESSION['rand_code'] ) ) {
return; // может быть return false и тд - зависит от конкретной реализации
}
// Этот код выполнится только если предыдущая проверка прошла успешно и оба индекса имеют значения с которыми можно работать дальше
if ( $_POST['captcha'] != $_SESSION['rand_code'] ) {
// остальной код
}
}