Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Wordpress在0到100000之间使用`时不会选择行`_Php_Mysql_Wordpress - Fatal编程技术网

Php Wordpress在0到100000之间使用`时不会选择行`

Php Wordpress在0到100000之间使用`时不会选择行`,php,mysql,wordpress,Php,Mysql,Wordpress,我有一个Wordpress安装,列出了出售的财产。我试图找到两个值之间的属性 我遇到的问题是,当我做以下事情时: SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) INNER JOIN wp_postmeta AS mt1 ON ( wp_posts.ID = mt1.post_id ) INNER JOI

我有一个Wordpress安装,列出了出售的财产。我试图找到两个值之间的属性

我遇到的问题是,当我做以下事情时:

SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )  INNER JOIN wp_postmeta AS mt1 ON ( wp_posts.ID = mt1.post_id )  INNER JOIN wp_postmeta AS mt2 ON ( wp_posts.ID = mt2.post_id )  INNER JOIN wp_postmeta AS mt3 ON ( wp_posts.ID = mt3.post_id ) WHERE 1=1  AND ( 
  ( wp_postmeta.meta_key = 'type_of_property' AND wp_postmeta.meta_value IN ('semidetached') ) 
  AND 
  ( mt1.meta_key = 'property_value' AND mt1.meta_value BETWEEN '0' AND '100000' )
) AND wp_posts.post_type = 'shared_ownership' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'acf-disabled' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC
它只返回3行。但是,如果我将其更改为以下内容:

SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )  INNER JOIN wp_postmeta AS mt1 ON ( wp_posts.ID = mt1.post_id )  INNER JOIN wp_postmeta AS mt2 ON ( wp_posts.ID = mt2.post_id )  INNER JOIN wp_postmeta AS mt3 ON ( wp_posts.ID = mt3.post_id ) WHERE 1=1  AND ( 
  ( wp_postmeta.meta_key = 'type_of_property' AND wp_postmeta.meta_value IN ('semidetached') ) 
  AND 
  ( mt1.meta_key = 'property_value' AND mt1.meta_value BETWEEN '0' AND '99999' )
) AND wp_posts.post_type = 'shared_ownership' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'acf-disabled' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC
$args = array(
        'post_type' => $propertyType[0],
        'paged'=>$paged,
        'meta_query' => array(
            'relation' => 'AND',
            array(
                'key' => 'type_of_property',
                'value' => $data[0],
            ),
            array(
                'key' => $propertyValue,
                'value' => array($data[3], $data[4]),
                'type' => 'DECIMAL',
                'compare' => 'BETWEEN'
            ),
            array(
                'key' => 'number_of_bedrooms',
                'value' => $data[2],
                'compare' => 'IN'
            ),
            array(
                'key' => 'town_index',
                'value' => $data[1],
                'compare' => 'IN'
            ),
        )
    );
}
$loop = new WP_Query( $args );
它按预期返回13行。这里唯一的区别是最大数量,我不太明白为什么从数据库的结果来看99999和100000之间有如此巨大的差异

wordpress只是忽略了额外的零吗?它不把它看作一个数字吗?我不知道如何着手修理这个

编辑:

下面是我如何使用高级自定义字段等构建此查询的示例

$args = array(
        'post_type' => $propertyType[0],
        'paged'=>$paged,
        'meta_query' => array(
            'relation' => 'AND',
            array(
                'key' => 'type_of_property',
                'value' => $data[0],
            ),
            array(
                'key' => $propertyValue,
                'value' => array($data[3], $data[4]),
                'compare' => 'BETWEEN'
            ),
            array(
                'key' => 'number_of_bedrooms',
                'value' => $data[2],
                'compare' => 'IN'
            ),
            array(
                'key' => 'town_index',
                'value' => $data[1],
                'compare' => 'IN'
            ),
        )
    );
}
$loop = new WP_Query( $args );

$data是一个数组$data[3]和$data[4]与我上面提到的值相等,这些值是从一个表单帖子中填充的。

尝试删除单引号。我相信SQL不确定如何键入这些值进行比较。字符串与标量,正如注释中指出的

为了验证你的额外零假设,这将证明这一点:尝试将10000值更改为100001。正如您所怀疑的,如果没有正确的填充0,SQL可能能够更好地解释查询

编辑:为了获得对查询的细粒度控制,避免WP应用单引号,您可以只使用$wpdb对象

发件人:

使用$wpdb对象 WordPress提供了一个全局对象变量$wpdb,它是/wp includes/wp-db.php中定义的wpdb类的一个实例化。默认情况下,$wpdb被实例化以与WordPress数据库对话。要在WordPress PHP代码中访问$wpdb,请使用global关键字将$wpdb声明为全局变量,或按以下方式使用superglobal$GLOBALS:

global $wpdb;
$results = $wpdb->get_results( 'SELECT * FROM wp_options WHERE option_id = 1', OBJECT );
编辑2:

尝试在$args数组的meta_查询片段中将类型为NUMERIC的键/值指定为:

从…收集


好吧,我尝试了所有的建议,效果很好。然而,由于我们使用高级自定义字段并使用$args ACF建议运行查询,显然您可以这样做:

SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id )  INNER JOIN wp_postmeta AS mt1 ON ( wp_posts.ID = mt1.post_id )  INNER JOIN wp_postmeta AS mt2 ON ( wp_posts.ID = mt2.post_id )  INNER JOIN wp_postmeta AS mt3 ON ( wp_posts.ID = mt3.post_id ) WHERE 1=1  AND ( 
  ( wp_postmeta.meta_key = 'type_of_property' AND wp_postmeta.meta_value IN ('semidetached') ) 
  AND 
  ( mt1.meta_key = 'property_value' AND mt1.meta_value BETWEEN '0' AND '99999' )
) AND wp_posts.post_type = 'shared_ownership' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'acf-disabled' OR wp_posts.post_status = 'private') GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC
$args = array(
        'post_type' => $propertyType[0],
        'paged'=>$paged,
        'meta_query' => array(
            'relation' => 'AND',
            array(
                'key' => 'type_of_property',
                'value' => $data[0],
            ),
            array(
                'key' => $propertyValue,
                'value' => array($data[3], $data[4]),
                'type' => 'DECIMAL',
                'compare' => 'BETWEEN'
            ),
            array(
                'key' => 'number_of_bedrooms',
                'value' => $data[2],
                'compare' => 'IN'
            ),
            array(
                'key' => 'town_index',
                'value' => $data[1],
                'compare' => 'IN'
            ),
        )
    );
}
$loop = new WP_Query( $args );

因此,在参数上定义一种十进制类型,它会自动将字段转换为以下摘录:mt1.meta_key='property_value'和CASTmt1.meta_value作为介于'0'和'445295'之间的十进制值。

您的值将作为字符串进行比较,这意味着应用了哪些字符串比较规则:

'2' > '3' -> false
'2' > '1999999999' -> true
就你而言:

  '2' BETWEEN '0' and '10000'
执行为

  ('0' <= '2') && ('2' < '10000')
      (true)   &&    (false)
             false

这显然是错误的

当您直接在MySQL workbench或PHPMyAdmin中运行SQL语句时会发生什么?无法想象它会这么简单,但是删除单引号呢?对于你的额外零假设,把它改成100001怎么样?那么会发生什么呢?@MonkeyZeus它给出的结果与WP doesmeta_值是一个长文本相同,请尝试将其转换为整数。我认为BETWEEN只适用于标量值和日期/时间。比如,你不能在a和b之间进行选择。太好了!很高兴我能帮助大家在正确的道路上提供答案,而不是继续提供盲目的理论和猜测:-这不是一个答案,这是一个评论。为卡梅隆辩护,删除引号确实有效,但查询是由WP建立的,因此不能轻易修改。对不起,区别在这里?如果你能向我解释为什么不是答案,我将放弃我的问题/评论。你希望我用更权威的语言来表达吗?我想他会把他的评论答案变成真正的解决方案,所以我撤回了downvoteJINX;到处都是很好的侦察。干杯,伙计。
  ('2' < '1') && (null < '0') && (null < '0') etc...
       a               b               c
  (false) && (false) && (false) ....
  false
 1234567890
 abcdefgjij

 '2' BETWEEN '1' AND '100000000'
 'B' BETWEEN 'A' AND 'AJJJJJJJJ'