explode () ожидает, что параметр 2 будет строкой, задан массив - PullRequest
0 голосов
/ 26 сентября 2018

Я разработал приведенный ниже код, где я использую Explode для разнесения данных ниже,

"10.74.10.1", "10.75.10.132"

, однако я получаю ошибку ниже

"explode () ожидает, что параметр 2 будетстрока, массив указан в строке .. "

Может кто-нибудь подсказать, пожалуйста, что не так в моем коде.

Это мой полный код:

public function pagesviewlogsAction()
    {
        // Checks authorization
        $this->acl->doCheck($this);

-- language: lang-html -->      // Validates request
        $requestObj = new PagesviewlogEventRequest();

$requestObj->userid = (Utils::validatePattern(Utils::REGEXP_SECLOGS_USERID, (($json->userid) ?? FALSE) )) ? $json->userid:NULL;
                $requestObj->clientip = array();
                //if (isset($json->clientip) && $json->clientip != '' && $json->clientip != NULL) {
                if (isset($json->clientip) && is_string($json->clientip)){
                    $tmp = explode(',', $json->clientip);                   
                    foreach ($tmp as $key => $ipValue) {
                        $requestObj->clientip[] = (Utils::validatePattern(Utils::REGEXP_SECLOGS_IP, ((trim($ipValue)) ?? FALSE) )) ? trim($ipValue):NULL;
                    }
                }

        }


        foreach (get_object_vars($requestObj) as $key => $value) {
            switch ($key) {
                case 'clientip':
                    // ...
                    break;

                default:
                   // Other cases
                    if ($value === FALSE) {
                        return new JsonModel([
                            'status' => 'FAILED',
                            'errorField' => $key,
                            'message'=> 'Parameters "' . $key . '" is missing or invalid.',
                            'data' => NULL
                        ]);
                    }
                    break;
            }
        }

    }


}

Ответы [ 4 ]

0 голосов
/ 26 сентября 2018

Могу ли я предложить возможность?Я бы проверил оба возможных случая.Если массив выполняется в одну сторону, если строка выполняет ваш разнесение.

if (!isset($json->clientip)) {
    // thow exception or return call
}

$requestObj->clientip = [];

if (is_array($json->clientip)) {
  array_walk($json->clientip, function($ipValue) use(&$requestObj) {
    $ipValue = trim($ipValue);
    $requestObj->clientip[] = (Utils::validatePattern(Utils::REGEXP_SECLOGS_IP, (($ipValue) ?? FALSE) )) ? $ipValue:NULL;
  });
} else if (is_string($json->clientip)) {
   // execute your explode
}

Также я бы посоветовал проверить Marshallers, чтобы помочь вам разобрать логику в вашем коде, чтобы привести его в порядок, а не оставлять все в одном месте.Так что, по моему мнению, ваш Utils :: validatePattern может быть маршаллером

0 голосов
/ 26 сентября 2018

Условие:

if (isset($json->clientip) && $json->clientip != '' && $json->clientip != NULL)

может вернуть true с массивом.

лучше использовать что-то вроде этого: if (isset($json->clientip) && is_string($json->clientip))

0 голосов
/ 26 сентября 2018

Функция explode () преобразует строку в массив, используя заданный разделитель, в вашем случае "," Поскольку $ json-> clientip уже является массивом, простое (не лучшее) решение состоит в том, чтобы изменить кодto:

    $requestObj->clientip = array();
    if (is_array($json->clientip)) {

        foreach ($json->clientip as $key => $ipValue) {
            $requestObj->clientip[] = (Utils::validatePattern(Utils::REGEXP_SECLOGS_IP, ((trim($ipValue)) ?? FALSE) )) ? trim($ipValue):NULL;
        }
    } else {
//handle the other option here. like string or object
}

и это зависит от источника $ json-> clientip, чтобы убедиться, что вы используете правильный подход в случае, если вы не получаете массив.

0 голосов
/ 26 сентября 2018

Точно так же, как он говорит,

"10.74.10.1", "10.75.10.132" - это массив.Для Explode требуется строка, потому что он создает массив на основе разделителя ,

Попробуйте var_dump () в вашем $ json-> clientip и посмотрите, как он выглядит, возможно, вам придется переделать коднемного здесь.

...