mysql JSON_EXTRACT - 没有 return 任何结果
mysql JSON_EXTRACT - don't return any results
我创建了一个简单的搜索表单。首先,我分解单词并进行一些查询(一次搜索多个单词)。另外,我只想搜索电影片名。电影片名可以在 movie_data 中找到。
我名为 movies 的数据库有以下行:
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"}
这是我的代码。此代码没有 return 任何结果。
$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%'
嗯?
titlemov
不存在供您使用的 where 子句。您要在 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 注入。如果它是由用户提供的,您将需要使用准备好的语句并绑定此值。
我创建了一个简单的搜索表单。首先,我分解单词并进行一些查询(一次搜索多个单词)。另外,我只想搜索电影片名。电影片名可以在 movie_data 中找到。
我名为 movies 的数据库有以下行: 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"}
这是我的代码。此代码没有 return 任何结果。
$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%'
嗯?
titlemov
不存在供您使用的 where 子句。您要在 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 注入。如果它是由用户提供的,您将需要使用准备好的语句并绑定此值。