Php Сессия и проблемы с сообщением на странице входа

Итак, мы получили базовый HTML здесь

<form action="main_login.php" method="post" style="text-align:right;"> Username: <input type="text" name="username" value="" size=20 style="display:inline-block;margin-left:10px"required> <br> Password: <input type="password" name="password" value="" size=20 style="margin-left:12px"required> <br> <input type="submit" value="Log In" style="margin-left:75px"=> </form> 

И 2 php-файла основной login.php

 <?php session_start(); $con = mysqli_connect("localhost", "root", "", "complaints"); if (!$con) { die('Could not connect: ' . mysql_error()); } $myusername=$_POST["username"]; $mypassword=$_POST["password"]; echo $myusername . "<br>"; echo $mypassword . "<br>"; // MySQL injection $myusername = stripslashes($myusername); $mypassword = stripslashes($mypassword); $myusername = mysql_real_escape_string($myusername); $mypassword = mysql_real_escape_string($mypassword); $sql="SELECT * FROM register WHERE username='$myusername' and password='$mypassword'"; $result=mysqli_query($con,$sql); // Mysql_num_row is counting table row $count=mysqli_num_rows($result); // If result matched $myusername and $mypassword, table row must be 1 row if($count==1){ // Register $myusername, $mypassword and redirect to file "login_success.php" $_SESSION['username']=$myusername; $_SESSION['password']=$mypassword; header("location:login_success.php"); } else { echo "Wrong Username or Password"; } mysqli_close($con); ?> 

Если логин успешно переадресовывает здесь login.php

 <?php session_start(); if ( isset( $_SESSION['username'] ) ){ header("location:main_login.php"); } ?> <html> <body> Login Successful </body> </html> 

Хорошо, так что я новый в php и не знаю много о сессиях. Сначала я использовал session_register и session_is_registered, но, как я узнал, эти функции больше не используются. поэтому я перешел на сеансы, но моя проблема продолжает появляться здесь

 $myusername=$_POST["username"]; $mypassword=$_POST["password"]; 

Я не могу использовать $ _POST для получения данных из формы. Также я не знаю, правильно ли я установил функции сеанса.

Изменить: имена пользователей и паролей в html те же, что и в php, я просто ошибался здесь.

Изменить: имена пользователей и паролей в html те же, что и в php, я просто ошибался здесь.

Изменить: Хорошо, поэтому вы сделали опечатку в полях формы. Вы по-прежнему смешиваете API MySQL, см. Ниже ниже о функции смешивания с помощью mysql_real_escape_string() .

Посмотрите name="myusername" и ваше назначение POST, а также пароль для вашего пароля.

Они не совпадают.

Измените name="myusername" на name="username"

и name="mypassword" для name="password"

согласно

 $myusername=$_POST["username"]; $mypassword=$_POST["password"]; 

Используя отчет об ошибках , вы указали бы неопределенный индекс и уже отправили предупреждения; Смотри ниже.

У вас также есть пробелы перед <?php которые вызывают вывод перед заголовком. Удалить их.

Кроме того, вы смешиваете MySQL API с mysql_error() . mysql_error() следует читать как mysqli_error($con) и это ниже:

 $myusername = mysql_real_escape_string($myusername); $mypassword = mysql_real_escape_string($mypassword); 

который следует читать как

 $myusername = mysqli_real_escape_string($con,$myusername); $mypassword = mysqli_real_escape_string($con,$mypassword); 

или

 $myusername = mysqli_real_escape_string($con,$_POST['username']); $mypassword = mysqli_real_escape_string($con,$_POST['password']); 
  • mysqli_ и mysql_ не смешиваются вместе.

Что касается безопасности

Я заметил, что вы можете хранить пароли в текстовом виде. Если это так, то оно очень обескуражено.

Я рекомендую использовать функцию password_hash() CRYPT_BLOWFISH или PHP 5.5. Для PHP <5.5 используйте password_hash() compatibility pack .

Кроме того, что касается SQL-инъекций, используйте mysqli с подготовленными операторами или PDO с подготовленными операторами , они намного безопаснее .


Сноски

Лучше добавить exit; после каждого заголовка.

 header("location:login_success.php"); exit; 

и для всех заголовков.


Редактировать:

Удалить

 $myusername=$_POST["username"]; $mypassword=$_POST["password"]; echo $myusername . "<br>"; echo $mypassword . "<br>"; 

затем замените его на:

 $myusername = stripslashes($_POST["username"]); $mypassword = stripslashes($_POST["password"]); $myusername = mysqli_real_escape_string($con,$_POST['username']); $mypassword = mysqli_real_escape_string($con,$_POST['password']); 

Редактировать # 2 :

Это то, с чем я тестировал ваш код, и получил успех, поэтому я не знаю, что не так с вашим нынешним кодом.

HTML-форма

 <form action="main_login.php" method="post" style="text-align:right;"> Username: <input type="text" name="username" value="" size=20 style="display:inline-block;margin-left:10px"required> <br> Password: <input type="text" name="password" value="" size=20 style="margin-left:12px"required> <br> <input type="submit" value="Log In" style="margin-left:75px"=> </form> 

MySQL

 <?php $DB_HOST = 'xxx'; $DB_USER = 'xxx'; $DB_PASS = 'xxx'; $DB_NAME = 'xxx'; $conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME); if($conn->connect_errno > 0) { die('Connection failed [' . $conn->connect_error . ']'); } $myusername = stripslashes($_POST["username"]); $mypassword = stripslashes($_POST["password"]); $myusername = mysqli_real_escape_string($conn,$_POST['username']); $mypassword = mysqli_real_escape_string($conn,$_POST['password']); echo $myusername; // echos echo "<br>"; echo $mypassword; // echos $sql="SELECT * FROM register WHERE username='$myusername' and password='$mypassword'"; $result=mysqli_query($conn,$sql); $count=mysqli_num_rows($result); if($count==1){ echo "Yep"; } else{ echo "nope"; } 

NB: Вы также должны очистить свои сеансы ( уничтожить сеансы ), может быть что-то на сервере, кэшируя старые имена пользователей и пароли.

Также убедитесь, что в ваших столбцах нет пробелов, что типы верны, а длины достаточно длинные для хранения данных. Обычно VARCHAR(255) более чем достаточно, но предлагается использовать хешированные пароли, сгенерированные функцией password_hash() , функцию, которую вы должны использовать при хранении паролей.

Смотрите также:

  • В чем разница между session_unset () и session_destroy () в PHP?

на стеке.

  <?php session_start(); 

Прежде всего, в начале есть пространство.

Должен быть

 <?php session_start(); 

проблемы сеанса для страницы входа могут возникнуть, потому что URL-адрес, который вы открываете в браузере, не уникален. например, если вы говорите, что вы создаете страницу входа для своего сайта, и вы успешно создали сеансы. Теперь, если вы заходите с url, скажите http://geekzgarage.com, то ваша сессия ограничивается только этим URL. Если вы снова откроете вышеуказанный URL-адрес, например http://www.geekzgarage.com (обратите внимание на www. В обоих URL-адресах) , вы увидите, что вы не вошли в систему. Поэтому убедитесь, что ваша веб-страница открыта всегда в одном типе URL-адрес. либо с www. или без www.