Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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 范围包括';1';还返回';10';_Php_Mysql_Zend Framework2_Between - Fatal编程技术网

Php 范围包括';1';还返回';10';

Php 范围包括';1';还返回';10';,php,mysql,zend-framework2,between,Php,Mysql,Zend Framework2,Between,我在ZF2中使用了一个中间谓词,得到了一些意想不到的行为。 考虑下面的代码: $ranges = array( array( 'min' => 2, 'max' => 4 ), array( 'min' => 7, 'max' => 9 ) ); $

我在ZF2中使用了一个中间谓词,得到了一些意想不到的行为。 考虑下面的代码:

$ranges = array(
            array(
                'min' => 2,
                'max' => 4
            ),
            array(
                'min' => 7,
                'max' => 9
            )
);

$predicates = array();

foreach($ranges as $range){
    // create a new 'Between' predicate and add it to array
    $between = new Predicate\Between('my_field', $range['min'], $range['max']);
    array_push($predicates, $between);
}

// add predicateset
$select->where->addPredicate(
    new Predicate\PredicateSet(
                            $predicates,
                            Predicate\PredicateSet::COMBINED_BY_OR
                       )
);
现在,所有这些都可以正常工作,除了使用包含
1
(例如
0-2
1-5
等)的范围外。 在这种情况下,结果集还包括
10

但是,当我在DB上直接尝试下面的查询时,不会发生这种情况:

SELECT * FROM my_table WHERE my_field BETWEEN 0 AND 5
my_字段
在本例中是一个
varchar


我错过了什么

在深入挖掘ZF2库之后,我发现
Between
谓词总是将输入值设置为
TYPE_值
,这基本上意味着值被括在引号中

一种解决方案是将库中的
Between
类更改为使用
TYPE_LITERAL
,但我认为弄乱ZF2库是不好的做法

最后,我为谓词设置了一个自定义规范,ZF2为此提供了一个方法
setSpecification
。这将把值转换回整数

//...

    $between = new Predicate\Between('my_field', $range['min'], $range['max']);

    $between->setSpecification('%1$s BETWEEN CAST(%2$s AS UNSIGNED) AND CAST(%3$s AS UNSIGNED)');

//...

也许不是最漂亮的解决方案,但它满足了我的需要。

在对ZF2库进行了一些挖掘之后,我发现
Between
谓词总是将输入值设置为
TYPE\u值,这基本上意味着这些值被括在引号中

一种解决方案是将库中的
Between
类更改为使用
TYPE_LITERAL
,但我认为弄乱ZF2库是不好的做法

最后,我为谓词设置了一个自定义规范,ZF2为此提供了一个方法
setSpecification
。这将把值转换回整数

//...

    $between = new Predicate\Between('my_field', $range['min'], $range['max']);

    $between->setSpecification('%1$s BETWEEN CAST(%2$s AS UNSIGNED) AND CAST(%3$s AS UNSIGNED)');

//...

也许不是最漂亮的解决方案,但它满足了我的需要。

您的字段是一个varchar字段,因此它正在进行字符串比较。”“10”确实介于“0”和“5”之间。@TheVedge:那么ZF2正在将我的范围值转换为字符串?例如
介于“0”和“5”之间
而不是
介于0和5之间
不确定是基于连接设置的ZF2还是MySQL转换。一般来说,如果您想将字符串作为整数值进行比较(首先这不是一个好主意,因为它将无法使用索引),您应该尝试显式地将my_字段强制转换为intoYour字段,因为它是一个varchar字段,所以它正在进行字符串比较。”“10”确实介于“0”和“5”之间。@TheVedge:那么ZF2正在将我的范围值转换为字符串?例如
介于“0”和“5”之间
而不是
介于0和5之间
不确定是基于连接设置的ZF2还是MySQL转换。一般来说,如果您想将字符串作为整数值进行比较(首先这不是一个好主意,因为它将无法使用索引),您应该尝试显式地将my_字段强制转换为intoYour字段,因为它是一个varchar字段,所以它正在进行字符串比较。”“10”确实介于“0”和“5”之间。@TheVedge:那么ZF2正在将我的范围值转换为字符串?例如
介于“0”和“5”之间
而不是
介于0和5之间
不确定是基于连接设置的ZF2还是MySQL转换。通常,如果您想将字符串作为整数值进行比较(这首先不是一个好主意,因为它无法使用索引),您应该尝试显式地将my_字段强制转换为into