php - 范围包括 '1' 的 BETWEEN 也返回 '10'

标签 php mysql zend-framework2 between

我在 ZF2 中使用 BETWEEN 谓词时遇到一些意外行为。 考虑以下代码:

$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-21-5 等) . 在那种情况下,结果集还包括值 10

但是,当我尝试在数据库上直接执行以下查询时,这不会发生:

SELECT * FROM my_table WHERE my_field BETWEEN 0 AND 5

(在本例中,my_field 是一个 varchar)

我在这里错过了什么?

最佳答案

在深入了解 ZF2 库之后,我发现 Between 谓词总是将输入值设置为 TYPE_VALUE,这基本上意味着值被包裹在引号。

一个解决方案是更改库中的 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)');

//...

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

关于php - 范围包括 '1' 的 BETWEEN 也返回 '10',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30678151/

相关文章:

php - Zend Framework 2 - 使用 ZFCUser 进行身份验证的全局检查

将所有文件和文件夹上传到 FTP 服务器的 PHP 脚本

php - skaffold重建某些文件的图像,而不重建其他文件的图像

php - Ajax 端点应如何响应非 ajax 请求?

php - SQL 注入(inject)风险 - 允许 REGEXP 输入

mysql - 在数据库建模中,它是什么样的关系?

MySql 查询特定州并从返回结果中分离出城市

php - 如果其他列的输入为空,则更新数据库中的一行,同时保留其他列中的先前数据

mysql - Zf2 表网关连接查询仅从第二个表中获取最新行(按 id)

php - zf2 未捕获的运行时异常 'No RouteMatch instance provided',路由 i18n