提交输入“31”的maxlength“30”的文本输入

时间:2015-07-01 13:31:57

标签: php mysql forms laravel

我目前通过Laravel设置了一个表单,其中text表单输入设置为maxlength 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中的长度,但是通过应用程序获得不同的值似乎有点混乱。

2 个答案:

答案 0 :(得分:1)

这可能发生的原因是因为输入字段maxlength属性计算Unicode点中的字符数。但是,我无法直接检测到你的字符串中的任何内容,但它仍然是人们无意中绕过它的方式。正如@MartinBean的评论中所提到的,它当然也可以被故意绕过。

来自MDN:

  

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

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

请参阅此帖子上的评论和解答: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(),所以也许你已经使用了某种验证。只需几分钟即可实现,并且没有理由不进行服务器端验证。

答案 1 :(得分:0)

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

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