Пагинация PHP, ограничение на страницу, функция в mysql

У меня большая база данных 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 пусты, я получаю 100 элементов на 10 страницах. Если установлены $ city и $ radius, я получаю 10 элементов, но один - это одна вторая страница, два - на четвертой странице. Некоторые строки пусты. Без:

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

в mysql_query все в порядке, но я получаю все результаты на первой странице, без какой-либо работы с разбивкой на страницы.

Обновлено: Я ищу какой-то волшебный трюк, который позволит мне запустить функцию php distance () в запросе mysql ... или обойти строки, которые не соответствуют требованиям, в функции find_all_in_radius (), не разрушая мою разбивку на страницы: D

Вы получаете все результаты, отсортированные по страницам, а затем фильтруете их по городу и радиусу. Таким образом, любые оставшиеся результаты остаются на исходной странице. Вам нужно сначала отфильтровать, а затем расположить их по страницам.

clinomaniac 14.11.2018 00:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
146
1

Ответы 1

Нет никакого волшебного трюка. Или вы

  1. фильтровать и разбивать на страницы в MySQL, или
  2. получить все данные, отфильтровать и разбить на страницы в PHP.

В первом подходе вы должны реализовать свою функцию distance в MySQL. Это может быть проще, чем вы думаете. Если вы используете стандартное расстояние по дуге, вы можете скопировать код из MySQL Great Circle Distance (формула Хаверсина)

Если вы выберете второй подход, вам нужно будет получить все строки, чтобы сохранить количество совпадающих строк.

В любом случае вы столкнетесь с проблемами производительности, если у вас действительно большая база данных (миллионы строк).

Я решил это вчера с помощью array_slice (), в любом случае спасибо

blabla 14.11.2018 19:25

Другие вопросы по теме