Страницы

Поиск по вопросам

пятница, 10 января 2020 г.

Некорректно работает функция, вызванная посредством ajax

#php #javascript #jquery


Есть скрипт, который вызывает php-функцию посредством ajax-запроса. Функция выполняется,
но остальные нужные для работы запроса функции игнорируются. 

PHP:

  if(isset($_POST['action']) && function_exists($_POST['action'])) {
        $action = $_POST['action'];
        switch($action) {
            case 'findPopularDirection':
                findPopularDirection();
            case 'getSpecialOffersList':
                getSpecialOffersList();
            default:
                die('Access denied for this function!');
        }
    }

function getCurrencyCode($country_code) { // функция определения валюты по стране
проживания
    $currency_codes = array(
        'Украина' => 'UAH',
        'Россия' => 'RUB',
        'Беларусь' => 'BYN',);

    if(isset($currency_codes[$country_code]))
        return $currency_codes[$country_code];

    return 'USD'; // Default to USD
}

function currencyToIcon($country_code) {
    if($country_code === 'USD') { return '$'; }
    else if($country_code === 'UAH') { return '₴'; }
    else if($country_code === 'RUB') { return '₽'; }
    else if($country_code === 'BYN') { return 'BYN'; }
}

function LocateUserGeo() {
    $user_ip = $_SERVER['REMOTE_ADDR'];
    global $ch;
    curl_setopt($ch, CURLOPT_URL, "http://www.travelpayouts.com/whereami?locale=ru&callback=useriata&ip="
. $user_ip);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("X-Access-Token: 6c2df703e0853f2e0137761ea6d58305"));
    $response = curl_exec($ch);
    return $response = json_decode($response = preg_replace('/^[^\(]+\((.*)\)$/',
'$1', $response), true);
}

function findPopularDirection() {
    $geo = LocateUserGeo();
    $link = "http://api.travelpayouts.com/v1/city-directions?origin=" . $geo['iata']
. "¤cy=" . getCurrencyCode($geo['country_name']);
    global $ch;
    curl_setopt($ch, CURLOPT_URL, $link);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("X-Access-Token: 6c2df703e0853f2e0137761ea6d58305"));
    $response = curl_exec($ch);
    return $popular = json_decode($response, true);
}


ajax-запрос:

$(function(){
    $.ajax({ 
        url: '/php/popular.php?action=findPopularDirection',
        dataType: 'json'
    }).done(function(data){
        console.log(data);
    });
});


Суть ошибки состоит в том, что при вызове функции посредством php она правильно компонует
ссылку "http://api.travelpayouts.com/v1/city-directions?origin=" . $geo['iata'] . "¤cy="
. getCurrencyCode($geo['country_name']). Но в случае вызова функции посредством ajax
функция getCurrencyCode() игнорируется. Почему это происходит и как это исправить?
    


Ответы

Ответ 1



Общие моменты: в конце кода каждого кейса ставьте break, если не хотите чтобы они выполнялись подряд друг за другом старайтесь не использовать глобальные переменные, потому что это зло благодаря использованию глобольной переменной $ch у вас например смешивались параметры cURL и несмотря на то, что параметры для запроса вы устанавливали в разных функциях они смешиваются, т.к. они работают с одной и той же переменной в вашем примере curl_exec($ch) возвращал TRUE, а результат запроса выводил в стандартный поток вывода, поэтому все дальнейшие действия над $response были бессмыслинными однако где-то это сыграло вам на руку...например в свитче результат запроса волшебным образом транслировался из запроса отосланного из php в результат его работы...и здесь вам придётся сделать выбор. для того чтобы получить ответ на запрос в виде строки при вызове curl_exec($ch) Вам необходимо установить параметр CURLOPT_RETURNTRANSFER, который отвечает за то куда выводить результат запроса(по умолчанию в стандартный поток вывода или же в качестве результата вызова метода) и отдельно...вот так вот лучше не делать, даже несмотря на то что это работает...это очень сложно читать return $response = json_decode($response = preg_replace('/^[^\(]+\((.*)\)$/', '$1', $response), true); так на мой взгляд гораздо приятнее: return json_decode(preg_replace('/^[^\(]+\((.*)\)$/', '$1', $response), true); Учтём всё написанное: if(isset($_POST['action']) && function_exists($_POST['action'])) { $action = $_POST['action']; switch($action) { case 'findPopularDirection': findPopularDirection(); case 'getSpecialOffersList': getSpecialOffersList(); default: die('Access denied for this function!'); } } function getCurrencyCode($country_code) { // функция определения валюты по стране проживания $currency_codes = array( 'Украина' => 'UAH', 'Россия' => 'RUB', 'Беларусь' => 'BYN',); if(isset($currency_codes[$country_code])) return $currency_codes[$country_code]; return 'USD'; // Default to USD } function currencyToIcon($country_code) { if($country_code === 'USD') { return '$'; } else if($country_code === 'UAH') { return '₴'; } else if($country_code === 'RUB') { return '₽'; } else if($country_code === 'BYN') { return 'BYN'; } } function LocateUserGeo() { $user_ip = $_SERVER['REMOTE_ADDR']; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.travelpayouts.com/whereami?locale=ru&callback=useriata&ip=" . $user_ip); curl_setopt($ch, CURLOPT_HTTPHEADER, array("X-Access-Token: 6c2df703e0853f2e0137761ea6d58305")); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $response = curl_exec($ch); return json_decode(preg_replace('/^[^\(]+\((.*)\)$/', '$1', $response), true); } function findPopularDirection() { $geo = LocateUserGeo(); $link = "http://api.travelpayouts.com/v1/city-directions?origin=" . $geo['iata'] . "¤cy=" . getCurrencyCode($geo['country_name']); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $link); curl_setopt($ch, CURLOPT_HTTPHEADER, array("X-Access-Token: 6c2df703e0853f2e0137761ea6d58305")); //curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $response = curl_exec($ch); //return $popular = json_decode($response, true); } но и тут есть свои минусы: в методе findPopularDirection я не стал править до конца...я не проставил там параметр curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE) и результат вывода транслируется в std_out. но такая штука вводит в заблуждение потому что непонятно откуда выводится результат и почему параметр лучше проставить, но тогда вам придётся переделать SWITCH в самом начале...т.к. он вызывает методы, но не принимает результатов их работы и не выводит их клиенту получится как-то так но с остальными кейсами придётся разобраться самому if(isset($_POST['action']) && function_exists($_POST['action'])) { $action = $_POST['action']; switch($action) { case 'findPopularDirection': $response = findPopularDirection(); echo json_encode($response); break; case 'getSpecialOffersList': getSpecialOffersList(); break; default: die('Access denied for this function!'); } } function getCurrencyCode($country_code) { // функция определения валюты по стране проживания $currency_codes = array( 'Украина' => 'UAH', 'Россия' => 'RUB', 'Беларусь' => 'BYN',); if(isset($currency_codes[$country_code])) return $currency_codes[$country_code]; return 'USD'; // Default to USD } function currencyToIcon($country_code) { if($country_code === 'USD') { return '$'; } else if($country_code === 'UAH') { return '₴'; } else if($country_code === 'RUB') { return '₽'; } else if($country_code === 'BYN') { return 'BYN'; } } function LocateUserGeo() { $user_ip = $_SERVER['REMOTE_ADDR']; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.travelpayouts.com/whereami?locale=ru&callback=useriata&ip=" . $user_ip); curl_setopt($ch, CURLOPT_HTTPHEADER, array("X-Access-Token: 6c2df703e0853f2e0137761ea6d58305")); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $response = curl_exec($ch); return json_decode(preg_replace('/^[^\(]+\((.*)\)$/', '$1', $response), true); } function findPopularDirection() { $geo = LocateUserGeo(); $link = "http://api.travelpayouts.com/v1/city-directions?origin=" . $geo['iata'] . "¤cy=" . getCurrencyCode($geo['country_name']); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $link); curl_setopt($ch, CURLOPT_HTTPHEADER, array("X-Access-Token: 6c2df703e0853f2e0137761ea6d58305")); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); $response = curl_exec($ch); return json_decode($response, true); }

Комментариев нет:

Отправить комментарий