将谷歌地图商店定位器转换为laravel不起作用



我正在谷歌地图商店定位器上工作,以搜索我在特定位置的商店。我通过引用谷歌地图商店定位器链接,使整个功能与核心PHP正确工作。但实际上,我希望功能在laravel中发挥作用。

我把它转换成了laravel,并且出现了错误。

以下是我的代码,我在这里只显示重要的代码,有可能出错

var searchUrl = '{{ route('gmap') }}?lat=' + center.lat() + '&lng=' + center.lng() + '&radius=' + radius;

在官方文档中,他们提供了直接链接abc.php,而不是我创建了一个路由并提供了

以下是控制器中的代码,我直接将粘贴的核心PHP代码复制到该控制器中,得到一个错误

public function gmap()
{
// Get parameters from URL
$center_lat = $_GET["lat"];
$center_lng = $_GET["lng"];
$radius = $_GET["radius"];
// Start XML file, create parent node
$dom = new DOMDocument("1.0");
$node = $dom->createElement("markers");
$parnode = $dom->appendChild($node);
// Search the rows in the markers table
$query = sprintf("SELECT id,locationName, locationAddress1, locationLat, locationLong, ( 3959 * acos( cos( radians('%s') ) * cos( radians( locationLat ) ) * cos( radians( locationLong ) - radians('%s') ) + sin( radians('%s') ) * sin( radians( locationLat ) ) ) ) AS distance FROM locations HAVING distance < '%s' ORDER BY distance LIMIT 0 , 20",
mysqli_real_escape_string($con,$center_lat),
mysqli_real_escape_string($con,$center_lng),
mysqli_real_escape_string($con,$center_lat),
mysqli_real_escape_string($con,$radius));
$result =$con->query($query);
//$result = $con->query($query);
if (!$result) {
die("Invalid query: " . mysqli_error());
}
//header("Content-type: text/xml");
// Iterate through the rows, adding XML nodes for each
while ($row = @mysqli_fetch_assoc($result)){
$node = $dom->createElement("marker");
$newnode = $parnode->appendChild($node);
$newnode->setAttribute("id", $row['id']);
$newnode->setAttribute("name", $row['locationName']);
$newnode->setAttribute("address", $row['locationAddress1']);
$newnode->setAttribute("lat", $row['locationLat']);
$newnode->setAttribute("lng", $row['locationLong']);
$newnode->setAttribute("distance", $row['distance']);
}
echo $dom->saveXML();
}

这里$con是未定义的文档错误,我如何将其转换为laravel。请帮帮我,我在过去的三个星期里一直忙于这项工作。请帮助

首先,您应该通过依赖注入添加请求,这是由Laravel:自动注入的

public function gmap(IlluminateHttpRequest $request)
{

接下来,您不想直接使用$_GET,因为这可能会导致SQL注入,这将是一个安全问题。相反,从$request:获取参数

$center_lat = $request->input("lat");
$center_lng = $request->input("lng");
$radius = $request->input("radius");

生成XML响应的方式肯定会得到批准,但就目前而言,这应该是可以的。所以,让我们保持原样。

$dom = new DOMDocument("1.0");
$node = $dom->createElement("markers");
$parnode = $dom->appendChild($node);

您希望使用Laravel的内置数据库功能,而不是直接从数据库请求数据。我甚至建议使用模型来充分利用Eloquent的功能,而不是使用DB facade。但这需要对代码中的其他位置进行额外的改进,所以现在,我将通过使用DB facade(IlluminateSupportFacadesDB(来展示方法。

请确保为数据库连接正确设置.env文件!

$locations = DB::table('locations')
->selectRaw("id, locationName, locationAddress1, locationLat, locationLong"
. ", ( 3959 * acos( cos( radians('?') ) * cos( radians( locationLat ) ) * cos( radians( locationLong ) - radians('?') ) + sin( radians('?') ) * sin( radians( locationLat ) ) ) ) AS distance", 
[$center_lat, $center_lng, $center_lat]
)
->havingRaw("distance < '?'", $radius)
->orderByRaw("distance")
->limit(20)
->get();

这将给你一个IlluminateSupportCollection,就像类固醇上的stdClass

由于Laravel自己处理错误,您可以消除Invalid查询错误:

//if (!$result) {
//  die("Invalid query: " . mysqli_error());
//}

现在要设置属性,您可以迭代结果,例如通过foreach:

foreach ($locations as $location) {
$node = $dom->createElement("marker");
$newnode = $parnode->appendChild($node);
$newnode->setAttribute("id", $location->id);
$newnode->setAttribute("name", $location->locationName);
$newnode->setAttribute("address", $location->locationAddress1);
$newnode->setAttribute("lat", $location->locationLat);
$newnode->setAttribute("lng", $location->locationLong);
$newnode->setAttribute("distance", $location->distance);
}

最后,您不想回显输出,而是将输出作为响应返回,然后让Laravel完成其余操作

return response($dom->saveXML(), 200)
->header('Content-Type', 'text/xml');
}

所以,总的来说,你的控制器功能看起来是这样的:

public function gmap(IlluminateHttpRequest $request)
{
$center_lat = $request->input("lat");
$center_lng = $request->input("lng");
$radius = $request->input("radius");
$dom = new DOMDocument("1.0");
$node = $dom->createElement("markers");
$parnode = $dom->appendChild($node);
$locations = DB::table('locations')
->selectRaw("id, locationName, locationAddress1, locationLat, locationLong"
. ", ( 3959 * acos( cos( radians('?') ) * cos( radians( locationLat ) ) * cos( radians( locationLong ) - radians('?') ) + sin( radians('?') ) * sin( radians( locationLat ) ) ) ) AS distance", 
[$center_lat, $center_lng, $center_lat]
)
->havingRaw("distance < '?'", $radius)
->orderByRaw("distance")
->limit(20)
->get();
foreach ($locations as $location) {
$node = $dom->createElement("marker");
$newnode = $parnode->appendChild($node);
$newnode->setAttribute("id", $location->id);
$newnode->setAttribute("name", $location->locationName);
$newnode->setAttribute("address", $location->locationAddress1);
$newnode->setAttribute("lat", $location->locationLat);
$newnode->setAttribute("lng", $location->locationLong);
$newnode->setAttribute("distance", $location->distance);
}
return response($dom->saveXML(), 200)
->header('Content-Type', 'text/xml');
}

最新更新