Curl php array to string conversion in

Saved searches

Use saved searches to filter your results more quickly

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Curl Client Array to String error while creating Composition #553

Curl Client Array to String error while creating Composition #553

Comments

Hi i am creating a Composition and when request is called .it return Array to String Conversion error in CurlClient.php build query function. i also used http_build_query for this but not working.

Code Snippet

$composition = $client->video->compositions->create([ 'roomSid' => $room_sid, 'audioSources' => "*", 'videoLayout' => array( 'transcode' => array( 'video_sources' => array("*") ) ), 'format' => 'mp4' ]);

Exception/Log

"message": "Array to string conversion", "exception": "ErrorException", "file": "/var/www/html/vendor/twilio/sdk/Twilio/Http/CurlClient.php", "line": 177, 

The text was updated successfully, but these errors were encountered:

Thanks @childish-sambino i already solved this by replacing this line in CurlClient.php buildQuery function as
foreach ($params as $key => $value) <
if (is_array($value)) <
foreach ($value as $item) <
$parts[] = urlencode((string)$key) . ‘=’ . urlencode((string)$item);
>
> else <
$parts[] = urlencode((string)$key) . ‘=’ . urlencode((string)$value);
>
>

foreach ($params as $key => $value) <
if (is_array($value)) <
foreach ($value as $item) <
$parts[] = urlencode((string)$key) . ‘=’ . json_encode($item);
>
> else <
$parts[] = urlencode((string)$key) . ‘=’ . urlencode((string)$value);
>
>

You can’t perform that action at this time.

Источник

PHP: curl_setopt_array gives notice «array to string conversion»

This is what $curl_opt contains:,This code gives a Notice Notice: Array to string conversion in . curl_setopt_array( $ch, $curl_opt );,is_array($curl_opt) returns true, so I don’t really know what’s causing the notice.

This is what $curl_opt contains:

array (size=5) 42 => boolean true 19913 => boolean true 10018 => string 'PHP RestClient/0.1.2' (length=20) 10005 => array (size=1) 0 => string 'user:password' (length=13) 10002 => string 'http://longurl.com/' (length=389) 

Answer by Eden Hancock

This code gives a Notice Notice: Array to string conversion in . curl_setopt_array( $ch, $curl_opt );,is_array($curl_opt) returns true, so I don’t really know what’s causing the notice., curlopt_postfields $params ‘to’ as an array? Exact same approach as here: SendGrid with dynamic PHP params but what I’m trying to do is set multiple ‘to’ and ‘cc’ email addresses. Can these be set as an ar. jude.hyatt · saved on 5 months ago

Читайте также:  Javascript uncaught exception object

This is what $curl_opt contains:

array (size=5) 42 => boolean true 19913 => boolean true 10018 => string 'PHP RestClient/0.1.2' (length=20) 10005 => array (size=1) 0 => string 'user:password' (length=13) 10002 => string 'http://longurl.com/' (length=389) 

The key 10005 is not that case, it should be

$curl_opt = array( //. CURLOPT_USERPWD => '[username]:[password]' //. ); 

Answer by Augustine Hodge

 'foo', 'secondFieldData' => 'bar' ); $cURLConnection = curl_init('http://hostname.tld/api'); curl_setopt($cURLConnection, CURLOPT_POSTFIELDS, $postRequest); curl_setopt($cURLConnection, CURLOPT_RETURNTRANSFER, true); $apiResponse = curl_exec($cURLConnection); curl_close($cURLConnection); // $apiResponse - available data from the API request $jsonArrayResponse - json_decode($apiResponse);

Answer by Jaliyah Phelps

Error I am getting is Notice: Array to string conversion on line curl_setopt($ch, CURLOPT_POSTFIELDS, $data);,If anyone can help that would be great!,Here important options are the options to use CURLOPT_POST and CURLOPT_POSTFIELDS and NOT CURLOPT_CUSTOMREQUEST. Doing so will require you to take care of required headers and in particular, content size header, etc.,I am wanting to send a file via http POST using PHP and cURL.

$orgID = (is_numeric($_POST['orgID']) ? (int)$_POST['orgID'] : 0); $noteTitle = (isset($_POST['noteTitle']) ? $_POST['noteTitle'] : null); $noteBody = (isset($_POST['noteBody']) ? $_POST['noteBody'] : null); if(isset($_FILES['file']['tmp_name'])) < $ch = curl_init(); $cfile = new CURLFILE($_FILES['file']['tmp_name'], $_FILES['file']['type'], $_FILES['file']['name']); $data = array(); $data["TITLE"] = "$noteTitle"; $data["BODY"] = "$noteBody"; $data["LINK_SUBJECT_ID"] = "$orgID"; $data["LINK_SUBJECT_TYPE"] = "Organisation"; $data['FILE_ATTACHMENTS']['FILE_NAME'] = $_FILES['file']['name']; $data['FILE_ATTACHMENTS']['CONTENT_TYPE'] = $_FILES['file']['type']; $data['FILE_ATTACHMENTS']['URL'] = $_FILES['file']['tmp_name']; $localFile = $_FILES['file']['tmp_name']; $fp = fopen($localFile, 'r'); $headers = array( "authorization: Basic xxx", "cache-control: no-cache", "content-type: multipart/form-data", "postman-token: xxx" ); curl_setopt($ch, CURLOPT_URL, "https://api.insight.ly/v2.1/Notes"); curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 86400); // 1 Day Timeout curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_NOPROGRESS,false); curl_setopt($ch, CURLOPT_BUFFERSIZE, 128); curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localFile)); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $response = curl_exec($ch); if ($response === true) < $msg = 'File uploaded successfully.'; >else < $msg = curl_error($ch); >curl_close ($ch); $return = array('msg' => $msg); echo json_encode($return); > 

Источник

Проводка массива с curl_setopt

Вложенный код возвращает «Notice: Array to string conversion in …». Просто мой массив обрабатывается на удаленном сервере как строка, содержащая слово «Array». остальные переменные прекрасны.

Как я могу передать массив $anarray без этой проблемы?

php $data = array( 'anarray' => $anarray, 'var1' => $var1, 'var2' => $var2 ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "MY_URL"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_exec($ch); ?> 
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); // The values of variables will be shown but since we don't have them this is what we get 

Затем вы можете получить доступ к нему, используя $_POST

Лучший способ выполнить то, что вам нужно, – это использовать http_build_query() .

Полные данные для отправки в HTTP-режиме «POST». Чтобы опубликовать файл, добавьте имя файла с помощью @ и используйте полный путь. Тип файла может быть явно указан, следуя имени файла с типом в формате ‘; type = mimetype’. Этот параметр может быть передан как строка с urlencoded, например ‘para1 = val1 & para2 = val2 & …’, или как массив с именем поля в качестве ключа и данными поля в качестве значения. Если значением является массив, заголовок Content-Type будет установлен в multipart / form-data. Начиная с PHP 5.2.0, значение должно быть массивом, если файлы передаются этому параметру с префиксом @.

Из-за характера протокола HTTP и того, как работает функция curl_setopt, $ anarray не может передаваться непосредственно в виде массива.

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

принимает массив параметров POST, и для каждого из них должно быть имя строки и значение STRING . Вместо этого вы передаете значение массива, поэтому PHP-процессор вынужден преобразовать его в строку с использованием какого-то хромого встроенного алгоритма, который требует выдачи ранее упомянутого уведомления («Array to string conversion in …»).

Читайте также:  Словари методы словарей питон

Итак, чтобы правильно передать этот массив ($ anarray) на другую сторону, вы должны сами позаботиться о его кодировании (в строку), а другая сторона должна позаботиться о его расшифровке (из строки ).

Мой подход в таких ситуациях – JSON. Это достаточно подходит почти во всех случаях. Все, что вам нужно сделать, это применить следующую технику:

$data=array( 'anarray'=>json_encode($anarray), 'var1'=>$var1, 'var2'=>$var2 ); 

А затем, с другой стороны соединения, вы получите исходный массив следующим образом:

$anarray=json_decode($_POST['anarray'],true); // true indicates for associative array rather than an object 

Если $ anarray – массив, как я подозреваю, это не должно быть. Поверните его в строку, путем конкатенации или любого подходящего метода.

Изменить: см. Ответ Эрика Бутера.

Источник

Проводка многомерного массива с PHP и CURL

У меня возникли проблемы с отправкой данных формы через CURL на PHP-скрипт приема, расположенный на другом хосте.

Я получаю ошибку Array to string conversion в Array to string conversion

Это print_r массива, который я публикую:

Array ( [name] => Array ( [0] => Jason [1] => Mary [2] => Lucy ) [id] => 12 [status] => local [file] => @/test.txt ) 

Это строка, в которой происходит ошибка:

curl_setopt($this->ch, CURLOPT_POSTFIELDS, $post); 

Третий аргумент должен быть массивом, потому что мне нужно, чтобы заголовок Content-Type был настроен на multipart/form-data поскольку я отправляю файл через этот же массив, поэтому я не могу преобразовать массив в строку запроса или использовать http_build_query() ,

Также у меня нет доступа к коду на принимающем хосте, поэтому я не могу сериализовать и неэтериализовать массив.

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

Вам нужно будет построить строку POST вручную, а не передавать весь массив. Затем вы можете переопределить заголовок содержимого автозапуска curl с помощью:

curl_setopt($c, CURLOPT_HTTPHEADER, array("Content-type: multipart/form-data")); 

Сериализация / json-ifying будет проще, но, как вы говорите, у вас нет контроля над получающим концом, поэтому вам нужно сделать немного дополнительной работы.

Концепция массива на самом деле не существует, когда дело доходит до HTTP-запросов. PHP (и, вероятно, другие серверные языки) имеет логику, испеченную в том, что может принимать данные запроса, которые похожи на массив (к нему), и объединяет их как массив при $_GET , $_POST и т. Д.

Например, когда вы POST массива из формы, элементы формы часто выглядят примерно так:

Хотя PHP знает, что делать с этими данными, когда он его получает (т. Е. Строит массив), в HTML и HTTP, у вас есть три несвязанных ввода, которые просто имеют сходные (или то же, хотя это не технически корректный HTML ).

Читайте также:  Java formatted date to long

Чтобы сделать обратное для вашего запроса cURL, вам нужно разложить свой массив на строковые представления ключей. Итак, с вашим массивом name вы можете сделать что-то вроде:

foreach ($post['name'] as $id => $name) < $post['name[' . $id . ']'] = $name; >unset($post['name']); 

Это приведет к тому, что ваш массив $post выглядеть так:

Array ( [name[0]] => Jason [name[1]] => Mary [name[2]] => Lucy [id] => 12 [status] => local [file] => @/test.txt ) 

И тогда каждый ключ в массиве, который вы публикуете, будет скалярным значением, ожидаемым cURL, и массив будет представлен так, как вам нужно для HTTP.

function http_build_query_for_curl( $arrays, &$new = array(), $prefix = null ) < if ( is_object( $arrays ) ) < $arrays = get_object_vars( $arrays ); >foreach ( $arrays AS $key => $value ) < $k = isset( $prefix ) ? $prefix . '[' . $key . ']' : $key; if ( is_array( $value ) OR is_object( $value ) ) < http_build_query_for_curl( $value, $new, $k ); >else < $new[$k] = $value; >> > $arrays = array( 'name' => array( 'first' => array( 'Natali', 'Yura' ) ) ); http_build_query_for_curl( $arrays, $post ); print_r($post); 
$array = urldecode(http_build_query($array)); 

Ниже приведен пример кода, где это используется в реальной жизни:

Когда у вас есть раздел вложенных $ params в приведенном выше примере, он проанализирует его соответствующим образом и подготовит его для публикации через curl.

Прежде всего, я хотел бы поблагодарить Даниэля Вандерслуиса за его проницательный ответ . Основываясь на его введении, я придумал это, чтобы исправить проблему из первоначального вопроса:

 $output = array(); foreach($data as $key => $value) < $final_key = $prefix ? "[]" : $key; if (is_array($value)) < // @todo: handle name collision here if needed $output += curl_postfields_flatten($value, $final_key); >else < $output[$final_key] = $value; >> return $output; > 

Использование должно выглядеть следующим образом:

curl_setopt($this->ch, CURLOPT_POSTFIELDS, curl_postfields_flatten($post)); 

Эта функция преобразует массивы следующим образом:

array( 'a' => 'a', 'b' => array( 'c' => array( 'd' => 'd', 'e' => array( 'f' => 'f', ), ), ), ); 
array( 'a' => 'a', 'b[c][d]' => 'd', 'b[c][e][f]' => 'f', ) 

Он не обрабатывает случаи со смешанным форматом, когда происходит такое столкновение:

array( 'b[c]' => '1', 'b' => array( 'c' => '2', ), ); 

Выход будет содержать только первое значение для этого ключа

Я думаю, вам нужно передать параметры в виде строки:

curl_setopt($this->ch, CURLOPT_POSTFIELDS, 'name[]=Jason&name[]=Mary&name[]=Lucy. '); 

Затем вы можете настроить заголовок вручную через CURLOPT_HTTPHEADER.

Параметр cURL CURLOPT_POSTFIELDS будет принимать либо строковый, либо простой массив, но не вложенный массив. Попытка сделать это приведет к генерации ошибки Array to string conversion .

Однако http_build_query() может обрабатывать вложенный массив, поэтому используйте его для преобразования массива $_POST в строку, а затем отправляйте эту строку. Итак, где у вас есть;

curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST); 

используйте это вместо этого;

curl_setopt($ch, CURLOPT_POSTFIELDS, urldecode(http_build_query($_POST))); 
$post = "ac=on&p=1&pr[]=0&pr[]=1&a[]=3&a[]=4&pl=on&sp[]=3&ct[]=3&s=1&o=0&pp=3&sortBy=date"; parse_str($post,$fields); $url = 'http://example.com/'; //open connection $ch = curl_init(); //set the url, number of POST vars, POST data curl_setopt($ch,CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_POST, true); curl_setopt($ch,CURLOPT_POSTFIELDS, $fields); curl_setopt($ch,CURLOPT_RETURNTRANSFER, true); //execute post $result = curl_exec($ch); //close connection curl_close($ch); 

Источник

Оцените статью