【问题标题】:Text input of maxlength '30' submitting an input of '31'最大长度“30”的文本输入提交“31”的输入
【发布时间】:2015-07-01 13:31:57
【问题描述】:

我目前通过 Laravel 设置了一个表单,其中 text 表单输入设置为最大长度为 30:

{{ Form::text('employer' , Input::old('employer'), array('class'=>'form-control', 'maxlength'=>'30')) }}

我还在 MySQL 中设置了长度为 30 的列。

我最近收到一个错误,即提交的该字段的输入长度为 31 个字符,我不确定这会如何发生。

SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'employer' at row 1 (SQL:update...)

我假设数组编号中的某些东西正在计数,0 是第 1 个,29 是第 30 个,但我在几个不同的浏览器中检查过,最大长度为 30 的结果总是为 30。

maxlength 标签在浏览器之间的查看方式是否可能不同?

我想我可以将输入中的 maxlength 设置为比 MySQL 中的长度低 1,但是通过应用程序具有不同的值似乎有点混乱。

【问题讨论】:

  • 有没有可能是用户只是去掉了客户端的maxlength属性,然后提交了自己选择的字符串?
  • 也许他们绕过了@MartinBean 提到的属性,在前端验证旁边,您可以在控制器中添加验证(或在您处理此的任何地方)。在 laravel 网站上查找 Validation (因为你没有提到版本我不会随便链接),它会添加一个额外的服务器端层,它也可以返回错误/反馈。
  • 文本输入似乎没有什么异常:Georgia Piedmont Technical Coll 所以它已经被截断了,只是一个额外的字符过长...

标签: php mysql forms laravel


【解决方案1】:

之所以会发生这种情况,是因为输入字段的 maxlength 属性计算了 Unicode 点中的字符数。不过,我无法直接检测到您的字符串中的任何内容,但这仍然是人们可以无意中绕过它的一种方式。正如@MartinBean 在 cmets 中提到的,它当然也可以被故意绕过。

来自 MDN:

最大长度 如果 type 属性的值为 text、email、search、password、tel 或 url,则该属性指定用户可以输入的最大字符数(以 Unicode 代码点为单位);对于其他控件类型,它被忽略。它可以超过 size 属性的值。如果未指定,用户可以输入不限数量的字符。指定负数会导致默认行为;也就是说,用户可以输入无限数量的字符。仅当属性的值已更改时才评估约束。

来源:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input

并查看此帖子中的 cmets 和答案:Are there browsers that don't support maxlength?

我建议也总是添加服务器端验证。在 Laravel 中,这可以很容易地实现。

对于 Laravel 5.1:http://laravel.com/docs/5.1/validation

对于 Laravel 4.2:http://laravel.com/docs/4.2/validation

类似伪的东西(4.2 示例,因为我认为您使用 4.* 因为 Input::old()):

$rules  = array(
    'employer'      => 'size:30',
);

// or \Input::all() depending on your namespacing, 
// instead of ::only(..) you can use ::all(), ::except(..)
// too, of course.
$input  = Input::only('employer'); 

$validator = Validator::make(
    $input,
    $rules
);

if ($validator->fails())
{
   // Throw whatever (preferably a custom validator exception)
   // exception you like, or return Redirect::to('form')->withInput();
   // I think if you want to use Redirect::back
   // input you have to Input::flash() first, not sure.
   throw new Exception('Validation failed.');
}

... go on then

我看到您已经在表单中使用了 Input::old(),所以也许您已经使用了某种验证。只需几分钟即可实施,而且确实没有理由不进行服务器端验证。

【讨论】:

    【解决方案2】:

    在 javascript 中,您必须验证用户插入的字符串的长度。如果是这样,您应该在输入或类似的东西上用一些红旗通知用户。 这样你就不应该继续提交表单了。

    尽管如此,在服务器中,您必须再次检查长度并决定要做什么: - 仅使用 30 个字符的字符串保存在数据库中 - 不保存在数据库中并向来自服务器的用户显示错误

    【讨论】:

      猜你喜欢
      • 2012-02-20
      • 2011-03-24
      • 2020-06-30
      • 2012-06-02
      • 1970-01-01
      • 2015-12-28
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多