Member 13723570 Ответов: 2

Неопределенная ошибка индекса РНР


Я пытался создать страницу входа в систему с помощью 000webhost, и эта ошибка продолжает появляться, и я знаю, что есть тонны этих королевских вопросов повсюду, но я все еще не могу ее исправить

это и есть ошибка

Обратите внимание: неопределенный индекс: активен в /storage/ssd1/326/5052326/public_html/login.php на линии 14

Предупреждение: невозможно изменить информацию заголовка - заголовки уже отправлены (вывод начинается с /storage/ssd1/326/5052326/public_html/login.php:14) в /storage/ssd1/326/5052326/public_html/login.php на линии 23

а это и есть код

<?php
   include("config.php");
   session_start();
   
      // username and password sent from form 
    if($_SERVER["REQUEST_METHOD"] == "POST") {
          
      $myusername = mysqli_real_escape_string($db,$_POST['username']);
      $mypassword = mysqli_real_escape_string($db,$_POST['password']); 
      
      $sql = "SELECT * FROM admin WHERE username = '$myusername' and password = '$mypassword'";
      $result = mysqli_query($db, $sql);
      $row = mysqli_fetch_array($result,MYSQLI_ASSOC);
      $active = $row['active'];
      
      $count = mysqli_num_rows($result);
      
      // If result matched $myusername and $mypassword, table row must be 1 row
		
      if($count == 1) {
         $_SESSION['login_user'] = $myusername;
         
         header("location: welcome.php");
      }else {
         $error = "Your Login Name or Password is invalid";
      }
    }
?>


Что я уже пробовал:

даже мой учитель не смог это исправить

Richard Deeming

В дополнение к уязвимости SQL-инъекции, упомянутой в решениях, вы также храните пароли в виде обычного текста.

Я понимаю, что это всего лишь школьный проект, а не то, что будет использовано в реальной жизни. Но я надеюсь, что ваш учитель объяснит, почему хранить такие пароли-ужасная идея. :)

Безопасная Аутентификация Паролем Объясняется Просто[^]
Соленое хэширование паролей - делаем это правильно[^]

2 Ответов

Рейтинг:
14

Jochen Arndt

Строка 14-это

$active = $row['active'];
Наиболее вероятная причина ошибки заключается в том, что ваша таблица SQL не содержит столбца с именем "active".

Вы также должны проверить, был ли запрос успешным (см. Пример кода по адресу РНР: в mysqli::запрос - руководство по эксплуатации[^] ) и строки возвращаются (вызов mysqli_num_rows() перед выборкой). В противном случае доступ $result и $row тоже потерпит неудачу.

Наконец, я надеюсь, что ваш учитель скоро расскажет вам о SQL-инъекция - Википедия[^].


Member 13723570

Спасибо! Нам не сказали, что это должен быть столбец в таблице, поэтому я был смущен этим, но я добавил идентификатор в нашу таблицу и вместо этого изменил active на ID, и это сработало! Большое вам спасибо!

Jochen Arndt

Добро пожаловать и благодарю вас за то, что вы приняли мое решение.

Рейтинг:
0

Patrice T

В случае, если имя пользователя или пароль неверны, запрос ничего не возвращает, вы должны проверить, была ли строка возвращена или нет, прежде чем пытаться прочитать ее.

$sql = "SELECT * FROM admin WHERE username = '$myusername' and password = '$mypassword'";

Не решение вашего вопроса, а еще одна проблема, которая у вас есть.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]