Рекурсия + cUrl

300
12 марта 2017, 08:18

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

Есть класс, в котором реализована авторизация и получение данных из другого сайта. При вызове метода get_histroy мы должны получить данные с сайта, будучи авторизованными. Если мы не авторизованы, то вызываем метод auth, который проходит авторизацию и после этого снова вызываем метод get_histroy что бы получить данные.

class TestClass{
/**
 * @var string
 */
private $login = "";
private $password = "";
private $phone = "";
private $url = "https://test.ru/";
private $curl = "";
public $cookie_file = 'cookie.txt';

function __construct($login, $password, $phone)
{
    $this->login = $login;
    $this->password = $password;
    $this->phone = $phone;
    $this->curl = curl_init();
}
/**
 * @name Authorization
 */
private function auth()
{
    $url_auth = "https://auth.test.ru/auth?retpath=https://mail.test.ru";
    curl_setopt($this->curl, CURLOPT_POST, 1);
    $post_login = "login=".$this->login."&passwd=".$this->password;
    curl_setopt($this->curl, CURLOPT_URL, $url_auth);
    curl_setopt($this->curl, CURLOPT_POSTFIELDS, $post_login);
    curl_exec($this->curl);
    curl_setopt($this->curl, CURLOPT_COOKIEJAR, $this->cookie_file); // записываем файл с куками
}
/**
 * @param bool $format
 * @return array|mixed|null|object
 */
public function get_histroy($format = false)
{
    curl_setopt($this->curl, CURLOPT_COOKIESESSION, true);
    curl_setopt($this->curl, CURLOPT_COOKIEFILE, $this->cookie_file);
    curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($this->curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($this->curl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($this->curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3');
    curl_setopt($this->curl, CURLOPT_POST, false);
    curl_setopt($this->curl, CURLOPT_URL, $this->url);
    $html = curl_exec($this->curl);
    $result_history = json_decode($html);
    var_dump($result_history);
    // если мы авторизованы
    if(isset($result_history -> success) && $result_history -> success == "1"){
        /**
         * @return json || array
         */
        if($format == false) return $result_history;
        else return json_decode($html, true);
    } else{ // если не авторизованы
        self::auth(); // проходим авторизацию
        self::get_histroy($format); // запускаем функцию заново
    }
}
function __destruct()
{
    curl_close($this->curl);
}
}

Вызов:

$object = new TestClass("admin", "pass", "+38000000000");
print_r($object ->get_histroy());

Проблема в том, что после авторизации метод не дает нам полученные данные, хотя авторизация проходит нормально. Если вставить var_dump($result_history); как в примере, то данные показываются, а вот из экземпляра класса он не выводится. Только если перезагрузить страницу, то все работает (уже будучи авторизованным).

Старался изложить проблему понятливее.

Answer 1

Решено:

return $this->get_histroy($format); // запускаем функцию заново и возвращаем результат (return)

Нужно было вернуть то что вернула функция.

READ ALSO
pattern singleton class Cookie

pattern singleton class Cookie

Написать класс-оболочку для работы с cookieКласс должен содержать следующий набор функций:

366
VK Errod code 17

VK Errod code 17

Я после получения code от VK, получаю access_token

351
Как добавить в меню показ всех товаров?

Как добавить в меню показ всех товаров?

Подскажите, допустим меню зарегистрировано в файле functionsphp

257
Не работает sql запрос в функции php

Не работает sql запрос в функции php

Доброг8о времени! У меня не работает sql запрос находящийся в теле функции php

382