У меня есть функция в 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 : я добавил недостающие функции, чтобы сделать его понятнее, надеюсь, это имеет смысл
Может кто-нибудь сказать мне, какую наивную ошибку я здесь делаю? Почему это происходит?