Возвращенный массив присваивается как ноль переменной в PHP - PullRequest
0 голосов
/ 01 марта 2020

У меня есть функция в PHP, которая вызывает другую функцию класса для присвоения значения одной из ее переменных $related.

Исходная функция, требующая значения, использует функцию requestACLForAccess() для добавления определенной c переменной filter к переменной $headers:

Функция listRecords:

    public function listRecords($api)
{
    header("Access-Control-Allow-Origin: *");
    if ($this->authenticationProcedure() !== false) {
        $headers = apache_request_headers();
        $access = $this->requestACLForAccess($headers['module'], $headers['oauth_token'], $_SERVER['REQUEST_METHOD']);
        if(gettype($access) == "array"){
        $headers['filter'][0][$access[1]]['$equals'] = $access[2];
        }
        $listObject = new FilterApi();;
        return $listObject->filterList($api, $headers);
    }
}

Вызываемая функция requestACLForAccess:

protected function requestACLForAccess(
    $targetModule,
    $token,
    $req_type,
    $getSpecialFlag = false,
    $targetId = null
) {
    $row = $this->checkTokenValid("token", $token);
    if (!empty($row) || $row !== false) {
        $related = \Sugarcrm\Sugarcrm\custom\clients\base\CustomACL::checkRelated($row['module'], $targetModule, $row['id'], $req_type, $getSpecialFlag, $targetId);
        die(gettype($related)); // For debugging
        return $related;
    }
    else {
        return false;
    }
}

Вызванная функция находится в другом файле с именем customACL.php. Внутри этой функции определенный условный оператор возвращает array $arr, который должен быть присвоен конкретной переменной выше. Вызываемая функция:

    public static function checkRelated($module, $targetModule, $id, $req_type, $getSpecial, $targetId)
{
  $bean = \BeanFactory::retrieveBean($module, $id);
  if($bean->designation == self::ADMIN_NAME && !(in_array($targetModule, self::RECORD_RELATION_MODULES))){
    return self::ACL_ADMIN;
  } else{
    //first check if a relational table between modules exists
    $query = "select table_name from information_schema.tables where table_name like '%{$module}%{$targetModule}%' OR table_name like '%{$targetModule}%{$module}%'";
    $result = $GLOBALS['db']->query($query);
    $row = $result->fetch_assoc();
    if (empty($row)) { //if no table exists
       return self::ACL_ADMIN;
    } else { //find out table name
        $table_name = $row['table_name'];
        if ($req_type == 'PUT' || $req_type == 'DELETE' || $req_type == 'GET') { //check if record has relation
        $acl_access = self::checkRecordRelated($table_name, $id, $module, $req_type, $targetId, $targetModule);
      }
    }
  }
}

Для моего конкретного вызова c эта функция затем переходит к функции checkRecordRelated() в том же файле:

  protected static function checkRecordRelated($table_name, $id, $module, $req_type, $targetId, $targetModule)
{
    //find out module column name in relational table
    $query = "select column_name from information_schema.columns where table_name = '$table_name' and column_name like '%{$module}_id%' or column_name like '%{$module}s_id%'";
    $result = $GLOBALS['db']->query($query);
    $row = $result->fetch_assoc();
    if (empty($row)) {//if no column name
        return self::ACL_NON_ADMIN;
    } else {//return module column name
        $column_name = $row['column_name'];
    }

    if ($req_type == 'GET') {//if special GET request
        //find if related records exist in relational table for listing
        $findRelatedRecords = "select * from $table_name where $column_name = '$id' and 'deleted' = 0";
        $result = $GLOBALS['db']->query($findRelatedRecords);
        $row = $result->fetch_array();
        if (empty($row)) {//if NON_ADMIN exist
            return self::ACL_NON_ADMIN;
        } else {//if exist
            $arr = array(self::ACL_ADMIN, $table_name, $id);
            return $arr;
        }
    }
  }
}

До точки где я определил переменную $arr, проверка с помощью gettype() возвращает массив, а печать переменной дает мне (как и ожидалось) полный массив со значениями, которые я добавил. Однако, как только значение возвращается к исходной функции и присваивается переменной $related, массив каким-то образом становится NULL, а gettype () также возвращает NULL.

Update : я добавил недостающие функции, чтобы сделать его понятнее, надеюсь, это имеет смысл

Может кто-нибудь сказать мне, какую наивную ошибку я здесь делаю? Почему это происходит?

1 Ответ

1 голос
/ 01 марта 2020

Ну, это стыдно, я забыл вернуть переменную $aclaccess в функции checkrelated(), поэтому она показала ноль. Добавление возвращаемого значения было решением.

...