我构建了一个简单的商店定位器,并设置了一个自定义搜索引擎,通过名称、邮政编码等来查找商店,并且它可以工作。
现在,我正试图通过地址找到商店,并使用haversine公式返回最近的位置和距离。下面是我的代码。我哪里做错了?
当我将$distance
变量传递给mysqli_query()
时,它告诉我它期望得到一个整数。我可能大错特错了。
<div class="container">
<h1>Store Locator</h1>
<div class="row">
<div class="col-xs-6">
<form action="" method="post">
<label for="search">Enter Store Name</label></br>
<input type="text" name="search" value="">
<input name="submit" type="submit" name="address" class="btn btn-primary">
</form>
<?php
if (isset($_POST['submit'])) {
$search = $_POST['search'];
$query = "SELECT * FROM markers WHERE zip_code LIKE '%$search%' ";
$distance = "
SELECT id,
(3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat))))
AS distance
FROM markers
HAVING distance < 25
ORDER BY distance
LIMIT 0 , 20
";
$search_query = mysqli_query($connection, $query, $distance);
if (!$search_query) {
die("QUERY FAILED" . mysqli_error($connection));
} else {
while($row = mysqli_fetch_assoc($search_query)){
$name = $row['name'];
$address = $row['address'];
$city = $row['city'];
$state = $row['state'];
$zip_code = $row['zip_code'];
echo "<h4>$name</h4>";
echo "<p>$address</p>";
echo "<p>$city, $state, $zip_code</p></br>";
}
}
}
?>
</div>
</div>
你不能在mysqli_query()
中运行多个查询,因为你正在做。
同样,函数的第三个参数不能是字符串,如上所述。必须是整数
文档
mysqli_query ( mysqli $link , string $query [, int $resultmode = MYSQLI_STORE_RESULT ] )
resultmode
常量MYSQLI_USE_RESULT或MYSQLI_STORE_RESULT取决于期望的行为。默认情况下,使用MYSQLI_STORE_RESULT
如果使用MYSQLI_USE_RESULT,所有后续调用将返回错误命令不同步,除非你调用mysqli_free_result()
使用MYSQLI_ASYNC(与mysqld一起可用),可以执行异步查询。然后使用Mysqli_poll()从这种查询。
您可以运行两个mysqli_query
并单独处理它们
正如其他人正确指出的那样,您不能像那样将两个单独的查询传递给mysqli_query
。但是看起来不应该执行两个查询。你可以把它们合并成一个。
$query = "SELECT id, (big ugly formula) AS distance
FROM markers
WHERE zip_code LIKE '%$search%'
HAVING distance < 25 ORDER BY distance LIMIT 0 , 20";
$search_query = mysqli_query($connection, $query);
关于这个的几点:
这将排除在指定距离内的位置,如果它们不在同一邮政编码中。(我猜这是你想要的,但我不知道为什么。)
这个查询容易受到SQL注入的攻击。您不应该将$search
连接到SQL字符串中,而应该将其绑定到准备好的语句中。