Php страница входа в систему - когда я вставляю действительные данные, она не работает, но когда я вставляю недопустимые данные, она работает отлично

У меня проблема. Я создаю свою собственную страницу входа, и у меня возникли проблемы. Когда я тестирую свою страницу и вставляю неверное имя пользователя и пароль, отлично работает. Но когда я вставляю данные, существующие в базе данных, он просто пропускает часть if (isset($_POST['but_submit'])). Что здесь могло быть не так? Вот мой код:

PHP:

  <?php include ("config.php");

 if (isset($_POST['but_submit'])){

     $uname = mysqli_real_escape_string($con,$_POST['txt_uname']);
     $password = mysqli_real_escape_string($con,$_POST['txt_pwd']);

     if ($uname != "" && $password != ""){

         $sql_query = "select count(*) as cntUser from users where Username='".$uname."' and passwrd='".$password."'";
         $result = mysqli_query($con,$sql_query);
         $row = mysqli_fetch_array($result);

         $count = $row['cntUser'];

         if ($count > 0){

             $_SESSION['uname'] = $uname;

             header('Location: welcome.php');
         }else{
             echo "Invalid username and password";
         }

     } }

 ?>

HTML

<div class = "container">
            <form method = "post" action = "">
            <div id = "div_login">
                <h1>Login</h1>
                    <div>
                        <input type = "text" class = "textbox" id = "txt_uname" name = "txt_uname" placeholder = "Username" />
                    </div>
                    <div>
                        <input type = "password" class = "textbox" id = "txt_uname" name = "txt_pwd" placeholder = "Password"/>
                    </div>
                    <div>
                        <input type = "submit" value = "Submit" name = "but_submit" id = "but_submit" />
                    </div>
                </div>
            </form>
        </div>

Буду очень рада, что кто-нибудь мне поможет :) Спасибо!

Что значит skips if (isset($_POST['but_submit']))? У вас нет выхода? Вы не должны хранить пароли в виде обычного текста.

user3783243 17.11.2018 15:56
header('Location: welcome.php'); требует exit(); после него
Jaquarh 17.11.2018 16:10

Когда я вставляю действительные данные, программа выдает false на if (isset($_POST['but_submit'])). И да, я знаю, что мне не следует хранить такие пароли ... Я изменю их после того, как выясню, что здесь не так ... спасибо

Gandalf 17.11.2018 16:19

Jaquarh, спасибо, но все еще не работает.

Gandalf 17.11.2018 16:20

что возвращает mysqli_error($con) после добавления этого в запрос? И отчеты об ошибках для PHP. php.net/manual/en/function.error-reporting.php @Gandalf Примечание: используйте @the_member_name для непосредственного пинга.

Funk Forty Niner 17.11.2018 17:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
236
1

Ответы 1

Возможно, это сработает? Сначала выполните отладку, если отсутствуют поля, а затем выполните свой SQL.

require_once 'config.php';

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

if (mysqli_connect_errno()) die(mysqli_connect_error());

# Debug what the issue is
foreach(array('but_submit', 'txt_uname', 'txt_pwd') as $arg)
    if (!isset($_POST[$arg]))
        die("{$arg} field is not set or empty");

# Prevent SQL injection
$stmt = $con->prepare("SELECT COUNT(*) as cntUser FROM users WHERE Username ? AND passwrd = ?");
$stmt->bind_param("ss", $_POST['txt_uname'], $_POST['txt_pwd']);
if (!$stmt->execute()){ mysqli_error($con); }
$stmt->store_result();

# Check the row count is more than 0
if ($stmt->num_rows != 0) {
    session_start(); # Start session, if config.php already does this you can remove this
    $_SESSION['uname'] = $_POST['txt_uname']; # Think about injects here - use the database record not untrusted POST data
    header('Location: ' . sprintf("%s://%s/welcome.php", isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off' ? 'https' : 'http', $_SERVER['SERVER_NAME']));
    exit();
}

# Nothing was returned
die('Incorrect username / password combination');

Следует отметить, что вы не должны сохранять имя пользователя в сеансе, это должен быть жетон, для которого имя пользователя указывается в качестве аргумента в вашем случае:

$_SESSION['token'] = \Firebase\JWT\JWT::encode(array('username' => $_POST['uname']), 'your secret');

Затем внутри вашего файла Welcome.php вы можете расшифровать его так (предлагается создать какой-то контроллер, который делает это раньше):

$user = \Firebase\JWT\JWT::decode($_SESSION['token'], 'your secret', array('HS256'));
echo $user['username'];

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

mysqli_real_escape_string() требует подключения в качестве первого аргумента. Но я не понимаю, почему вы предлагаете $_SESSION['uname'] = mysqli_real_escape_string($_POST['txt_uname']);, в этом нет необходимости.
Funk Forty Niner 17.11.2018 17:32

Хорошо указано, единственная причина, по которой я вставил его, - это остановить инъекции в сеанс, например XSS, но если все будет сделано правильно, он может легко запросить базу данных и использовать запись в базе данных, которая, как известно, не содержит инъекций, если используются подготовленные операторы. но я сейчас отредактирую это @FunkFortyNiner

Jaquarh 17.11.2018 17:34

Я бы заменил $stmt->execute(); на if (!$stmt->execute()){ mysqli_error($con); }, чтобы он мог выдавать возможные ошибки.

Funk Forty Niner 17.11.2018 17:36

Не стесняйтесь обновлять и изменять, где это возможно, я не эксперт Mysqli_ *, я использую PDO, поэтому большая часть этого была взята из руководства, поскольку я ответил @FunkFortyNiner

Jaquarh 17.11.2018 17:37

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

Gandalf 17.11.2018 18:58

Другие вопросы по теме