обзор
У меня есть сценарий, мы назовем его one.php
, что создает базу данных и таблицы. Он также содержит массив данных для публикации в другом скрипте, two.php
, который отсортирует данные и вставит их в нашу вновь созданную базу данных.
Ваша помощь очень, очень ценится.
Эта проблема
two.php
есть чек на $_POST[]
массив в самом верху скрипта:
if (empty($_POST))
{
$response = array('status' => 'fail', 'message' => 'empty post array');
echo json_encode($response);
exit;
}
Обычно это не сработает, если массив post empty()
, Однако при отправке данных из one.php
в two.php
с помощью cURL
Я получаю вышеуказанный кодированный массив в качестве ответа, и мои данные не прогрессируют дальше two.php
,
Я выложу соответствующий код из файлов ниже для вашего удобства просмотра:
one.php
$one_array = array('name' => 'John', 'fav_color' => 'red');
$one_url = 'http://' . $_SERVER['HTTP_HOST'] . '/path/to/two.php';
$response = post_to_url($one_url, $one_array, 'application/json');
echo $response; die;
Это в настоящее время дает мне следующее:
{"status":"fail","message":"empty post array"}
post_to_url()
функция, для справки
function post_to_url($url, $array, $content_type)
{
$fields = '';
foreach($array as $key => $value)
{
$fields .= $key . '=' . $value . '&';
}
$fields = rtrim($fields, '&');
$ch = curl_init();
$httpheader = array(
'Content-Type: ' . $content_type,
'Accept: ' . $content_type
);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
two.php
header("Content-type: application/json");
$response = array(); //this is used to build the responses, like below
if (empty($_POST))
{
$response['status'] = 'fail';
$response['message'] = 'empty post array';
echo json_encode($response);
exit;
}
elseif (!empty($_POST))
{
//do super neat stuff
}
Поскольку вы устанавливаете тип содержимого тела запроса как «application / json», PHP не будет заполняться $_POST
в «two.php». Поскольку вы отправляете данные в кодировке URL, лучше всего отправить только Accept:
заголовок:
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Accept: ' . $content_type]);
Тем не менее, «two.php» на самом деле не использует заголовок Accept: и всегда выводит JSON; в этом случае вы можете обойтись без установки CURLOPT_HTTPHEADER
совсем.
Создание закодированных данных url из массива также может быть проще (и безопаснее):
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($array));
У меня есть такая проблема, но в моем случае я добавил
Content-Type: {APPLICATION/TYPE}
Content-Length: {DATA LENGTH}
и проблема была решена.