wpdb get_results 当关键字包含 & 符号时为空(而同样的请求在 phpMyAdmin SQL 中工作正常)
wpdb get_results is empty when keyword contains ampersand (while the very same request works fine in phpMyAdmin SQL)
我对 wpdb->get_results 有一个非常具体的问题
我已经实现了自定义搜索请求,它能够搜索我们所有的自定义类型和自定义结构表。
查询工作正常(因此没有数据库连接问题),直到搜索关键字包含与号 (&)。
真正的谜团是,如果我回显请求本身,然后通过 phpMyAdmin SQL 运行 它,查询 returns 预期的(和期望的)结果。
我尝试使用 mysqli 但无济于事。
以下是搜索系统中使用的代码的关键部分:
$request = "SELECT DISTINCT
SQL_CALC_FOUND_ROWS
p.ID,
(SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'latitude') AS latitude,
(SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'longitude') AS longitude
FROM wp_posts p
WHERE p.post_type = 'studia'
AND (SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'latitude') > 0
AND (SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'longitude') > 0
AND ((SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'mesto' LIMIT 1) LIKE '%" . $keyword . "%'
OR p.post_title LIKE '%" . $keyword . "%'
OR (SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'ulice' LIMIT 1) LIKE '%" . $keyword . "%'
OR (SELECT IF(pm.meta_value LIKE 'a:%',(SELECT post_title FROM wp_posts WHERE ID = SUBSTRING_INDEX(SUBSTRING_INDEX(pm.meta_value,'\"',2),'\"',-1)), pm.meta_value ) FROM wp_postmeta pm WHERE pm.post_id = p.ID AND meta_key = 'studio' ) LIKE '%" . $keyword . "%')";
echo $request;
$studios = $wpdb->get_results( $request);
这里是回显示例(关键字:YOGA & ART)再次请求 returns 在 phpMyAdmin 中获得所需的结果,但在网站
SELECT DISTINCT SQL_CALC_FOUND_ROWS p.ID, (SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'latitude') AS latitude, (SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'longitude') AS longitude FROM wp_posts p WHERE p.post_type = 'studia' AND (SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'latitude') > 0 AND (SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'longitude') > 0 AND ((SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'mesto' LIMIT 1) LIKE '%YOGA & ART%' OR p.post_title LIKE '%YOGA & ART%' OR (SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'ulice' LIMIT 1) LIKE '%YOGA & ART%' OR (SELECT IF(pm.meta_value LIKE 'a:%',(SELECT post_title FROM wp_posts WHERE ID = SUBSTRING_INDEX(SUBSTRING_INDEX(pm.meta_value,'"',2),'"',-1)), pm.meta_value ) FROM wp_postmeta pm WHERE pm.post_id = p.ID AND meta_key = 'studio' ) LIKE '%YOGA & ART%')
我找到了答案。简单来说,因为我回显了请求,所以显示格式和实际发送的不一样,原来HTML实体&
实际上是发送而不是符号&。如此简单的替换解决了我的问题。
$keyword = str_replace("&", "&", $keyword);
我对 wpdb->get_results 有一个非常具体的问题 我已经实现了自定义搜索请求,它能够搜索我们所有的自定义类型和自定义结构表。 查询工作正常(因此没有数据库连接问题),直到搜索关键字包含与号 (&)。 真正的谜团是,如果我回显请求本身,然后通过 phpMyAdmin SQL 运行 它,查询 returns 预期的(和期望的)结果。 我尝试使用 mysqli 但无济于事。
以下是搜索系统中使用的代码的关键部分:
$request = "SELECT DISTINCT
SQL_CALC_FOUND_ROWS
p.ID,
(SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'latitude') AS latitude,
(SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'longitude') AS longitude
FROM wp_posts p
WHERE p.post_type = 'studia'
AND (SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'latitude') > 0
AND (SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'longitude') > 0
AND ((SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'mesto' LIMIT 1) LIKE '%" . $keyword . "%'
OR p.post_title LIKE '%" . $keyword . "%'
OR (SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'ulice' LIMIT 1) LIKE '%" . $keyword . "%'
OR (SELECT IF(pm.meta_value LIKE 'a:%',(SELECT post_title FROM wp_posts WHERE ID = SUBSTRING_INDEX(SUBSTRING_INDEX(pm.meta_value,'\"',2),'\"',-1)), pm.meta_value ) FROM wp_postmeta pm WHERE pm.post_id = p.ID AND meta_key = 'studio' ) LIKE '%" . $keyword . "%')";
echo $request;
$studios = $wpdb->get_results( $request);
这里是回显示例(关键字:YOGA & ART)再次请求 returns 在 phpMyAdmin 中获得所需的结果,但在网站
SELECT DISTINCT SQL_CALC_FOUND_ROWS p.ID, (SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'latitude') AS latitude, (SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'longitude') AS longitude FROM wp_posts p WHERE p.post_type = 'studia' AND (SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'latitude') > 0 AND (SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'longitude') > 0 AND ((SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'mesto' LIMIT 1) LIKE '%YOGA & ART%' OR p.post_title LIKE '%YOGA & ART%' OR (SELECT meta_value FROM wp_postmeta WHERE post_id = p.ID AND meta_key = 'ulice' LIMIT 1) LIKE '%YOGA & ART%' OR (SELECT IF(pm.meta_value LIKE 'a:%',(SELECT post_title FROM wp_posts WHERE ID = SUBSTRING_INDEX(SUBSTRING_INDEX(pm.meta_value,'"',2),'"',-1)), pm.meta_value ) FROM wp_postmeta pm WHERE pm.post_id = p.ID AND meta_key = 'studio' ) LIKE '%YOGA & ART%')
我找到了答案。简单来说,因为我回显了请求,所以显示格式和实际发送的不一样,原来HTML实体&
实际上是发送而不是符号&。如此简单的替换解决了我的问题。
$keyword = str_replace("&", "&", $keyword);