Конвертируйте PHP Array в JSON Array и получите ответ с SLIM3 - PullRequest
0 голосов
/ 23 сентября 2018

У меня проблемы с преобразованием результата запроса к базе данных в массив json.Мой вывод выглядит следующим образом:

{
  "user_id": "1",
  "username": "testuser1",
  "user_permissions": [
    {
      "list_id": "1"
    },
    {
      "list_id": "2"
    },
    {
      "list_id": "3"
    }
  ],
  "android_app_id": null,
  "iat": 1537694955,
  "exp": 1537702155
}

Скобки ({}) вокруг массива JSON приводят к проблемам с синтаксическим анализом массива в ответе клиента.Мне просто нужно иметь простой массив типа (1, 2, 3).

Массив создается по результату запроса к базе данных (PHP), а затем с использованием операции SLIM3 $this->response->withJson:

$query = "SELECT list_id FROM permissions WHERE user_id='$user_id'";
$sth = $this->dbconnection->prepare($query);
$sth->execute();
$result_permissions = $sth->fetchAll();
return $result_permissions;

У меня действительно есть проблемы с преобразованием результатов базы данных в обычные массивы JSON, потому что PHP знает только ассоциативные массивы (числовые или с ключами), что приводит к неправильному форматированию массивов json.

Вывод json возвращается на сервер.Используя SLIM3 Framework, я получаю доступ к данным JSON и массиву разрешений следующим образом: $user_permissions = $decoded_response['user_permissions']; Теперь я пытаюсь получить список идентификаторов с $user_permissions[list'id][0], который дает 1, используя команду print_r.

Что я хочу сделатьдалее используется запрос к базе данных с оператором IN для проверки идентификатора полномочий.Поэтому мне нужно создать массив типа (1, 2, 3) .. Я застрял прямо сейчас, потому что я не знаю, как создать такой массив из JSON ..

Для меня самый простойподход будет заключаться в том, чтобы непосредственно создать такой массив после запроса к базе данных и добавить его в JSON в начале, но я не знаю, как этого добиться.

Есть какие-нибудь подсказки?

Ответы [ 2 ]

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

Для тех, у кого такая же проблема, вот что я сделал для создания массива:

      $query = "SELECT list_id FROM permissions WHERE user_id='$user_id'";
      $sth = $this->dbconnection->prepare($query);
      $sth->execute();
      $result_permissions;
      for ($i = 0; $i < $sth->rowCount(); $i++) {
        if ($i == $sth->rowCount() - 1) {
          $result = $sth->fetchColumn();
          $result_permissions .= $result;
        } else {
          $result = $sth->fetchColumn();
          $result_permissions .= $result . ",";
        }
      }
      return explode(',', $result_permissions);

Если вы json_encode этой строки, это приведет к следующему: {user_permissions":["1","2","3"]}, что мне и нужно.

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

Если я понял, чего вам нужно достичь, вы можете использовать функцию array_column php для получения массива list_ids http://php.net/manual/en/function.array-column.php

$json = '{
    "user_id": "1",
    "username": "testuser1",
    "user_permissions": [
        {
            "list_id": "1"
        },
        {
            "list_id": "2"
        },
        {
            "list_id": "3"
        }
    ],
    "android_app_id": null,
    "iat": 1537694955,
    "exp": 1537702155
    }
';

$arrayFromJson = json_decode($json, true);

$ids = array_column($arrayFromJson['user_permissions'], 'list_id');

print_r($ids);

Вывод print_r будет

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)

Чтобы получить строку типа (1,2,3), вы можете использовать функцию php implode https://secure.php.net/manual/en/function.implode.php

$inString= "(" . implode(",", $ids) . ")";

Вы получите строку, подобную этой: (1,2,3).

Имейте в виду, что непосредственное использование переменных в запросе SQL приводит к уязвимостям внедрения SQL

...