Я пытаюсь преобразовать британские почтовые индексы в longs и lats, используя PHP.
поэтому вместо использования карт Google я собираюсь использовать PHP CURL и использовать альтернативный поставщик, который проще реализовать.
тем не менее, у меня проблема с тем, что функция CURL возвращает что-либо, используя поле ввода в форме.
в основном, мне просто нужно поместить Кодовый Код в поле ввода в мою форму и нажать поиск, и он должен использовать CURL и вернуть длинный и лат этого почтового кода, но мой код этого не делает и вместо этого печатает поле ввода значение в строке URL и это!
вот мой весь код:
<?php
error_reporting(-1);
ini_set('display_errors', 'On');
if (isset($_POST["postcode"])) {
function postCode2Geog($code){
//$code = strtolower(str_replace(' ','',$code));
$code = $_POST["postcode"];
$uri = "http://www.streetmap.co.uk/streetmap.dll?GridConvert?name=".$code."&type=Postcode";
$ch = curl_init($uri);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
preg_match('#long</strong> \(wgs84\)\s*?\<\/td\>\s*?\<td width="50%" align="center" valign="middle"\>\S{2,3}:\S{2}:\S{2} \( (.*?) \)#i',$output,$longMatch);
preg_match('#lat</strong> \(wgs84\)\s*?\<\/td\>\s*?\<td width="50%" align="center" valign="middle"\>\S{2,3}:\S{2}:\S{2} \( (.*?) \)#i',$output,$latMatch);
$long = $longMatch[1];
$lat = $latMatch[1];
return array($lat,$long);
}
}
?>
и это часть HTML:
<form action="" method="GET">
<input type="text" name="postcode" />
<input type="submit" value="search" >
</form>
мог бы кто-нибудь проконсультировать по этому поводу?
РЕДАКТИРОВАТЬ:
error_reporting(-1);
ini_set('display_errors', 'On');
if (isset($_POST["postcode"])) {
//$code = strtolower(str_replace(' ','',$code));
$code = $_POST["postcode"];
$uri = "http://www.streetmap.co.uk/streetmap.dll?GridConvert?name=".$code."&type=Postcode";
$ch = curl_init($uri);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
preg_match('#long</strong> \(wgs84\)\s*?\<\/td\>\s*?\<td width="50%" align="center" valign="middle"\>\S{2,3}:\S{2}:\S{2} \( (.*?) \)#i',$output,$longMatch);
preg_match('#lat</strong> \(wgs84\)\s*?\<\/td\>\s*?\<td width="50%" align="center" valign="middle"\>\S{2,3}:\S{2}:\S{2} \( (.*?) \)#i',$output,$latMatch);
$long = $longMatch[1];
$lat = $latMatch[1];
return array($lat,$long);
}
во-первых, поскольку вы хотите использовать переменные $_POST
вам необходимо изменить свой метод формы на POST
<form action="" method="POST">
Вы также никогда не называете свою функцию, но вы никогда не узнаете об этом, потому что, когда вы проверяете if(isset($_POST['whatever']))
он никогда не будет установлен, потому что вы использовали GET
в качестве метода формы.
Вам нужно определить свою функцию вне этого блока кода и вызвать ее изнутри.
Вот рабочий пример: я использовал отдельную функцию для выполнения cURL для возврата любых ошибок
<?php
if(isset($_POST['postcode'])){
$data = postCode2Geog($_POST['postcode']);
var_dump($data);
}else{
displayForm();
}
function displayForm(){
echo "<form action='' method='post'>";
echo "<input type='text' name='postcode' />";
echo "<input type='submit' value='search' />";
echo "</form>";
}
function postCode2Geog($code){
$code = urlencode($code);
$uri = "http://www.streetmap.co.uk/streetmap.dll?GridConvert?name=$code&type=Postcode";
$output = url_get_contents($uri);
preg_match('#long</strong> \(wgs84\)\s*?\<\/td\>\s*?\<td width="50%" align="center" valign="middle"\>\S{2,3}:\S{2}:\S{2} \( (.*?) \)#i',$output,$longMatch);
preg_match('#lat</strong> \(wgs84\)\s*?\<\/td\>\s*?\<td width="50%" align="center" valign="middle"\>\S{2,3}:\S{2}:\S{2} \( (.*?) \)#i',$output,$latMatch);
$long = $longMatch[1];
$lat = $latMatch[1];
return array('lat'=>$lat,'long'=>$long);
}
function url_get_contents($url){
$crl = curl_init();
$timeout = 10;
curl_setopt_array($crl, array(
CURLOPT_URL => $url,
CURLOPT_ENCODING => 'UTF-8',
CURLOPT_RETURNTRANSFER => '1',
CURLOPT_FOLLOWLOCATION => '1',
CURLOPT_CONNECTTIMEOUT => $timeout)
);
$ret = curl_exec($crl);
$info = curl_getinfo($crl);
if ($ret === false || $info['http_code'] != 200) {
$ret = "No cURL data returned for $url [". $info['http_code']. "]";
if (curl_error($crl))
$ret .= "<br>\n Error: ". curl_error($crl) . "Code: " . curl_errno($crl);
}
curl_close($crl);
return $ret;
}
Возврат EC1R 4RR array(2) { ["lat"]=> string(9) "51.526254" ["long"]=> string(9) "-0.109119" }
Там отредактирован, чтобы вы могли хотя бы увидеть, что есть в массиве. И для их использования вы должны использовать $data['lat']
и $data['long']
POST
так как вы используете$_POST