php - 带有引号/撇号变体的 wordpress 查询

标签 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) 并且可能相关,有没有一种方法可以有效地搜索字符串,无需多次查询即可查找撇号和引号字符出现的所有变体?

最佳答案

问题的症结其实又回到了JS的原始编码上。让我们感到困惑的关键字符之一:',实际上并没有被 html_entity_decode 解码,即使设置了 ENT_QUOTES 标志。相反,它需要 '

所以最后我们的 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 转义类时,Wordpress 会为我们处理转义 $wpdb->prepare

关于php - 带有引号/撇号变体的 wordpress 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35828572/

相关文章:

sql - SQL:删除GroupBy中的所有NOT MAX记录

php - 使用 php 将远程 img 文件保存到服务器

mysql - 在 laravel 6.0 中使用 BelongsToMany 方法时,sql 查询是什么样子的?

javascript - 如何让一些内容只对管理员/管理员用户可见

PHP/MySQL 需要将两个表中的数据合并到一个对象并按日期排序

mysql - SQL 数据库 (Django) - 将表 B 中的所有记录与表 A 中的每条记录相关联

php - 如何对数据库表资源加锁

sql - Postgres 在转换时在函数错误/失败时返回空值

php - 将两个变量传递到 'foreach' 循环中

php - jquery $.get 函数的问题