Итак, мы получили базовый 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()
, функцию, которую вы должны использовать при хранении паролей.
Смотрите также:
на стеке.
<?php session_start();
Прежде всего, в начале есть пространство.
Должен быть
<?php session_start();
проблемы сеанса для страницы входа могут возникнуть, потому что URL-адрес, который вы открываете в браузере, не уникален. например, если вы говорите, что вы создаете страницу входа для своего сайта, и вы успешно создали сеансы. Теперь, если вы заходите с url, скажите http://geekzgarage.com, то ваша сессия ограничивается только этим URL. Если вы снова откроете вышеуказанный URL-адрес, например http://www.geekzgarage.com (обратите внимание на www. В обоих URL-адресах) , вы увидите, что вы не вошли в систему. Поэтому убедитесь, что ваша веб-страница открыта всегда в одном типе URL-адрес. либо с www. или без www.