mysql JSON_EXTRACT - не возвращает никаких результатов

0

Я создаю простую форму поиска. Во-первых, я взорву слова и делаю запрос (для поиска нескольких слов сразу). Кроме того, я хочу искать только в названиях фильмов. Названия фильмов можно найти в movie_data.

Моя база данных, называемая фильмами, имеет строки: id и movie_data - содержит данные о фильме в JSON. Пример хранения данных в json:

{"movie_title":"Forrest Gump","movie_cover":"http://1.fwcdn.pl/po/09/98/998/7314731.6.jpg","movie_name_en":"","movie_desc":"Historia życia Forresta, chłopca o niskim ilorazie inteligencji z niedowładem kończyn, który staje się miliarderem i bohaterem wojny w Wietnamie.","movie_year":"1994","movie_genres":"DramatKomedia"}

Вот мой код. Этот код не возвращает никаких результатов.

$query = 'Forrest Gump';
$words = explode(' ', $query);

$i = 0;
$len = count($words);
$query_build = '';
foreach ($words as $item) {
    if ($i == $len - 1) {
       $query_build .= ' titlemov LIKE "%$item%"';
    } else {
       $query_build .= ' titlemov LIKE "%$item%" OR ';
    }
    // …
    $i++;
}


$sql = "SELECT movie_data, JSON_EXTRACT(movie_data, '$.movie_title') AS titlemov 
FROM movies WHERE $query_build";

Этот код не вызывает никаких элементов

ОБНОВЛЕНИЕ Я обновил свой код.

$query = 'Forrest Gump';
$words = explode(' ', $query);

$i = 0;
$len = count($words);
$query_build = '';
foreach ($words as $item) {
    if ($i == $len - 1) {
       $query_build .= " JSON_EXTRACT(movie_data, \'$.movie_title\') LIKE '%$item%'";
    } else {
       $query_build .= " JSON_EXTRACT(movie_data, \'$.movie_title\') LIKE '%$item%' OR ";
    }
    // …
    $i++;
}


$sql = "SELECT * FROM movies WHERE $query_build";

Теперь я получаю ошибку:

Warning: mysqli::query(): (22032/3141): Invalid JSON text in argument 1 to function json_extract: "Missing a comma or '}' after an object member." at position 228. in /search.php on line 43

Строка 43:

$result = $conn->query($sql);

var_dump из $ sql var:

SELECT * FROM movies WHERE JSON_EXTRACT(movie_data, '$.movie_title') LIKE '%Forrest%' OR JSON_EXTRACT(movie_data, '$.movie_title') LIKE '%Gump%'

Хм?

  • 1
    Ваша переменная $ item находится в одинарных кавычках, PHP не оценивает переменные в одинарных кавычках.
  • 0
    Классная история, братан. Был ли вопрос? Каково содержимое $sql перед отправкой в базу данных? И что там с $.movie_title , чего мы ожидаем от оценки? Кроме того, строковые литералы PHP, заключенные в одинарные кавычки, не оцениваются .... добавление к $query_build означает, что строка содержит литерал $item
Показать ещё 4 комментария
Теги:
mysqli
extract

1 ответ

2
Лучший ответ

titlemov не существует для вашего используемого предложения. То, что вы хотите использовать внутри вашего предложения where (указано в $query_build), является функцией JSON_SEARCH. Вот как это выглядит в общем с подстановочными знаками для названия фильма:

SELECT movie_data, movie_data->'$.movie_title' AS titlemov FROM movies 
 WHERE  JSON_SEARCH(movie_data->'$.movie_title', 'one', "%orrest Gum%") IS NOT NULL;

Вам просто нужно изменить строку $query_build. Я также JSON_EXTRACT ненужные JSON_EXTRACT функций JSON_EXTRACT.

Попробуй это:

$query_build = " JSON_SEARCH(movie_data->'$.movie_title', 'one', '%$item%') IS NOT NULL";

Заключительное примечание: я предполагаю, что $item не является строкой, предоставленной пользователем, иначе это откроет вам SQL-инъекцию. Если он предоставлен пользователем, вы хотите использовать подготовленный оператор и привязать это значение.

  • 0
    PHP на самом деле не оценивает $. По крайней мере, не в новых версиях. Это может быть, почему MySQL выбирает этот специфический синтаксис.
  • 0
    Спасибо за ответ. Я обновил свой код. Но все равно я не получаю никаких результатов.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню