带空格和不带空格的META_QUERY结果不同

时间:2012-11-21 作者:HaneD

我有一个meta\\u查询,它获取价格范围在2个变量之间的所有项目。我的问题是1万和1万不一样。我怎样才能解决这个问题?

我一直在谷歌上搜索,但我不知道该搜索什么,所以我真的没有什么进展。

我们将不胜感激

ThanksHanè

编辑-添加代码

    $kw_min = mysql_real_escape_string($_GET[\'kw_min\']);
    $kw_max = mysql_real_escape_string($_GET[\'kw_max\']);
    $pr_min = mysql_real_escape_string($_GET[\'pr_min\']);
    $pr_max = mysql_real_escape_string($_GET[\'pr_max\']);
    if ( !empty( $kw_min ) && !empty( $kw_max ) && !empty( $pr_min ) && !empty( $pr_max ) ) {
        $args = array(
            \'post_type\' => \'exc_agriq_equipment\', 
            \'exc_equipment_cat\' => $term->slug,
            \'order\' => \'DESC\',
            \'posts_per_page\' => 12, 
            \'paged\'=>$paged,
            \'meta_query\' => array(
                array(
                    \'key\' => \'exc_agriq_equipment_kw\',
                    \'value\' => array( $kw_min, $kw_max ),
                    \'type\' => \'numeric\',
                    \'compare\' => \'BETWEEN\'
                ),
                array(
                    \'key\' => \'exc_agriq_equipment_price\',
                    \'value\' => array( $pr_min, $pr_max ),
                    \'type\' => \'numeric\',
                    \'compare\' => \'BETWEEN\'
                ),
              ),
         );
    }

3 个回复
最合适的回答,由SO网友:Chip Bennett 整理而成

问题是你在比较1000010 000strings, 因此,它们的值不同。

因此,您要么需要清理字符串以确保两者都返回相等的值,要么需要强制它们为整数,以便将它们作为相同的值进行计算。

编辑您的最佳解决方案可能是将文本表单字段替换为select, 其中包括预先确定的输入值(例如10000、20000、30000等)。这样,您就可以在meta_query.

SO网友:s_ha_dum

“10000”和“10000”不一样。严格来说,“10000”甚至不是数字,因为空格不是数字。在PHP中,(int)"10 000" 退货10 所以你甚至不能可靠地强制它。WordPress的absint 做同样的事。可能有一个内置函数可以以类似于人类的方式处理这个问题,但我必须四处寻找它。

我建议在数据插入数据库时对其进行规范化,以便在试图检索信息时不必进行任何数据操作。也就是说,在插入数据之前,要弄清楚数据应该是什么样子,并确保数据符合要求。如果你的价格是数字,就像我假设的那样,检查你的数据中是否有非数字的东西,要么拒绝它(如果你是偏执狂),要么删除所有非数字的东西,然后插入它。类似于。。。

$price = preg_replace(\'/[^0-9]/\',\'\',"$price");

现在,当您需要搜索时,您知道自己的格式,可以在将任何用户提供的字符串发送到数据库查询之前对其执行相同的操作,或者拒绝不匹配的数据(如果您是偏执狂,顺便说一下,我通常是偏执狂)。这会让你得到更可靠的结果。

您可以使用MySQL\'s REPLACE 当您检索数据时,我不认为您可以使用核心函数来实现,除非您开始使用查询过滤器,但这确实是一种倒退。

SO网友:kaiser

准备价格WP和PHP都内置了一些东西。真正棘手的是要考虑所有可能的用户行为。您不会捕获所有内容,但您可以捕获很多内容,如无意中出现的空格、货币符号等。下面的功能有很好的注释,将向您展示我认为如何改善用户体验。我假设您的用户将使用与CMS中设置的语言相似的语言。

/**
 * Convert a number to a price, formatted according to the blogs
 * currency (which is the value returned by the WPLANG constant)
 * 
 * @param  unknown_type $price 
 * @return integer      $price
 */
function wpse73492_validate_price( $price )
{
    global $wp_locale;

    // Avoid wrong user input: The decimals can only be an integer, no float or string
    $decimals = absint( $decimals );

    // Users might add leading/trailing white space:
    $price = trim( $price );

    // Users might use a lot of funky things in the search
    // Example "shoes 10000" - they simply don\'t know better
    // But: We allow a decimal point and the thousands separator
    $regex = sprintf( 
         "0-9"
        ,$wp_locale->number_format[\'decimal_point\']
        ,$wp_locale->number_format[\'thousands_sep\']
    );
    preg_replace( "/[^{$regex}]/i", "", $string );

    // Lets convert it to a "money unit"
    // A "money unit" is something extremely different in a lot of contries.
    // Let\'s take that behavior into account
    // First we need to set the local and the charset: "en_EN.UTF-8"
    setlocale( 
         LC_MONETARY
        ,sprintf(
             \'%s.%s\'
            ,get_locale()
            ,get_bloginfo( \'charset\' )
    );
    // Second, we need to convert it to local currency
    // The WP function is a wrapper for the PHP fn `number_format()`
    // The 2nd argument defines the number of decimals, which should be 0
    // This cares about removing every part that is no absolute integer, but a float.
    $price = number_format_i18n( $price, 0 );

    // Now we need some more funkieness:
    // The DB isn\'t Babylon. Chinese and such is of our way
    // Remove the thousands separator
    $price = str_replace( $wp_locale->number_format[\'thousands_sep\'], \'\', $price );

    // Last, we help the DB, and talk to it English
    // This means that we need to get rid of ALOT: Everything non-numeric
    preg_replace( "/[^0-9]/i", "", $string );

    // Just to be sure, we then go and make it an absolute integer
    return absint( $price );
}
然后只需对所有需要的值运行该函数。

// Call it like this:
wpse73492_validate_price( $_GET[\'pr_max\'] );

// Or: If you\'re sure you got nothing than prices from $_GET
// (Hint: If you got other stuff, you can extract it up front)
$prices = array_map( \'wpse73492_validate_price\', $_GET );

结束

相关推荐