这包括在the documentation:
查询字符串中的文字百分号(%)必须写为%%。百分比通配符(例如,在LIKE语法中使用)必须通过包含完整LIKEstring的替换参数传递,不能直接插入查询字符串中。
以及一个示例:
$wpdb->prepare( "SELECT * FROM table WHERE column = %s AND field = %d OR other_field LIKE %s", array( ‘foo’, 1337, ‘%bar’ ) );
所以你应该有这样的东西:
$wpdb->prepare(
"SELECT DISTINCT
user_id,
proximity,
(
3959 * acos (
cos( radians( 78.3232 ) )
* cos( radians( %f ) )
* cos( radians( %f ) - radians( 65.3234 ) )
+ sin( radians( 78.3232 ) )
* sin( radians( %f ) )
)
) AS distance
FROM
{$wpdb->prefix}a_filters
WHERE
notify = 1 AND
lat != \'false\' AND
lng != \'false\' AND
listing_type = %s AND
(
category LIKE %s OR
category IS NULL OR
category = \'\'
)
HAVING
distance < proximity
ORDER BY
distance ASC",
$lat,
$lng,
$lng,
$listing_type,
\'%special-purpose%\'
);
注:
category LIKE \'%special-purpose%\'
已替换为category LIKE %s
, 带通配符的字符串作为参数传递listing_type=\'".$listing_type."\'
已替换为占位符的正确用法我硬编码了地球的半径,以英里为单位。这不会很快改变我整理了你的距离公式。您遗漏了对其功能非常重要的数字,并且在值应为浮点数时使用了字符串占位符