我的PHP商店定位器不工作


My PHP Store Locator Is Not Working

我构建了一个简单的商店定位器,并设置了一个自定义搜索引擎,通过名称、邮政编码等来查找商店,并且它可以工作。

现在,我正试图通过地址找到商店,并使用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字符串中,而应该将其绑定到准备好的语句中。