Как искать в базе данных mysql, используя массив через php / ajax? - PullRequest
0 голосов
/ 04 июля 2019

Я нашел довольно много похожих вопросов, но ни один из них, похоже, не соответствует тому, что я пытаюсь сделать.

Вопрос:

У меня естьPHP-код, который ищет в базе данных mysql и возвращает данные в зависимости от местоположения пользователя (широта / долгота).и он печатает данные в формате JSON.(это работает нормально и как надо).

Код выглядит следующим образом:

$latitude2 = floatval($_GET['latitude']); //no default
$longitude2 = floatval($_GET['longitude']); //no default

   $sql ="SELECT b.*
   FROM businesses b 
  ORDER
     BY -- great circle distance calculation
        ( 3959 * ACOS( COS( RADIANS('" . $latitude2. "') )
                     * COS( RADIANS( b.lat ) )
                     * COS( RADIANS( b.lon ) 
                            - RADIANS('" . $longitude2 . "') 
                          )
                     + SIN( RADIANS('" . $latitude2 . "') )
                     * SIN( RADIANS( b.lat ) ) 
                 ) 
        ) ASC  LIMIT 4";

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

 [{"title":"Toys"},{"title":"Restaurants"},{"title":"Hotel"},{"title":"Pets"},{"title":"Accounting"}]

Итак, я отправляю этот дополнительный параметр на мою страницу PHP, как и все остальные параметры через AJAX, и получаю массив в моемphp примерно так:

$filters = $_GET['filters'];

Но я не знаю, как добавить этот дополнительный параметр в текущий запрос, чтобы мой php возвращал данные на основе значения в этом массиве.

Iпробовал что-то вроде этого, что не работает:

$latitude2 = floatval($_GET['latitude']); //no default
$longitude2 = floatval($_GET['longitude']); //no default
$filters = $_GET['filters'];


   $sql ="SELECT b.*
   FROM businesses b 
  ORDER
     BY -- great circle distance calculation
        ( 3959 * ACOS( COS( RADIANS('" . $latitude2. "') )
                     * COS( RADIANS( b.lat ) )
                     * COS( RADIANS( b.lon ) 
                            - RADIANS('" . $longitude2 . "') 
                          )
                     + SIN( RADIANS('" . $latitude2 . "') )
                     * SIN( RADIANS( b.lat ) ) 
                 ) 
        ) ASC WHERE categories='$filters' LIMIT 4";

Это WHERE categories='$filters' неправильно.

Может кто-нибудь, пожалуйста, совет по этому вопросу?

РЕДАКТИРОВАТЬ:

Я пробовал все, но безрезультатно.Я даже попробовал это так и так и не получил никаких результатов из базы данных:

   $sql ="SELECT b.*
   FROM businesses b 
  ORDER
     BY -- great circle distance calculation
        ( 3959 * ACOS( COS( RADIANS('" . $latitude2. "') )
                     * COS( RADIANS( b.lat ) )
                     * COS( RADIANS( b.lon ) 
                            - RADIANS('" . $longitude2 . "') 
                          )
                     + SIN( RADIANS('" . $latitude2 . "') )
                     * SIN( RADIANS( b.lat ) ) 
                 ) 
        ) ASC WHERE FIND_IN_SET(b.categories, 'Toys, Restaurants, Hotel') LIMIT 4";

Ответы [ 3 ]

2 голосов
/ 04 июля 2019

Переменная filters содержит строку json. Вам необходимо преобразовать его в массив Php, используя json_decode .

После этого получите значения каждого заголовка. Затем используйте функцию MySQL FIND_IN_SET . Например:

where FIND_IN_SET(categories, 'category1,category2,category3') >0
1 голос
/ 04 июля 2019

Было бы хорошо просто выполнить такой запрос, чтобы посмотреть, что произойдет - возможно, вы получили бы сообщение об ошибке, сообщающее, что предложение WHERE должно произойти до ORDER BY

0 голосов
/ 04 июля 2019

WHERE IN это то, что вам нужно WHERE id IN ('".$array."')");

Давайте попробуем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...