CodeIgniter не возвращает результат 2-й процедуры - PullRequest
1 голос
/ 20 марта 2020
  1. Я вызываю 2 функции из 2 разных моделей из контроллера покоя.
  2. Каждая процедура вызова функции модели.
  3. Первая функция модели возвращает результат, а вторая функция модели - нет. возвращает результат. Он возвращает значение $query->num_rows() как 2 строки, но не возвращает $query->result() or $query->result_array() or $query->result_object()
  4. После вызова каждой процедуры в функции модели я написал $query->next_result() & $query->free_result()

, но все равно он не работает

Первый контроллер покоя:

public function fetchAll_get() {
    $user = $this->validateToken(); //This
    $results = $this->AdminModel->selectAllAdmin($user);
    $this->set_response($results, REST_Controller::HTTP_OK);
}

Второй контроллер покоя:

public function validateToken() {
        try {
            $token = $this->getBearerToken();
            $payload = JWT::decode($token, SECRETE_KEY, ['HS256']);

            $isUserFound = $this->AuthModel->isUserExists($payload);

            if($isUserFound[0]->Status == "ERROR") {
                $response = array(
                    "Status" => "ERROR",
                    "Message" => "Token is invalid or expired"
                );
                $this->throwError($response);
            } else {
                return $payload;
            }
        } catch (Exception $e) {
            $response = array(
                "Status" => "ERROR",
                "Message" => $e->getMessage()
            );
            $this->throwError($response);
        }
}

Первая модель:

public function isUserExists($user)
{
    $sql = 'call usp_IsUserExists(?, ?)';
    $params = array(
        "username" => $user->userId,
        "userType" => $user->userType
    );
    $query = $this->db->query($sql, $params);
    $result = $query->result();

    $query->next_result();
    $query->free_result();

    return $result;
}

Вторая модель:

public function selectAllAdmin($user)
{
    $results[] = array();

    $sql = 'call usp_SelectAllAdmin(?)';
    $params = array(
        "createId" => $user->userId
    );
    $query = $this->db->query($sql, $params);
    $result = $query->result();

    $results[0]['data'] = $result;

    $query->next_result();
    $query->free_result();

    return $results;
}

Примечание 1: транзакция не требуется для обеих процедур, обе процедуры используются для извлечения данных.

Примечание 2: application/config/database.php

   $db['default'] = array(
                          'dbdriver' => 'mysqli'
                     )

Примечание 3: system/database/drivers/mysqli/mysqli_result.php

function next_result()
{
     if(is_object($this->conn_id))
     {
         return mysqli_next_result($this->conn_id);
     }
}

public function free_result()
{
    if (is_object($this->result_id))
    {
        $this->result_id->free();
        $this->result_id = FALSE;
    }
}

Первая процедура:

    DROP PROCEDURE IF EXISTS usp_IsUserExists;
    DELIMITER //
    CREATE PROCEDURE usp_IsUserExists(
        vUserId varchar(12),
        vUserType varchar(20)
    )
    BEGIN

        DECLARE custom_errors CONDITION FOR SQLSTATE '22012';
        DECLARE vUserStatus VARCHAR(20) DEFAULT NULL;
        DECLARE vMessage VARCHAR(500) DEFAULT NULL;
        DECLARE vUserCount INT DEFAULT 0;

        DECLARE EXIT HANDLER FOR SQLEXCEPTION
        BEGIN
            SELECT "ERROR" AS Status, "Exception Occurred: Please Try Again!" AS Message;
            ROLLBACK;
        END;

        DECLARE EXIT HANDLER FOR SQLWARNING
        BEGIN
            SELECT "ERROR" AS Status, "Warning Occurred: Please Try Again!" AS Message;
            ROLLBACK;
        END;

        DECLARE EXIT HANDLER FOR custom_errors
        BEGIN
            SELECT "ERROR" AS Status, vMessage AS Message;
            ROLLBACK;
        END;

        set time_zone = '+05:30';

        START TRANSACTION;

            IF trim(vUserType) = "Admin" OR trim(vUserType) = "SuperAdmin" OR trim(vUserType) = "SuperSuperAdmin" THEN
                SELECT COUNT(employeeId) INTO vUserCount FROM Admin WHERE employeeId = trim(vUserId);
                SELECT max(status) INTO vUserStatus FROM Admin WHERE employeeId = trim(vUserId);
            ELSEIF trim(vUserType) = "Customer" THEN
                SELECT COUNT(customerId) INTO vUserCount FROM Customer WHERE customerId = trim(vUserId);
                SELECT max(status) INTO vUserStatus FROM Customer WHERE customerId = trim(vUserId);
            ELSE
                SET vMessage = "You are not authorized person for this operation!";
                SIGNAL custom_errors;
            END IF;

            IF (trim(vUserType) != "SuperSuperAdmin" AND trim(vUserType) != "SuperAdmin" AND trim(vUserType) != "Admin" AND trim(vUserType) != "Customer") OR vUserType IS NULL OR vUserStatus != "Active" THEN
                SET vMessage = "You are not authorized person for this operation!";
                SIGNAL custom_errors;
            END IF;

            IF vUserCount <= 0 THEN
                SET vMessage = "User not exists!";
                SIGNAL custom_errors;
            END IF;

            SELECT "SUCCESS" AS Status, 'User Exists!' AS Message;

        COMMIT;
    END //
    DELIMITER ;

Вторая процедура:

    DROP PROCEDURE IF EXISTS usp_SelectAllAdmin;
    DELIMITER //
    CREATE PROCEDURE usp_SelectAllAdmin(
        vAdminId varchar(12)
    )
    BEGIN

        DECLARE custom_errors CONDITION FOR SQLSTATE '22012';
        DECLARE vUserType VARCHAR(20) DEFAULT NULL;
        DECLARE vUserStatus VARCHAR(20) DEFAULT NULL;
        DECLARE vMessage VARCHAR(500) DEFAULT NULL;
        DECLARE vAdminCount INT DEFAULT 0;

        DECLARE EXIT HANDLER FOR SQLEXCEPTION
        BEGIN
            SELECT "ERROR" AS Status, "Exception Occurred: Please Try Again!" AS Message;
            ROLLBACK;
        END;

        DECLARE EXIT HANDLER FOR SQLWARNING
        BEGIN
            SELECT "ERROR" AS Status, "Warning Occurred: Please Try Again!" AS Message;
            ROLLBACK;
        END;

        DECLARE EXIT HANDLER FOR custom_errors
        BEGIN
            SELECT "ERROR" AS Status, vMessage AS Message;
            ROLLBACK;
        END;

        set time_zone = '+05:30';

        START TRANSACTION;

            SELECT max(userType) INTO vUserType FROM Admin WHERE employeeId = trim(vAdminId);
            SELECT max(status) INTO vUserStatus FROM Admin WHERE employeeId = trim(vAdminId);

            IF (trim(vUserType) != "SuperSuperAdmin" AND trim(vUserType) != "SuperAdmin") OR vUserType IS NULL OR vUserStatus != "Active" THEN
                SET vMessage = "You are not authorized person for this operation!";
                SIGNAL custom_errors;
            END IF;

            SELECT count(*) INTO vAdminCount FROM Admin WHERE userType = "Admin";

            IF vAdminCount = 0 THEN
                SET vMessage = "Admin does not found!";
                SIGNAL custom_errors;
            END IF;

            SELECT id, employeeId, userType, lastName, firstName, middleName, gender, dob, maritalStatus, mobile, password, address, city, state, email, pincode, panCard, aadharCard, accountHolderName, bankName, branchName, accountType, accountNumber, ifsc, nomineeName, nomineeMobile, nomineeDOB, nomineeRelation, governmentIdUrl, panCardUrl, bankChequeUrl, profilePhotoUrl, joiningDate, createId, createDate, updateId, updateDate
            FROM Admin
            WHERE userType = "Admin"
            ORDER BY id;

        COMMIT;
    END //
    DELIMITER ;
...