php – wordpress查询与引用/撇号varrients
作者:互联网
这是一个双重问题.我有一个ajax请求,轮询重复的帖子标题,但它被不同的引用/撇号和它们的变体抛出,当我知道有重复时返回负数.
我的帖子标题为:“Ben’s Big Fish”,即撇号(& rsquo;)
但是对以下内容进行查询总是会出现负面影响:
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, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''').replace(/‘/g, '‘').replace(/’/g, '’').replace(/“/g, '“').replace(/”/g, '”');
}
在我的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, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''').replace(/‘/g, '‘').replace(/’/g, '’').replace(/“/g, '“').replace(/”/g, '”');
}
我们用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会为我们提供转义
标签:wordpress,php,mysql,sql,html-entities 来源: https://codeday.me/bug/20190711/1431678.html