get_results query with accent

时间:2020-10-24 作者:user7734861

我正在尝试执行SQL查询,但我不理解某些内容。我得到了一个值$ _POST, 此值等于“定义”。我提出了以下请求:$sql = "SELECT DISTINCT * FROM". $ wpdb-> prefix. "posts WHERE post_title LIKE \'%". $ _POST [\'value\']. "% \'";.

A.var_dump($sql) 给予"SELECT DISTINCT * FROM datatablename.posts WHERE post_title LIKE \'% definition%\'";.

如果我这样做了$res = $wpdb->get_results($sql);, 我得到一个空数组

但是,如果我在代码中直接$sql = "SELECT DISTINCT * FROM datatablename.posts WHERE post_title LIKE \'% definition%\'"; (I立即更换$_POST 以我的价值),$res 是一个带有post的数组。

问题源于口音,因为如果$_POST[\'value\'] = \'finition\' 没关系的

我的数据表位于utf8mb4_unicode_ci.

如何解决这个问题?

2 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

您的SQL命令高度insecure 而且还存在SQL注入之类的安全问题,因此,即使这可能无法回答问题,我强烈建议您使用$wpdb->prepare()$wpdb->esc_like() — 后者用于逃避% SQL中的字符。

此外,您可以简单地使用$wpdb->posts 要输出WordPress帖子的表名,例如wp_posts.

我注意到在SQL命令中:

表名不正确,因为FROM$wpdb->prefix 连接为一个单词,如FROMwp_posts.

第二个后面有一个空格%LIKE 条款:%". $_POST[\'value\']. "% \' — 所以可能不需要空白?或者这可能是查询没有返回任何结果的原因。

var_dump() 实际上不包含重音-您使用definition 而不是définition. 直接的也一样。

现在,您应该如何生成查询或SQL命令:

$value = $_POST[\'value\'] ?? \'\';

// wrapped for brevity
$sql = $wpdb->prepare( "
SELECT DISTINCT *
FROM {$wpdb->posts}
WHERE post_title LIKE %s
", \'%\' . $wpdb->esc_like( $value ) . \'%\' );

$res = $wpdb->get_results( $sql );
我用一篇文章测试了上面的代码,文章的标题包含了这个词définition, 查询返回一个结果(这是一个测试帖子)。

如果我的代码不适合你,你可以试试sanitize_text_field(), 但除其他外,这将剥离HTML标记。

SO网友:Q Studio

这里有一个查询标题为“的帖子”的功能;“如”返回ID或指定列-转义传递的标题和任何请求的列值:

/**
* Get post with title %like% search term
*
* @param       $title          Post title to search for
* @param       $method         wpdb method to use to retrieve results
* @param       $columns        Array of column rows to retrieve
*
* @since       0.3
* @return      Mixed           Array || False
*/
function posts_with_title_like( $title = null, $method = \'get_col\', $columns = array ( \'ID\' ) ){

    // sanity check ##
    if ( ! $title ) { return false; }

    // global $wpdb ##
    global $wpdb;

    // First escape the $columns, since we don\'t use it with $wpdb->prepare() ##
    $columns = \\esc_sql( $columns );

    // now implode the values, if it\'s an array ##
    if( is_array( $columns ) ){
        $columns = implode( \', \', $columns ); // e.g. "ID, post_title" ##
    }

    // run query ##
    $results = $wpdb->$method (
            $wpdb->prepare (
            "
                SELECT $columns
                FROM $wpdb->posts
                WHERE {$wpdb->posts}.post_title LIKE %s
            "
            ,   \\esc_sql( \'%\'.$wpdb->esc_like( trim( $title )  ).\'%\' )
            )
        );

    #var_dump( $results );

    // return results or false ##
    return $results ? $results : false ;

}

相关推荐

控制台中来自wpdb查询的奇怪字符串

我使用此代码: $search = $this->wpdb->prepare(\"WHERE (name LIKE %s OR tag LIKE %s)\", \'%\'. $this->wpdb->esc_like($word) .\'%\', \'%\'. $this->wpdb->esc_like($word) .\'%\'); 在控制台中,我得到:name LIKE \'{4b9ad9b602bd32ff99324feebaa1883bb3a3e