wordpress查询与引用/撇号varrients

时间:2016-03-06 15:13:59

标签: php mysql sql wordpress html-entities

这是一个双重问题。我有一个ajax请求,轮询重复的帖子标题,但它被不同的引用/撇号和它们的变体抛出,当我知道有重复时返回负数。

我的帖子标题为:“Ben's Big Fish”,即撇号(’)

但是对以下内容进行查询总是会出现负面影响:

Ben's Big Fish (')
Ben’s Big Fish (’)
Bens Big Fish (no apos)

Big Fish的查询会返回包含这些字词的所有变体帖子标题,包括带引号和撇号的帖子标题。

以下是导致问题的主要字符:

Apostrophe          '   '
Open single quote   ‘   ‘ 
Close single quote  ’   ’
--- 
Quotation mark      "   "
Open double quotes  “   “ 
Close double quotes ”   ”

由于用户经常从MS Word文档等中提取文本,因此这些字符会出现很多。

在js端,我通过传递这个函数来编码帖子标题,然后通过json将它发送到我的ajax处理程序:

function htmlEntities(str) {
    return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&apos;').replace(/‘/g, '&lsquo;').replace(/’/g, '&rsquo;').replace(/“/g, '&ldquo;').replace(/”/g, '&rdquo;');
} 

在我的php ajax hook中,我正在处理传入的POST查询,如下所示:

global $wpdb;
// Grab details from inbound POST array & prepare for sql
$title = html_entity_decode($_POST['post_title']); //first un-encode
$post_id = $_POST['post_id'];

$sim_query = "SELECT ID FROM $wpdb->posts WHERE post_status = 'publish' AND post_title LIKE '%%%s%%' AND ID != '%d'";
$sim_results = $wpdb->get_results( $wpdb->prepare( $sim_query, $wpdb->esc_like($title), $post_id ) );
if ($sim_results)
{ // Send the results back as json }

所以我的问题是 a)如何让查询按预期返回明显的重复项 b)并且可能相关,有一种方法可以有效地搜索字符串,查找所有变体的撇号和引号字符的外观而不需要多个查询吗?

1 个答案:

答案 0 :(得分:0)

问题的症结实际上是从JS的原始编码回落。绊倒我们的关键人物之一&apos;实际上并未被html_entity_decode解码,即使设置了ENT_QUOTES标志也是如此。相反,它需要&#039;

所以最后我们的js看起来像:

function htmlEntities(str) {
    return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#039;').replace(/‘/g, '&lsquo;').replace(/’/g, '&rsquo;').replace(/“/g, '&ldquo;').replace(/”/g, '&rdquo;');
} 

我们用PHP解码:

 $title = html_entity_decode($_POST['post_title'], ENT_QUOTES,  'UTF-8' ); //first un-encode

重要的是要注意SQL,它会依赖于单引号和撇号。它要求escaped by doubling them like so''。当我们使用SQL转义类$wpdb->prepare

时,Wordpress会为我们提供转义