PHPを使用して英国の郵便番号をlongsとlatsに変換しようとしています。
そのため、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;
}
EC1R4RRはarray(2) { ["lat"]=> string(9) "51.526254" ["long"]=> string(9) "-0.109119" }
少なくとも配列内のどれがどれであるかを確認できるように編集しました。そしてそれらを使用するには$data['lat']
、$data['long']
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加