mysql JSON_EXTRACT - 不返回任何结果

时间:2018-04-07 19:20:53

标签: php mysql json mysqli extract

我创建了一个简单的搜索表单。首先,我爆炸单词并进行一些查询(一次搜索多个单词)。另外,我想只搜索电影标题。电影标题可以在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";

此代码不会产生任何项目

UPDATE 我更新了我的代码。

$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);

$ sql var的var_dump:

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

嗯?

1 个答案:

答案 0 :(得分:2)

您的where子句不存在

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函数调用。

试试这个:

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

最后请注意,我假设$item不是用户提供的字符串,否则会打开SQL注入。如果它由用户提供,您将需要使用预准备语句并绑定此值。