PHP分页,每页限制,mysql中的功能

时间:2018-11-13 23:31:50

标签: php mysql arrays

我的MySQL数据库很大,我想拒绝所有不在期望半径范围内的行。

$results_per_page = 10;
$city = "London";
$radius = 20;

mysql查询:

if($city != "") {
    $sql="SELECT * FROM city_items ORDER BY id ASC LIMIT " . $page_first_result . "," .  $results_per_page;
    find_all_in_radius($con, $sql, $city, $radius);
}

如果未设置$ city和$ radius,则一切正常

else {
    $sql="SELECT * FROM city_items ORDER BY id ASC LIMIT " . $page_first_result . "," .  $results_per_page;
    find_all($con, $sql);
}

我尝试了类似的方法:

function find_all_in_radius($con, $sql, $city, $radius) {
    $result1 = mysqli_query($con, $sql);  
    #geo_code find coordinates of provided city
    $long_lat = geo_code($city);
    echo '<div id="container">';
    $good_rows = array();

    while($row = mysqli_fetch_array($result1)) 
    { 
       $latitude = doubleval($long_lat[0]);
       $longitude = doubleval($long_lat[1]);
       $latit = doubleval($row[106]);
       $longtit = doubleval($row[107]);
       #distance() is function counting range between two coordinates
       if(!empty($latit) and !empty($longtit) and distance($latit, $longtit, $latitude, $longitude, "M") < $radius) 
        {
        array_push($good_rows, $row);
        }
    }
foreach($good_rows as $row) {
    echo $row[1];
    echo $row[2];
    }
}

问题是,如果$ city和$ radius为空,我将在10页上获得100个项目。 如果设置了$ city和$ radius,我得到10个项目,但一个是第二页,第二个是第四页。有些行是空白的。 没有:

"ASC LIMIT " . $page_first_result . "," .  $results_per_page;"

在mysql_query中,一切都很好,但是我在第一页上获得了所有结果,而没有任何分页功能。

编辑:我正在寻找一些魔术,这将允许我在mysql查询中运行php函数distance()或绕过find_all_in_radius()函数中不符合条件的行,而不会破坏我的分页:D

1 个答案:

答案 0 :(得分:1)

没有魔术。要么

  1. 在MySQL中过滤和分页,或者
  2. 获取所有数据,并在PHP中进行过滤和分页。

在第一种方法中,您必须在MySQL中实现distance函数。那可能比您想的要容易。如果您使用的是标准大圆距,则可以从MySQL Great Circle Distance (Haversine formula)

复制代码

如果采用第二种方法,则必须获取所有行并保留匹配行的计数。

无论哪种情况,如果您确实有一个大数据库(数百万行),都会遇到性能问题。