Возможный дубликат:
PHP: «Примечание: неопределенная переменная» и «Примечание: неопределенный индекс»
Итак, я в настоящее время изучаю PHP и читаю книгу о функции md5 для паролей, поэтому решил попробовать и посмотреть, как это происходит. Я также решил использовать метод POST, а не GET, так как видел людей, которые говорят, что они безопаснее и не позволяют переменным отображаться в URL-адресе.
Для моего проекта тестирования я сделал очень простую форму:
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title></title> </head> <body> <form action="dologin" method="POST"> <table border="0"> <tbody> <tr> <td>Username:</td> <td><input type="text" name="username"></td> </tr> <tr> <td>Password:</td> <td><input type="password" name="password"></td> </tr> </tbody> </table> <input type="submit" value="Login"> </form> </body> </html>
Проблема в том, что когда я ввожу значения в поля BOTH и нажимаю «Login», я получаю следующий вывод в другом файле PHP.
Notice: Undefined index: username in C:\xampp\htdocs\md5\home\dologin\index.php on line 11 Username non existent
Здесь следует код для файла «/dologin/index.php»
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title></title> </head> <body> <?php mysql_connect("localhost", "root") or die(mysql_error()); mysql_select_db("test") or die(mysql_error()); $query = "SELECT password FROM users WHERE username='".$_POST['username']."'"; $result = mysql_query($query); $row = mysql_num_rows($result); if(isset($row)){ $password = (mysql_result($result,$row - 1)); $enteredpassword = md5("w@#$@#".$_GET['password']."^#3f%#^"); if($password == $enteredpassword){ if(!isset($_COOKIE['PHPSESSID'])){ session_start(); } $_SERVER['LOGIN_STATUS'] = true; } else { die("Access denied"); } } else { die("Username non existent"); } ?> </body> </html>
Любая помощь вообще по моей проблеме очень ценится, спасибо за чтение.
undefined index означает, что где-то в массиве $ _POST нет индекса (ключа) для имени пользователя ключа.
Вы должны устанавливать свои опубликованные значения в переменные для более чистого решения, и это хорошая привычка.
Если бы у меня была подобная ошибка, я бы сделал что-то вроде этого:
$username = $_POST['username']; // you should really do some more logic to see if it's set first echo $username;
Если бы имя пользователя не появилось, это означало бы, что я где-то прищурился. Вы также можете,
var_dump($_POST);
Чтобы узнать, что вы публикуете. var_dump действительно полезен для отладки. Проверьте это: var_dump
прежде всего,
убедитесь, что есть сообщение
if(isset($_POST['username'])) { // check if the username has been set }
вторых, и, самое главное, дезинформировать данные, что означает, что
$query = "SELECT password FROM users WHERE username='".$_POST['username']."'";
смертельно опасно, вместо этого используйте
$query = "SELECT password FROM users WHERE username='".mysql_real_escape_string($_POST['username'])."'";
и, пожалуйста, изучите тему SQL-инъекции
Вы должны проверить, определено ли POST['username']
. Используйте это выше:
$username = ""; if(isset($_POST['username'])){ $username = $_POST['username']; } "SELECT password FROM users WHERE username='".$username."'"