Можно ли отправить Http post запрос с типом контента multipart / form-data (files) и объектом json с параметрами данных вместе?

Я только что столкнулся с этой проблемой и закодировал небольшую обертку. Это не самый красивый или лучший код, я уверен, но он может помочь кому-то, вот он:

function runQuery(PDO $PDO, string $sql, array $params = [])
{
    if (!count($params)) {
        return $PDO->query($sql);
    }

    foreach ($params as $key => $values) {
        if (is_array($values)) {
            // get placeholder from array, e.g. ids => [7,12,3] would be ':ids'
            $oldPlaceholder  = ':'.$key;
            $newPlaceholders = '';
            $newParams = [];
            // loop through array to create new placeholders & new named parameters
            for($i = 1; $i <= count($values); $i++) {
                // this gives us :ids1, :ids2, :ids3 etc
                $newKey = $oldPlaceholder.$i;
                $newPlaceholders .= $newKey.', ';
                // this builds an associative array of the new named parameters
                $newParams[$newKey] = $values[$i - 1];
            }
            //trim off the trailing comma and space
            $newPlaceholders = rtrim($newPlaceholders, ', ');

            // remove the old parameter
            unset($params[$key]);

            // and replace with the new ones
            $params = array_merge($params, $newParams);

            // amend the query
            $sql = str_replace($oldPlaceholder, $newPlaceholders, $sql);
        }
    }

    $statement = $PDO->prepare($sql);
    $statement->execute($params);
    return $statement;
}

Например, передавая их в:

SELECT * FROM users WHERE userId IN (:ids)

array(1) {
  ["ids"]=>
  array(3) {
    [0]=>
    int(1)
    [1]=>
    int(2)
    [2]=>
    int(3)
  }
}

Становится:

SELECT * FROM users WHERE userId IN (:ids1, :ids2, :ids3)

array(3) {
  [":ids1"]=>
  int(1)
  [":ids2"]=>
  int(2)
  [":ids3"]=>
  int(3)
}

Это не пуленепробиваемый, но, как единственный разработчик для моих потребностей, он отлично работает, пока все равно.

0
задан Raz 17 January 2019 в 09:24
поделиться

1 ответ

Вы не можете отправлять оба типа в одном запросе, так как один из них имеет заголовок Content-Type: multipart/form-data, а запросы json имеют заголовок Content-Type: application/json. Вы можете обойти это, используя данные из нескольких частей формы, приведя в порядок свой json и добавив его в виде текстового поля, но я настоятельно рекомендую не делать этого.
Составные данные формы поддерживают добавление нескольких файлов к одному ключу в форме запроса

0
ответ дан omarwaleed 17 January 2019 в 09:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: