$wpdb->使用LIKE和Sprint进行准备

时间:2018-12-01 作者:uPrompt

好的,我知道以前也有人问过类似的问题,但我找到的答案似乎都不管用。这是我的代码:

$sql = $wpdb->prepare(\'SELECT ID FROM \' . $ignore_url_table_name . " where url LIKE \'%%%s%%\'", $urlRequested);
$wpdb->get_row($sql);
if ($wpdb->num_rows > 0) {
    return;
}
问题是:我试图检测URL中何时找到特定字符串。Table中要查找的url的一个示例是:

正在执行\\u wp\\u cron

$URLEQUESTED的一个示例是:

doing\\u wp\\u cron=1543678213.5953478813171386718750

上述SQL语句未找到匹配项。

我还尝试使用

$sql = $wpdb->prepare(\'SELECT ID FROM \' . $ignore_url_table_name . " where url LIKE \'%s\'", \'%\' . $wpdb->esc_like($urlRequested) . \'%\');
这似乎将do\\u wp\\u cron转换为查询也找不到的do//\\u wp//\\u cron。

我做错了什么?

谢谢

*编辑:所以我回显了sql查询,这看起来很奇怪。

SELECT ID FROM URL_Ignores where url LIKE \'{1b71fb783b53a0ae087bf6ac6b01addd9b80435193728fe4c7c7d70b30748268}/doing_wp_cron=1543682280.1607289314270019531250{1b71fb783b53a0ae087bf6ac6b01addd9b80435193728fe4c7c7d70b30748268}\'
我不知道为什么,但似乎每一种方式我都试图$wpdb->准备这个,它正在将%转换为随机变量!???

2 个回复
SO网友:Tom J Nowell

这里发生了几件事

滥用$wpdb->prepare

这是一种非常奇怪的使用方式prepare:

$sql = $wpdb->prepare(\'SELECT ID FROM \' . $ignore_url_table_name . " where url LIKE \'%%%s%%\'", $urlRequested);
特别是%s 你有\'%%%s%%\', 这很不寻常。prepare 期望%s, 并将为您插入引号,因为它已经知道它是一个字符串。此外,尽管它与sprintf, 事实并非如此sprintf 功能也不完全相同。正在应用类型转换、消毒和逃逸等。这是一个安全函数,不是简单的字符串操作函数。

例如,这:

$sql = $wpdb->prepare(\'%s %s\', \'hello\', \'world\' );
结果如下:

"hello" "world"
WP Cron在数据库表中永远找不到作为示例提供的URL。这是因为doing_cron 之后始终具有不同的值,因此它不会出现在表中。如果你把它放在桌子上,它也不会起作用,因为它不会再出现第二次。

相反,解决方案是认识到这种方法在某些情况下是完全不正确的,这本是一个更好的解决方案:

if ( wp_doing_cron() ) {
    return;
}
类似地wp_doing_ajax 应该进行检查,您可能希望捕获RESTAPI和RSS提要,但由于您从未提供问题的上下文以及URL检测的目的,因此我无法进一步发表评论

SO网友:uPrompt

好吧,因为我已经有一段时间没有在插件中使用LIKE了,所以我似乎错过了这个插件。

无论何时准备或esc查询,WP都会添加“占位符”。我找到的一个简单的解决办法就是这样做。这可能不是正确的方法,但确实有效。

$sql = $wpdb->remove_placeholder_escape($wpdb->prepare("SELECT ID FROM $ignore_url_table_name where \'%s\' LIKE CONCAT(\'%\',url,\'%\')",$urlRequested));

相关推荐

如何像使用wpdb一样使用MySQL?

根据标题,我需要使用LIKE操作符以编程方式使用$wpdb删除db上的一行。我想使用$wpdb->delete 消除发生的情况,但我不知道如何设置LIKE 操作员,因为在WHERE 它需要一个指定单个值或另一个数组的数组。我问你这个语法是否正确。$wpdb->delete(\'wp_posts\', array(\'post_type\' => \'flamingo_inbound\', \'post_content\' => \'%\'.$mail.\'%\'));提前感谢