使用pdo获取数据并在oop php中使用ajax显示

时间:2018-01-14 22:58:08

标签: php jquery mysql ajax oop

有些事情一直困扰着我。我正在学习使用oop php,ajax和bootstrap使用pdo登录系统。

到目前为止,我已登录并注册了一部分。 用户在表单中输入信息,提交给auth.php,auth.php通过一个看起来像这样的ajax文件在user.php中运行其各自的方法

$(function(){

    $('.form').on('submit', function(e){
        e.preventDefault();

        $form = $(this);

        submitForm($form);
    });

});

function submitForm($form){

    $footer = $form.parent('.modal-body').next('.modal-footer');

    $footer.html('<img src="images/ajax-loader.gif">');
    $.ajax({
        url: $form.attr('action'),
        method: $form.attr('method'),
        data : $form.serialize(),
        success : function( response ){
            response = $.parseJSON( response );

            if(response.success){
                if(!response.signout){
                    $footer.html( response.message );
                    setTimeout(function(){
                        $footer.html( response.message );
                        window.location = response.url;
                    }, 1500
                    );
                } 
                else if(response.signout == 2){
                    $footer.html( response.message );
                    setTimeout(function() {
                        $('#signup').modal('hide');
                        $('#login').modal('show');
                    }, 2000
                    );
                }
                else if(response.signout == 3){
                    $footer.html( response.idid );
                }   
            }
            else if(response.error){
                $footer.html( response.message );
            }
            console.log(response);
        }
    })
}

在登录的情况下,ajax将信息提交给auth.php,后者运行user.php中的方法并将用户登录到

auth.php看起来像这样:

   <?php

require_once 'includes/init.php';

$status = $user->login($_POST, $db);

if($status === 'success'){
    echo json_encode([
        'success' => 'success', 
        'message'=> '<p class="alert alert-success">Authenticated successfully</p>',
        'url' => 'profile.php',
    ]);
}
else if($status === 'successAdmin'){
    echo json_encode([
        'success' => 'success', 
        'message'=> '<p class="alert alert-info">Welcome Admin</p>',
        'url' => 'profileAdmin.php',
    ]);
}
else if($status === 'missing_fields'){
    echo json_encode([
        'error' => 'error', 
        'message'=> '<p class="alert alert-danger">All fields are mandatory</p>',
    ]);
}
else if($status === 'email_dosent_exist'){
    echo json_encode([
        'error' => 'error', 
        'message'=> '<p class="alert alert-danger">The e-mail/phone number address you provided does not exist. Please create an account first.</p>',
    ]);
}

else if($status === 'error'){
    echo json_encode([
        'error' => 'error', 
        'message'=> '<p class="alert alert-danger">Incorrect e-mail/phone number or password</p>',
    ]);
}

之后,它在user.php中运行一个方法并设置会话变量

public function login($user, $db){

    if(empty($user['emailPhone']) OR empty($user['password'])){
        return 'missing_fields';
    }
    else if(!$this->emailExists($user['emailPhone'],$db) AND !$this->phoneExists($user['emailPhone'],$db)){
        return 'email_dosent_exist';
    }
    else{

    $sql = "SELECT * FROM `users` WHERE `email`=? OR `phone_number`=?" ;
    $statement = $db->prepare($sql);



    if( is_object($statement) ){

        $statement->bindParam(1, $user['emailPhone'], PDO::PARAM_STR);
        $statement->bindParam(2, $user['emailPhone'], PDO::PARAM_STR);
        $statement->execute();

        if($row = $statement->fetch(PDO::FETCH_OBJ)){

            if(password_verify($user['password'], $row->password)){
                if ( $row->is_admin == 'admin') {
                    $_SESSION['logged_in'] = [
                        'id'    =>  $row->id,
                        'name'  =>  $row->name,
                        'c1'    =>  $row->course1,
                        'conf1' =>  $row->paid1,
                        'c2'    =>  $row->course2,
                        'conf2' =>  $row->paid2,
                        'c3'    =>  $row->course3,
                        'conf3' =>  $row->paid3,
                        'c4'    =>  $row->course4,
                        'conf4' =>  $row->paid4,
                        'c5'    =>  $row->course5,
                        'conf5' =>  $row->paid5,
                        'isBossMan' =>  $row->is_admin,
                    ];
                    return 'successAdmin';
                }

                $_SESSION['logged_in'] = [
                    'id'    =>  $row->id,
                    'name'  =>  $row->name,
                    'c1'    =>  $row->course1,
                    'conf1' =>  $row->paid1,
                    'c2'    =>  $row->course2,
                    'conf2' =>  $row->paid2,
                    'c3'    =>  $row->course3,
                    'conf3' =>  $row->paid3,
                    'c4'    =>  $row->course4,
                    'conf4' =>  $row->paid4,
                    'c5'    =>  $row->course5,
                    'conf5' =>  $row->paid5,
                ]; 


                return 'success';
            }



        }

    }
    }
    return 'error';
}

但是我使用的会话变量太多了。这是一个好习惯吗?

另外,我需要帮助才能在不使用会话变量的情况下在profile.php上显示数据。我想在user.php中运行一个sql语句来从表中选择所有当前用户数据并在他的profile.php页面中显示为一个表?

到目前为止,我得到的是

public function displayInfo($user, $db){

    $sql = "SELECT `name`, `email`,`institute_name`, `country_code`, `phone_number`,  FROM `users` WHERE `email`=? OR `phone_number`=?" ;
    $statement = $db->prepare($sql);
    if( is_object($statement) ){

        $statement->bindParam(1, $user['adminFetch'], PDO::PARAM_STR);
        $statement->bindParam(2, $user['adminFetch'], PDO::PARAM_STR);
        $statement->execute();
        if($row = $statement->fetch(PDO::FETCH_OBJ)){
            if (!empty($_SESSION['logged_in']['isBossMan'])) {
                return 'success';
                echo json_encode($row);
            }
        }
    }
}

我该如何解决这个问题?我知道行变量具有我想要显示的必要信息但是如何在profile.php页面上显示它? 我是否需要编写另一个用于显示的ajax代码,或者可以使用相同的代码来执行此操作?

到目前为止我取得了一些进展: 我在profile.php页面上有一个字段,用户输入任何人的电子邮件,然后按一个按钮从数据库中获取该用户的信息,从表中获取用户信息,并在profile.php上的div中显示一个新的获取ajax代码I为它写道:

function fetchForm($fetch){
    $fetchFooter = $fetch.parent('.modal-body').next('.modal-fetchFooter');
    $fetchFooter.html('<img src="images/ajax-loader.gif">');
    $fetchBody = $fetchFooter.next();
    $.ajax({
        url: $fetch.attr('action'),
        method: $fetch.attr('method'),
        data : $fetch.serialize(),
        success : function( data ){
            data = $.parseJSON( data );
            $fetchFooter.html(data);

            if(data.error){
                $fetchFooter.html(data.message);
            }
        else{
            $fetchFooter.html(data);
        }       
     }
    })
}

将其发送到此fetch.php文件,该文件具有以下代码并在user.php中运行方法以检索信息

<?php
    require_once 'includes/init.php';    
    $status = $user->displayInfo($_POST, $db);

    if( $status === 'missing_fields'){
        echo json_encode([
            'error'=> 'error', 
            'message'=> '<p class="alert alert-danger">Please enter a e-mail address or phone number to fetch data.</p>',

        ]);
    }

user.php的方法看起来像

public function displayInfo($user, $db){
        if(empty($user['adminFetch'])){
            return 'missing_fields';
        }

        else if(!$this->emailExists($user['adminFetch'],$db) AND !$this->phoneExists($user['adminFetch'],$db)){
            return 'emailphone_dosent_exist';
        }

        else{
            $sql = "SELECT `name`, `email`,`institute_name`, `country_code`, `phone_number` FROM `users` WHERE `email`=? OR `phone_number`=?" ;
            $statement = $db->prepare($sql);
            if( is_object($statement) ){

                $statement->bindParam(1, $user['adminFetch'], PDO::PARAM_STR);
                $statement->bindParam(2, $user['adminFetch'], PDO::PARAM_STR);
                $statement->execute();
                if($row = $statement->fetch(PDO::FETCH_ASSOC)){
                    if (!empty($_SESSION['logged_in']['isBossMan'])) {                      
                       echo json_encode($row);

                    }
                }
            }
        }
        return 'missing_fields';    
    }

如果你没有输入任何东西并按下按钮,它工作正常。 div被错误代码替换。

但是当用户键入正确的现有电子邮件或电话号码时,方法和fetch.php将返回2个json对象。 一个具有用户信息,另一个具有错误状态。

我做错了什么,我怎么做到这样它只返回1 json,其中包含true的情况或错误的json错误情况?

1 个答案:

答案 0 :(得分:0)

解决。 我所要做的就是在user.php中返回$ row并在fetch.php中编码$ status,如此

<?php
    require_once 'includes/init.php';    
    $status = $user->displayInfo($_POST, $db);

    if( $status === 'missing_fields'){
        echo json_encode([
            'error'=> 'error', 
            'message'=> '<p class="alert alert-danger">Please enter a e-mail address or phone number to fetch data.</p>',

        ]);
    }
    else{echo json_encode($status)}

然后ajax能够显示错误和数据就好了!