#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); }
Комментариев нет:
Отправить комментарий