【问题标题】:Laravel Input validation Between is not validate correctlyLaravel 输入验证之间未正确验证
【发布时间】:2016-01-29 18:12:08
【问题描述】:

目前我在 laravel 输入验证中遇到了一些问题,其中之间的验证规则似乎没有正确应用。下面是我的 HTML 代码。

<input type="hidden" name="_token" value="{{ csrf_token() }}">
                <div class="margin-bottom-10">
                    <label>Thread Title :</label>
                    <input name="thread_title" maxlength="100" required>
                </div>                  
                <div class="margin-bottom-10">
                    <label>Price :</label>
                    <input type="number" step="0.01" min="0" required title="Please enter price with x.xx format." name="thread_item_price" />
                </div>

我要做的是验证给定的价格必须在 0 到 9999.99 之间。我检查元素并删除 min="0" 并尝试以负值提交 -1000,系统似乎接受输入。以下是我的验证器规则

$validator = Validator::make($request::all(),
            [
                'thread_title' => 'required|max:100',
                'thread_item_price' => 'between:0,9999.99'
            ],
            [
                'thread_title.required' => 'Please fill in thread title.',
                'thread_title.max' => 'Thread title has exceeded 100 characters.',
                'thread_item_price.required' => 'Price cannot be empty.',
                'thread_item_price.between' => 'Price must be equals to 0 or 9999.99.',
            ]);

        if ($validator->fails()) {
            return Redirect::back()
                ->withErrors($validator)
                ->withInput();
        };

我是不是做错了什么导致验证失败?

【问题讨论】:

    标签: php validation laravel


    【解决方案1】:

    你需要让 Laravel 知道它是一个数值。这应该适合你。

    'thread_item_price' => 'numeric|between:0,9999.99'
    

    【讨论】:

    • 当心:基于“介于”的代码:github.com/laravel/framework/blob/5.8/src/Illuminate/Validation/… 您没有验证实际的小数位数,只是该数字介于两个实际值之间:0 和 9999.9900000.. . 如果您尝试验证 9999.981,它将被接受(之后可能会四舍五入为 9999.98),但如果您尝试使用 9999.991,它将失败。
    【解决方案2】:

    Between 规则只接受整数作为数字。对于浮点数,您应该使用 digits_between 规则。

    编辑: 我不知道为什么 Laravel 接受它,验证规则 digits_between 使用 is_numeric 函数。您可以尝试正则表达式规则:

    ['thread_item_price' => 'regex:/^\d{0,4}\.\d{2}$/'];
    

    【讨论】:

    • 不需要运行正则表达式。 digits_between 检查位数,而不是输入的数值。 between 有效,但您需要让 Laravel 知道这是一个数值,如我的回答所示。
    猜你喜欢
    • 2016-01-24
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 2020-07-09
    • 2021-08-25
    • 2020-08-31
    • 1970-01-01
    相关资源
    最近更新 更多