Главная » Без рубрики

Проблемы с переносом строки в textarea

15 Март 2010 23 коммент.

Наверняка я буду не первым и не последним из тех, кто сталкивался, по неграмотности, с проблемой переноса строк в textarea при записи содержимого в MySQL-базу – все символы переноса строки остаются незамеченными и в базу попадает, по сути, одна большая строка.

Обратившись к великому Гуглу, наковырял, так сказать, изюма из булок – ну и выкладываю засим…

Способ первый (а вдруг повезет):

Как гласит спецификация HTML (поправьте меня, гуру, при ошибке в терминологии), у поля TEXTAREA имеется замечательный атрибут – WRAP, который определяет способ переноса слов в заполняемой данной заполняемой форме. Возможные значения:

  • off – перенос слов не происходит (значение по умолчанию)
  • virtual – перенос слов только отображается, на сервер же поступает неделимая строка.
  • physical – перенос слов будет происходить во всех точках переноса.

Вот, кажется, и панацея нашлась:

<textarea cols="40" rows="3" name="address">
    Текст по умолчанию...
</textarea>

Применив на практике сие чудо мысли, заметил, что оно НЕ РАБОТАЕТ. Видимо, по незнанию перепутал переносы слов и строк :) Так вот, данная фича относится именно к переносу слов и никак иначе…

Способ второй. Рабочий.

Так как работаем с базой на языке php (ну, там, селекты, апдейты), то неглупым было бы использовать обычную стандартную функцию языка – nl2br, которая вставляет HTML код разрыва строки перед каждым переводом строки. Делается это приблизительно так:

<form action="add.php" method="post">
    <textarea cols="60" rows="10" name="description"></textarea>
<input type="submit" value="Готово" />
</form>

Естественно, безо всяких мудрствований с дизайном, это уже делайте исходя из собственных соображений. А вот фрагмент файла add.php, куда мы отправляем данные из нашей формы методом POST:

$description = nl2br($_POST['description']);
 
/* Соединяемся с базой данных */
$con = mysql_connect("сервер","база данных","пароль");
if (!$con)
{
    die('Не могу соединиться: ' . mysql_error());
}
mysql_select_db("база данных", $con);
 
/* Формируем SQL-запрос */
$sql="INSERT INTO `base` ( description ) VALUES ( '$description' )";
if (!mysql_query($sql,$con))
{
    die('Error: ' . mysql_error());
}

Вот так уже работает. Но есть одно но. Не всех устроит обычный перенос строки, так как не каждому понравится отсутствие интервала между абзацами, поэтому применяем

Способ третий. Доработка напильником.

Гораздо приятнее созерцать текст, введенный через textarea, залитый в базу и отображенный после этого на странице c визуально разделенными абзацами. Тут, далеко ходить не надо, вместо переноса строки лучше «смотрелись» бы абзацы. Вопрос возникает: ведь стандартных функций подобного рода в php не существует. Так почему бы не написать свою… Что и сделали ребята, имена которых нам неизвестны, но все мы им очень благодарны (лично мне они очень помогли в период, когда хотелось результата, но не очень хотелось мозг напрягать :) ).  Вот, значит, их функция с использованием регулярных выражений (это, собсно, доработанный напильником файл add.php):

// [+] ФУНКЦИЯ ЗАМЕНЫ ПЕРЕНОСОВ СТРОКИ НА ПАРАГРАФЫ
 
function nl2p($str) {
	return '
 
'.preg_replace("/[\r\n|\n|\r]+/", "
 
", $str).'
 
';
}
 
// [-] ФУНКЦИЯ ЗАМЕНЫ ПЕРЕНОСОВ СТРОКИ НА ПАРАГРАФЫ
 
$description = nl2p($_POST['description']);
 
/* Соединяемся с базой данных */
$con = mysql_connect("сервер","база данных","пароль");
if (!$con)
{
    die('Не могу соединиться: ' . mysql_error());
}
mysql_select_db("база данных", $con);
 
/* Формируем SQL-запрос */
$sql="INSERT INTO `base` ( description ) VALUES ( '$description' )";
if (!mysql_query($sql,$con))
{
    die('Error: ' . mysql_error());
}

Еще один бонус, приобретаемый с этой функцией – если несколько переносов строк следуют друг за другом (т.е. пользователь применяет так называемый метод «форматирования абзацами», как это делают тетеньки в пенсионном фонде или просто неграмотные секретари), то функция оставляет только один из них, не нарушая стройности «конструкции».

В общем, пользуйтесь на здоровье, дорогие мои начинающие, или забывшие матчасть, программисты :)

23 коммент. »

  • курьер пишет:

    Подскажите, можно ли разместить на своем сайте данный пост?

    [Ответить]

  • купить авто пишет:

    А Вы не задумывались о том, чтобы параллельно завести еще один блог

    [Ответить]

  • den (author) пишет:

    @курьер: Размещайте с обратной ссылкой. Тем более, что тут мои наблюдения, а не изобретения :)

    @купить авто: параллельный блог есть – http://artlap.ru – круг искусства, неизвестные авторы, креатив. Третий вряд-ли потяну, «делу время, а потехе час», как говорится

    @обоим: уж больно на спам смахивали Ваши каменты, пока я не удалил Ваши url’ки, а так, очень даже конструктивные комментарии получились :)

    [Ответить]

  • Snegurka пишет:

    Действительно не Вы последний столкнулись с этой проблемой, спасибо за пост )

    [Ответить]

  • den (author) пишет:

    Снегурочка, пожалуйста :) Что, кодим потихоньку, в свободное от ассистирования Деду Морозу время? :)

    [Ответить]

  • Вадик пишет:

    вввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввввв

    [Ответить]

    den отвечает (Июль 12th, 2011 в 17:03):

    Спасибо, Вадик, огромное )) Взял и порвал страницу ))

    [Ответить]

  • Вадик пишет:

    вот видите с какой проблемой столкнулся! если ввести такое длинное словечко, то корежеться вся страница! Как этого избежать пока не додумался. Думаю на javascript можно сделать подсчет кол-ва символов в строке и добавлять автоматический перенос. Может кто подскажет как это сделать?

    [Ответить]

  • ck пишет:

    Вадик. Всё до банальности просто. К чему все эти извращения с php??
    Можно обойтись средствами CSS.
    textarea {word-wrap: break-word; width:100%; left:0; width: 350px;}
    Ширина блока естественно под ваш дизайн, но параметр задать обязательно.

    [Ответить]

  • ck пишет:

    Простите забыл. В HTML код textarea добавить атрибут wrap=»on».

    [Ответить]

  • Geroiizlodei.ru пишет:

    В третьем случае пропущен тег

    function nl2p($str) {
    return ‘

    ‘.preg_replace(«/[\r\n|\n|\r]+/», «», $str).’

    ‘;
    }

    [Ответить]

  • Geroiizlodei.ru пишет:

    В третьем случае нет тега p, т.к. он стерт вашим антиспамером. В результате функция наоборот стирает все переносы строк.

    function nl2p($str) {
    return ‘

    ‘.preg_replace(«/[\r\n|\n|\r]+/», «здесь НТМL-тег абзаца Р», $str).’

    ‘;
    }

    [Ответить]

  • Tureg1 пишет:

    Волшебный пост! Мне очень помого :)

    [Ответить]

    den отвечает (Ноябрь 1st, 2011 в 13:44):

    @Tureg1, я не волшебник, у только учусь (…краснея…)

    [Ответить]

  • jjkjmkmjm пишет:

    kkkkkkkkkkkkkkkkkkkkkkllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll

    [Ответить]

  • jjkjmkmjm пишет:

    111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

    [Ответить]

  • jjkjmkmjm пишет:

    11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111112
    2452222222 22222222222242222 22222245222222 2222222 224222222522 2222225222 22224222222 5222222 222222222 2 2 2 45454545454

    [Ответить]

  • jjkjmkmjm пишет:

    ggdggggggggggggggggddgdgdgdggdgddggddgggddgddggddgdggddggddggddggdgdggdddggdgdgddggggggggggggggggggg ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd

    [Ответить]

  • jjkjmkmjm пишет:

    hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh

    [Ответить]

    den отвечает (Ноябрь 15th, 2011 в 22:47):

    @jjkjmkmjm, очень, бля, умно…

    [Ответить]

  • slavka пишет:

    спс, просто нереально помогло победить символ конца строки для правки конфигов юникс из веба.

    [Ответить]

  • Дмитрий пишет:

    А как де про sql-инъекции? забыли?
    может у вас и включено «кавычкирование» сервером, а как быть тем у кого не включено?
    mysql_real_escape();

    [Ответить]

  • Дмитрий пишет:

    Пардонте…
    недописал
    mysql_real_escape_string()

    [Ответить]

Оставить комментарий или два (можно даже вставить видео в комментарий)

Добавьте свой комментарий или трэкбэк . Вы также можете подписаться на комментарии по RSS.

Будте вежливы. Не ругайтесь. Оффтоп тоже не приветствуем. Спам убивается моментально.

Если хотите вставить в комментарий видео с YouTube.com - используйте шаблон: [youtube]video_id[/youtube], т.е. видео с адресом
http://www.youtube.com/watch?v=LJZg2W-D28M&feature=player_embedded
надо размещать таким кодом:
[youtube]LJZg2W-D28M[/youtube]

ОЧЕНЬ ВАЖНАЯ ИНФОРМАЦИЯ: Ввод html-кода бесполезен - он удаляется автоматически. Спамерам здесь делать совершенно нехрен. Если комментируете - то делайте это по существу. Мое уважение и почтение всем конструктивным комментаторам. А спамерам, флудерам и троллям добро пожаловать на tema.livejournal.com - там вас переадресуют в нужном направлении (и вообще, как вам - спамерам, флудерам и троллям, может быть интересен блог с нулевыми показателями...)