Я использую Zillow API для того, чтобы получить некоторые данные из пользовательского ввода. До сих пор я был в состоянии правильно использовать API для получения нужных данных из одного ввода.
Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь преобразовать свой простой блок кода в функцию, которую я могу многократно использовать с несколькими входами. В конечном счете, я хочу, чтобы пользователь мог загрузить CSV-файл или что-то еще и запустить это функционировать через несколько входов.
Ниже мой код, который функционирует должным образом:
HTML
<form action="logic.php" method="post">
<p>Address: <input type="text" name="address"></p>
<p>City/State: <input type="text" name="csz"></p>
<input type="submit">
</form>
PHP
//API Key
$api_key = 'XXXxxXXX';//User Inputs
$search = $_POST['address'];
$citystate = $_POST['csz'];
//User Inputs Fromatted
$address = urlencode($search);
$citystatezip = urlencode($citystate);//Get Address ID From API
$url = "http://www.zillow.com/webservice/GetSearchResults.htm?zws-id=".$api_key."&address=".$address."&citystatezip=".$citystatezip;
$result = file_get_contents($url);
$data = simplexml_load_string($result);
$addressID = $data->response->results->result[0]->zpid;//Get Estimate from API (using adressID)
$estimate_url = "http://www.zillow.com/webservice/GetZestimate.htm?zws-id=".$api_key."&zpid=".$addressID;
$estimate_result = file_get_contents($zurl);
$estimate_data = simplexml_load_string($zresult);
$estimate = $zdata->response->zestimate->amount;
echo $estimate;
Теперь проблема заключается в том, когда я пытаюсь объединить их в две отдельные функции, чтобы использовать их для нескольких входов.
$api_key = 'XXXxxXXX';
//User Inputs
$search = $_POST['address'];
$citystate = $_POST['csz'];
//User Inputs Fromatted
$address = urlencode($search);
$citystatezip = urlencode($citystate);function getAddressID($ad,$cs){
//Get Address ID From API
$url = "http://www.zillow.com/webservice/GetSearchResults.htm?zws-id=".$api_key."&address=".$ad."&citystatezip=".$cs;
$result = file_get_contents($url);
$data = simplexml_load_string($result);
$addressID = $data->response->results->result[0]->zpid;
return $addressID;
}
$addressID = getAddressID($address, $citystatezip);function getEstimate($aID){
//Get Estimate from API (using adressID)
$estimate_url = "http://www.zillow.com/webservice/GetZestimate.htm?zws-id=".$api_key."&zpid=".$aID;
$estimate_result = file_get_contents($estimate_url);
$estimate_data = simplexml_load_string($estimate_result);
$estimate = $estimate_data->response->zestimate->amount;
return $estimate;
}
echo getEstimate($addressID); //Calling function doesn't return anything
Если по сути я делаю то же самое, что и первый пример PHP. Почему это не работает изнутри функции? Я что-то упустил?
Помощь муравья по этому вопросу будет принята с благодарностью.
Проблема в том, что вы используете $api_key
переменная внутри обеих функций, и эта переменная там не доступна. PHP работает немного иначе, чем другие языки. Вы можете прочитать об этом здесь: http://php.net/manual/en/language.variables.scope.php
Я предлагаю вам извлечь функцию для вызова API. Таким образом, вы можете объявить ключ API в этой функции. Это также позволяет вам легче поддерживать ваш код (вы могли бы улучшить свой вызов API, добавив некоторую обработку ошибок или переключившись на curl или что-то в этом роде). Золотое правило программиста — не повторяй себя.
Код может выглядеть примерно так (не проверено):
//User Inputs
$search = $_POST['address'];
$citystate = $_POST['csz'];
//User Inputs Fromatted
$address = urlencode($search);
$citystatezip = urlencode($citystate);
function callZillow($endpoint, array $params)
{
$params['zws-id'] = 'XXX'; // this would be your api_key
$url = 'http://www.zillow.com/webservice/' . $endpoint . '.htm?' . http_build_query($params);
$result = file_get_contents($url);
return simplexml_load_string($result);
}function getAddressID($ad, $cs)
{
//Get Address ID From API
$data = callZillow('GetSearchResults', ['address' => $ad, 'citystatezip' => $cs]);
$addressID = $data->response->results->result[0]->zpid;
return $addressID;
}
$addressID = getAddressID($address, $citystatezip);
function getEstimate($aID)
{
//Get Estimate from API (using adressID)
$estimate_data = callZillow('GetZestimate', ['zpid' => $aID]);
$estimate = $estimate_data->response->zestimate->amount;
return $estimate;
}
echo getEstimate($addressID);
Других решений пока нет …