Вход пользователя через PHP PDO и AJAX - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть форма во всплывающем моде, которая должна использоваться для входа пользователя. Есть два поля ввода, одно для номера ID-карты и второе для пароля. Собранные данные отправляются ajax на страницу php, называемую login.php, котораядолжен проверить введенные пользователем данные пользователя и создать для него сеанс, если он является активным пользователем и переносит его на домашнюю страницу, а если он не активен, пользователь переносит его на страницу регистрации учащегося и если введенные данные неверны в абзаце внутри формыдолжен дать уведомление пользователю .. теперь, когда я отправляю форму, где я пропустил, ничего не происходит !!
html strcture:

<div id="std-login-modal" class="modal">
    <header class="modal-header">
        <h3>تسجيل الدخول كطالب</h3>
        <i class="fa fa-times modal-close"></i>
    </header>
    <div class="modal-body">
        <form id="std-login-frm" method="POST">
            <div>
                <input type="text" id="std-card" name="stdID" autocomplete required>
                <label>رقم القيد</label>
                <i class="fa fa-exclamation"></i>
                <div class="input-desc">
                    <span>هذا الحقل خاص بادخال رقم قيد الطالب المكون من سبعة أرقام</span>
                </div>
            </div>
            <div>
                <input type="password" id="std-pass" name="stdPass" required>
                <label>كلمة المرور</label>
                <i class="fa fa-exclamation"></i>
                <div class="input-desc">
                    <span>هذا الحقل خاص بكلمة المرور الخاصة بالطالب</span>
                </div>
            </div>
            <div>
                <input type="submit" value="تسجيل دخول" name="stdLoginBtn">
                <p id="std-login-error"></p>
            </div>
        </form>
    </div>
    <footer class="modal-footer">
        <p>لا يوجد لديك حساب في الموقع؟ قم بانشاء واحد</p>
        <button id="create-std-account" class="modal-second-btn">انشاء حساب</button>
    </footer>
</div>  

Мой код jquery:

$(document).ready(function(){

    // Student Login Operation
    $("#std-login-frm").submit(function(e){
        e.prvenetDefault();
        // Get Student Entered Data From The Inputs
        var stdID = $("#std-card").val().trim();
        var stdPass = $("#std-pass").val().trim();

        // Call AJAX Method And Specify Its Parameters
        $.ajax({
            url: "login.php?type=student",
            type: "POST",
            data: {ID:stdID,Password:stdPass},
            dataType:"json",
            error: function(data){
                $("#std-login-error").html(data.fail);
            }
        });
    });
});  

код login.php:

<?php
    include'connect.php';
    if(isset($_POST['stdLoginBtn']))
    {
        $type = '';
        if(isset($_GET['type']))
        {
            $type = $_GET['type'];
            if($type == 'student')
            {
                // Get Data Sent By AJAX POST Request
                $ID = $_POST['ID'];
                $pass = $_POST['Password'];

                // Check if the user exist in database
                $stmt = $con->prepare("select ID,password,status,name,phone,
                token from students where ID=?");
                $stmt->execute(array($ID));
                $info=$stmt->fetch();
                if(password_verify($pass,$info["password"]))
                    {
                        if($info["status"] == 1)
                        {
                            $_SESSION['stdID'] = $info["ID"];
                            header('Location:home.php');
                            exit();
                        }
                        else
                        {
                            $_SESSION['mobile'] = $info["phone"];
                            $_SESSION['token'] = $info["token"];
                            $_SESSION['name'] = $info["name"];
                            header('Location:student-registration.php');
                            exit();
                        }
                    }
                else
                {
                    $fail = "خطأ في البيانات يرجى إعادة المحاولة";
                    $data = array('error' => $fail);
                    echo json_encode($data);
                }
            }
        }
    }

?>  

Я также предоставлю код подключения к mysql:

<?php
$dsn='mysql:host=localhost;dbname=vcm';
$user='root';
$pass='';
$option=array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
    );

try{
    $con= new PDO($dsn,$user,$pass,$option);
    $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}

catch(PDOException $e){
    echo 'Failed to connect' . $e->getMessage();
}
?>

1 Ответ

0 голосов
/ 07 февраля 2019

Вам нужно вызвать session_start(); в вашей программе php, прежде чем выводить что-либо на страницу, которая использует или задает какие-либо переменные сеанса.Это позволяет сохранять их в диспетчере сеансов и отправляет cookie в браузер вашего пользователя, идентифицирующий сеанс.В последующих веб-запросах браузер пользователя передает cookie-файл сеанса.

Кроме того, если ваш ajax-запрос направляется в другой домен, чем тот, который обслуживается вашей страницей, вы должны включить его в параметры ajax.

    xhrFields: {
       withCredentials: true
    } 

Наконец, браузер не просматривает заголовки Location:, возвращаемые в ответе на запрос AJAX (только в ответе на странице).Вам нужно обработать этот заголовок самостоятельно в своем коде Javascript.

Что-то вроде этого может помочь вам:

success: function(data, text, request){
     document.location.href = request.getResponseHeader('Location');
}

Собрав все это вместе, ваш запрос ajax может выглядеть так ( не отлажено ).

    // Call AJAX Method And Specify Its Parameters
    $.ajax({
        url: "login.php?type=student",
        type: "POST",
        data: {ID:stdID,Password:stdPass},
        dataType:"json",
        xhrFields: {
           withCredentials: true
        },
        success: function(data, text, request){
             var target = request.getResponseHeader('Location');
             alert('About to redirect to ' + target);
             document.location.href = target;
        },
        error: function(data){
            $("#std-login-error").html(data.fail);
        }
    });

Редактировать Вы пытаетесь сделать что-то очень сложное, включая множество движущихся частей: HTML, Javascript, PHP, AJAX,sql, и перенаправление.Замечательно, что вы хотите понять, как это сделать;ты многому научишьсяЕсли вам нужно просто завершить эту задачу, забудьте о ajax и просто опубликуйте форму входа на php.

Если вы хотите, чтобы это работало, вам нужно открыть developer tools нав браузере (на ПК щелкните правой кнопкой мыши / проверьте на любой платформе).

На вкладке Консоль отображается диагностическая информация о ваших страницах.Вы можете поместить console.log(whatever); строк в ваш Javascript, и они будут отображаться на консоли.

На вкладке Network вы можете видеть запросы и ответы от ваших конечных точек php AJAX, включаязначения заголовка Location и значения cookie.

Вкладка Source является отладчиком.Вы можете установить точки останова в строках Javascript, чтобы вы могли видеть, что происходит.Предложение: установите точки останова в первых строках функций success: и error:.

Вы можете получить расширение веб-браузера , например Редактировать этот файл cookie ,чтобы помочь вам проверить файлы cookie, передаваемые в ваш браузер вашими ответами ajax и GET / POST.

Если у вас есть php-сервер на стороне отладчика, это тоже поможет.Об этом можно узнать гораздо больше, чем можно найти в ответе о переполнении стека.

...