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