2015-07-01 2 views
0

В настоящее время я форма создана с помощью Laravel с text формы ввода, созданной с MAXLENGTH 30:Текст ввод MAXLENGTH «30» подачи ввод «31»

{{ 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 является первым, и 29 будучи тридцатые, но я проверил в нескольких различных браузерах и MaxLength 30 всегда выходит, как 30.

Возможно ли, что тег maxlength просматривается по-разному между браузерами?

Предполагаю, что я могу войти и установить максимальную длину в моих вводах на 1 ниже длины, указанной в MySQL, но это кажется немного бесполезным при использовании разных значений через приложение.

+2

Возможно ли, что пользователь просто удалил атрибут maxlength на стороне клиента, а затем просто отправил строку по своему выбору? –

+1

Возможно, они обошли атрибут, например, @MartinBean, рядом с проверкой на лицевой стороне вы можете добавить подтверждение в свой контроллер (или где бы вы его не обрабатывали). Посмотрите на валидацию на веб-сайте laravel (так как вы не упомянули версию, которую я не свяжу ни с кем), она добавит дополнительный серверный уровень, который также может вернуть ошибки/обратную связь. –

+0

Ввод текста, похоже, не является чем-то необычным: 'Georgia Piedmont Technical Coll' Так что он уже усечен, но является просто дополнительным символом надстрочной ... – cchapman

ответ

1

Причина, по которой это могло произойти, объясняется тем, что атрибут maxlength поля ввода подсчитывает количество символов в точках Unicode. Тем не менее, я не могу напрямую обнаружить что-либо в вашей строке, но это все равно, что люди могут случайно обходить его. Как упоминалось в комментариях @MartinBean, это, конечно, также можно было бы обойти намеренно.

От MDN:

MaxLength Если значение атрибута типа является текст, электронная почта, поиск, пароль, тел, или 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. * из входного :: старый()):

$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 

Я вижу, что вы используете вход :: старый() уже в вашей форме, поэтому, возможно, вы уже используете какую-то проверку. Выполняется всего несколько минут, и на самом деле нет причин не проверять серверную сторону.

0

В javascript вы должны проверить длину строки, которую она ввела пользователем. Если это вы должны уведомить пользователя с красным флагом на входе или что-то в этом роде. Таким образом, вы не должны продолжать подавать форму.

Тем не менее, на сервере, вы должны проверить еще раз по длине и решить, что делать: - сохранить в базе данных со строкой только 30 символов - не сохранять в базе данных и отобразить сообщение об ошибке в пользователь, приходящий с сервера

Смежные вопросы