2014-12-28 3 views
0

Я пытаюсь преобразовать британские почтовые индексы в longs и lats, используя PHP.PHP: функция CURL с использованием формы?

поэтому вместо использования карт 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> 

может кто-то пожалуйста, сообщите об этом?

EDIT:

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); 
} 
+0

где вы на самом деле называете эту функцию? Ваш метод формы также должен быть 'POST', так как вы используете' $ _POST' – ElefantPhace

+0

@ElefantPhace, я думал, что вызываю его внутри if (isset ...) и т. Д.? – william

+1

нет, вы только что определили функцию там. либо определите его в другом месте и назовите его оттуда, либо удалите часть функции и оставьте свои методы завитки, где они находятся – ElefantPhace

ответ

0

первый, так как Вы желаете использовать $_POST переменные, то вам необходимо изменить метод формы для POST

<form action="" method="POST"> 

Вы также фактически никогда не звонит функцию , но вы никогда не узнаете этого, потому что, когда вы проверяете if(isset($_POST['whatever'])), он никогда не будет установлен, потому что вы использовали метод GET в качестве метода формы.

Вам необходимо определить свою функцию вне этого кодового блока и вызвать его изнутри.

Вот рабочий пример: я использовал отдельную функцию, чтобы сделать завиток возвратить любые ошибки

<?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']

+0

Спасибо, но все, что мне было нужно, это фактические $ lat и $ long, но вы, кажется, помещаете все в массив, из-за чего его немного сложно извлечь данные! – william

+0

@william. так оно и было, возвращено как массив. это все равно не сложно получить из массива, хотя ... Но я пошел вперед и сделал больше работы для вас. будь счастлив. – ElefantPhace

Смежные вопросы