За последние 24 часа нас посетили 18373 программиста и 1675 роботов. Сейчас ищут 1077 программистов ...

Помогите с ошибкой в авторизации

Тема в разделе "PHP для новичков", создана пользователем Patay, 4 ноя 2024.

  1. Patay

    Patay Новичок

    С нами с:
    4 ноя 2024
    Сообщения:
    2
    Симпатии:
    0
    Код авторизации пользователя. Массив $user вместо того чтобы хранить в себе строку из бд, хранит единицу. Помогите пожалуйста вот код:

    PHP:
    1. <?php
    2. require_once("db.php");
    3.  
    4. if (!empty(($_POST['login'])) && !empty(($_POST['password']))) {
    5.     $stmt = $conn->prepare("SELECT * FROM `users` WHERE login = ?");
    6.     $stmt->execute([$_POST['login']]);
    7.     $user = $stmt->fetch();
    8.  
    9.     if ($user) {
    10.         if (password_verify($_POST['password'], $user['password'])) {
    11.             session_start();
    12.             $_SESSION['user_id'] = $user['id'];
    13.             $_SESSION['role'] = $user['role'];
    14.             header("Location: account.php");
    15.             exit();
    16.         } else {
    17.             header("Location: login_form.php?message=error_start_session");
    18.             exit();
    19.         }
    20.     } else {
    21.         header("Location: login_form.php?message=not_found_user");
    22.         exit();
    23.     }
    24. } else {
    25.     header("Location: login_form.php?message=form_null");
    26.     exit();
    27. }
     
  2. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    424
    Симпатии:
    79
    Адрес:
    Бавария, Германия
    Добрый день!
    Поробуйте так
    PHP:
    1. <?php
    2. require_once("db.php");
    3. if (!empty(($_POST['login'])) && !empty(($_POST['password'])))
    4. {
    5.     $stmt = $conn->prepare("SELECT id, role, password FROM `users` WHERE login = ?");
    6.     $stmt->execute([$_POST['login']]);
    7.     $stmt->bind_result($id, $role, $password);
    8.     $stmt->fetch();
    9.     if ($password)
    10.     {
    11.         if (password_verify($_POST['password'], $password)
    12.         {
    13.             session_start();
    14.             $_SESSION['user_id'] = $id;
    15.             $_SESSION['role'] = $role;
    16.             header("Location: account.php");
    17.             exit();
    18.         }
    19.         else
    20.         {
    21.             header("Location: login_form.php?message=error_start_session");
    22.             exit();
    23.         }
    24.     }
    25.     else
    26.     {
    27.         header("Location: login_form.php?message=not_found_user");
    28.         exit();
    29.     }
    30.  
    31. }
    32. else
    33. {
    34.     header("Location: login_form.php?message=form_null");
    35.     exit();
    36. }
    Редирект на login_form.php менять не стал. Попробуйте сделать не так грамоздко
    Удачи!
     
  3. Patay

    Patay Новичок

    С нами с:
    4 ноя 2024
    Сообщения:
    2
    Симпатии:
    0
    Спасибо большое помогло!
     
  4. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    424
    Симпатии:
    79
    Адрес:
    Бавария, Германия
    Посмотрите, как можно сделать проверку логина и пароля с выдачей сообщений,
    без перезагрузки страницы (т.е.без редиректов на login_form.php)
    PHP:
    1. <?php
    2. $message = "";
    3.  
    4. if ( filter_input(INPUT_POST, 'login') )
    5. {
    6.     require_once("db.php");
    7.  
    8.     $stmt = $conn->prepare("SELECT id, role, password FROM `users` WHERE login = ?");
    9.     $stmt->execute([$_POST['login']]);
    10.     $stmt->bind_result($id, $role, $password);
    11.     $stmt->fetch();
    12.    
    13.     if ($password)
    14.     {
    15.         if (password_verify($_POST['password'], $password))
    16.         {
    17.             session_start();
    18.             $_SESSION['user_id'] = $id;
    19.             $_SESSION['role'] = $role;
    20.             $message="OK";
    21.         }
    22.         else
    23.         {
    24.            $message="Incorrect password";
    25.         }
    26.     }
    27.     else
    28.     {
    29.        $message="Not found user";
    30.     }
    31.     echo $message;
    32.     exit;
    33. }
    34.  
    35. echo <<<HTML
    36. <html>
    37. <head>
    38. <script>
    39. window.addEventListener("load", () => {
    40.     var form = document.getElementById("log");
    41.     var go = document.getElementById("go");
    42.     var err = document.getElementById("error");
    43.     var inp = document.querySelectorAll("input");
    44.     //------------------------------------------------
    45.     for (i in [0,1]) {
    46.         inp[i].addEventListener("click", () => {
    47.             err.innerHTML="";
    48.         });
    49.     }
    50.     //------------------------------------------------
    51.     form.addEventListener("submit", (e) => {
    52.       e.preventDefault();
    53.       fd = new FormData(form);
    54.       fetch("?", {
    55.       method: "POST",
    56.       body: fd,
    57.       })
    58.       .then((response) => response.text())
    59.       .then((text) => {
    60.         if(text == "OK")
    61.             window.location = "account.php";
    62.         else
    63.             err.innerHTML = text;
    64.        });
    65.     });
    66.     //------------------------------------------------
    67. });
    68. </script>
    69. </head>
    70. <body>
    71. <form id="log" method="post" action="">
    72. <input type="text" name="login" placeholder="Name" required>
    73. <input type="password" name="password" placeholder="Password" required>
    74. <input type="submit" id="go" value="Login">
    75. <div id="error"></div>
    76. </form>
    77. </body>
    78. </html>
    79. HTML;
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.759
    Не надо такие здоровые куски HTML выводить через echo, это потом трудно читать и сопровождать. Лучше, если уж хочется в одном файле и пыху и хтмл, закрывать режим PHP
     
    miketomlin и artoodetoo нравится это.