LINUX.ORG.RU

Обработка формы и автозамена текста

 


0

1

ЛОР, а посоветуй как правильно записывать текст (пользовательский комментарий) в базу и как правильно его выводить.

Сейчас перед добавлением в базу делается небольшая обработка, а именно удаляются лишние ентеры:

$comment_text = $_POST['text'];
$comment_text = str_replace(["\r\n", "\n\r", "\r"], "\n", $comment_text);

Но больше оригинал текста не трогается и заносится в базу как есть. Только на выводе хтмл-странички делается обработка:

$comment_text = str_replace(['&', '<', '>', "\n"], ['&amp;', '&lt;', '&gt;', "<br>\n"], $comment_text);

ИМХО, в базе не нужно трогать текст вообще, с одной стороны — на выводе получаем гибкость в обработке текста, вдруг, захочется прикрутить смайлики, markdown, всё это будет обрабатываться каждый раз на выводе хтмл-странички.

С другой стороны, занося в базу обработанный текст — его обработали один раз и вполне себе экономим процессорное время потом, но какой ценой... Когда пользователь захочет отредактировать комментарий, придется текст снова восстанавливать, вырезая оттуда свои кривые тэги.

Правильно ли, что в базу следует заносить оригинальный текст как есть (убрав лишние ентеры за ненадобностью разве что), а обрабатывать уже только на выводе из БД? Или может ещё чего нехватает?

★★★★★

Последнее исправление: Spoofing (всего исправлений: 1)

Но больше оригинал текста не трогается и заносится в базу как есть.

То есть ты никак не заботишься об sql-инъекциях?

alozovskoy ★★★★★
()
Ответ на: комментарий от alozovskoy

Нет, я просто делаю prepare, а затем через bind заношу все данные как есть, нетронутыми...

$db->query('BEGIN TRANSACTION;');
$try = $db->prepare('INSERT INTO blog_comments (post_id, user_id, comment_text, comment_author_ip, comment_agent, is_approved) VALUES (:post_id, :user_id, :comment_text, :comment_author_ip, :comment_agent, :is_approved);');
if (isset($_SESSION)) {
  $try->bindValue(':user_id', $_SESSION['user_id']);
  $try->bindValue(':is_approved', NULL);
}
else {
  $try->bindValue(':user_id', NULL);
  $try->bindValue(':is_approved', '?');
}
$try->bindValue(':post_id', $post_id);
$try->bindValue(':comment_text', $comment_text);
$try->bindValue(':comment_author_ip', $_SERVER['REMOTE_ADDR']);
$try->bindValue(':comment_agent', $_SERVER['HTTP_USER_AGENT']);
$try->execute();
$db->query('UPDATE blog_posts SET post_count_comments = post_count_comments + 1 WHERE post_id = '.$post_id.';');
$db->query('COMMIT;');
Spoofing ★★★★★
() автор топика

Правильно ли, что в базу следует заносить оригинальный текст как есть

Да. Во всех вменяемых ЦМС так делается.

занося в базу обработанный текст — его обработали один раз и вполне себе экономим процессорное время

По сравнению с общими затратами это экономия на спичках. Ты же не экономишь спички? Не надо отвечать :) Если хочешь поиграться в хайлоад лучше сделай кеширование в nginx.

goingUp ★★★★★
()

С другой стороны, занося в базу обработанный текст — его обработали один раз и вполне себе экономим процессорное время потом, но какой ценой... Когда пользователь захочет отредактировать комментарий, придется текст снова восстанавливать, вырезая оттуда свои кривые тэги.

Прикрути на сервере кэш.

h578b1bde ★☆
()

Чувак, тебе до сих пор не хочется вымыть руки от кодирования на пыхе?
Ты когда на этом говне пишешь, хотя бы перчатки одевай.

Hertz ★★★★★
()

пользователь захочет отредактировать комментарий

Это не так уж часто делается, чтобы об этом переживать.

Hertz ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.