@krinbin

Как переписать file_get_contents на (через) cURL?

Всем привет.
Суть вопроса следующая.
Есть скрипт обработки почты для отправки в Google Form.

в скрипте есть переменная $url = https://docs.google.com/forms/d/e/**********/formR...

На сервере стоит запрет на внешние файлы в PHP
allow_url_fopen = Off

И скрипт 'ломается' на строчке
$result = file_get_contents($url, false, $context);

Как переписать кусок на cURL, чтоб не включать allow_url_fopen ???

<?php
if (!$_POST) die('приветик'); // если глобальный массив POST не передан значит приветик
// иначе продолжаем

$response = array(); // сюда будем писать то что будем возвращать скрипту

$field1 = isset($_POST['field1']) ? $_POST['field1'] : false; // сунем каждое поле в отдельную переменную
$field2 = isset($_POST['field2']) ? $_POST['field2'] : false;
$field3 = isset($_POST['field3']) ? $_POST['field3'] : false;
$field4 = isset($_POST['field4']) ? $_POST['field4'] : false;
$field5 = isset($_POST['field5']) ? $_POST['field5'] : false;
$field6 = isset($_POST['field6']) ? $_POST['field6'] : false;

// сюда можно положить всякие проверки полей и капчу например
if (!$field1 || !$field2) { // в моем случае надо чтобы первые 2 поля не были пустыми
    $response['ok'] = 0; // пишем что все плохо
    $response['message'] = '<p class="error">Не заполнены первые два поля. Их всего два, ну ты чо? =)</p>'; // пишем ответ
    die(json_encode($response)); //выводим массив в json формате и умираем
}

// теперь подготовим данные для отправки в гугл форму
$url = 'https://docs.google.com/forms/d/1xwGBCGQyvim9DY0Teuwlq5AtE7DJUCSogSwgGC-dwFA/formResponse'; // куда слать, это атрибут action у гугл формы 
$data = array(); // массив для отправки в гугл форм
$data['entry.1708534700'] = $field1; // указываем соответствия полей, ключи массива это нэймы оригинальных полей гуглформы
$data['entry.1715525179'] = $field2;
$data['entry.750520923'] = $field3;
$data['entry.1217837295'] = $field4;
$data['entry.1912015558'] = $field5;
$data['entry.635644082'] = 'Собственный HTML+jQuery+PHP'; // это наше скрытое поле


$data = http_build_query($data); // теперь сериализуем массив данных в строку для отправки
foreach ($field4 as $key => $value) { // если у нас есть элементы с нескольки значениями (например чекбоксы), надо пройтись по каждому и заменить кое что в отправляемой строке
    $data = str_replace('entry.1217837295%5B'.$key.'%5D', 'entry.1217837295', $data); // а именно выпилить [0], [1], [2].. из ключей, иначе в гугл форму это поле с несколькими значениями не запишется
}

$options = array( // задаем параметры запроса
    'http' => array(
        'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
        'method'  => 'POST',
        'content' => $data,
    ),
);
$context  = stream_context_create($options); // создаем контекст отправки
$result = file_get_contents($url, false, $context); // отправляем

if (!$result) { // если что-то не так
    $response['ok'] = 0; // пишем что все плохо
    $response['message'] = '<p class="error">Что-то пошло не так, попробуйте отправить позже.</p>'; // пишем ответ
    die(json_encode($response)); //выводим массив в json формате и умираем
}

$response['ok'] = 1; // если дошло до сюда, значит все ок
$response['message'] = '<p class="">Все ок, отправилось.</p>'; // пишем ответ
die(json_encode($response)); //выводим массив в json формате и умираем

?>
  • Вопрос задан
  • 301 просмотр
Решения вопроса 1
@krinbin Автор вопроса
Научным методом нашел решение

$options = ['content' => $data];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $options);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: application/x-www-form-urlencoded\r\n"));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);


и вот это выпиливаем из скрипта, если вдруг кому понадобится

$options = array( // задаем параметры запроса
    'http' => array(
        'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
        'method'  => 'POST',
        'content' => $data,
    ),
);
$context  = stream_context_create($options); // создаем контекст отправки
$result = file_get_contents($url, false, $context); // отправляем
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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