Суть вопроса:
1. Необходимо занести в базу данных определенную информацию. В структуре БД тип поля разумеется Text.
2. Необходимо вывести эту инфу в каком нибудь месте.
Сразу оговорюсь меня интересует только обработка данных. Ни построение запросов, ни верстка, ни еще что-то в подобном роде.
Кусок кода:
if(!empty($_POST['content'])) {
$content = $_POST['content'];
$content = trim($content);
$content = stripslashes($content);
$content = htmlspecialchars($content);
$content = nl2br($content);
}
Запрос на обновлении информации в БД построен через проверку функцией mysql_real_string_escape($content);
Построчный разбор:
1. if(!empty($_POST['content'])) {
$content = $_POST['content']; - инициализация переменной.
2. $content = trim($content); - удаляем возможные лишние пробелы
3. $content = htmlspecialchars($content); - преобразовываем теги в безопасные аналоги
4. $content = nl2br($content); - выводим текст так, как его занес пользователь
5. $content = stripslashes($content); ВОТ ради чего была создана тема. Удаляем возможные экранирующие символы.
В .htaccess директива magic_quotes_gpc отключена, что как я понял дает возможность проигнорировать проверку данных с помощью функции stripslashes.
Так ли это? Зараннее благодарен.
Да, и в догонку вопрос...
Логика подсказывает, что можно написать
$content = nl2br(htmlspecialchars(trim($content)));
С точки зрения "правил хорошего коддинга" какая запись лучше? Лично мне кажется первый варинт более читабелен, второй просто экономит место
Спустя 4 часа, 19 минут, 49 секунд (23.07.2012 - 06:21) alex12060 написал(а):
Все зависит от поставленной задачи.
Если, допустим, у тебя что-то наподобии форума, то нужно хранить пробелы.
Т.е., если зальют тебе такой текст:
То все пробелы должны быть на месте, а не как здесь:
class Test {
private $a = null;
public static $b = true;
public function fact($n) {
return ($n <= 1) ? 1 : $n * $this->factl($n - 1);
}
}
Это раз, 2 - это преобразование html тегов. Один символ весит один байт или 8 битов, это стандартная английская буква и символы, всего таковых в АСКИ таблице 255 штук.
Так вот, к чему я. Если обрабатывать перед вставкой в базу хтмл теги функцией htmlspecialchars(), то получится такая ситуэйшн:
Пусть есть текст:
Строка содержит 19 символов или 19 байт информации, а после обрабоки получится такая шняжечка:
Если, допустим, у тебя что-то наподобии форума, то нужно хранить пробелы.
Т.е., если зальют тебе такой текст:
class Test {
private $a = null;
public static $b = true;
public function fact($n) {
return ($n <= 1) ? 1 : $n * $this->fact($n - 1);
}
}
То все пробелы должны быть на месте, а не как здесь:
class Test {
private $a = null;
public static $b = true;
public function fact($n) {
return ($n <= 1) ? 1 : $n * $this->factl($n - 1);
}
}
Это раз, 2 - это преобразование html тегов. Один символ весит один байт или 8 битов, это стандартная английская буква и символы, всего таковых в АСКИ таблице 255 штук.
Так вот, к чему я. Если обрабатывать перед вставкой в базу хтмл теги функцией htmlspecialchars(), то получится такая ситуэйшн:
Пусть есть текст:
<b>Hello world!</b>
Строка содержит 19 символов или 19 байт информации, а после обрабоки получится такая шняжечка:
Цитата |
<b>Hello world!</b> |
теперь у тебя с каждой стороны прибавилось по 3 лишних байта. Сторон 4 - итого 12 лишних байт. Конечно, здесь это малая цифра, но на продакшне - огромная, особенно, если это форум с текстами и хтмл оформлениями.
Плетемся дальше.
Удалять слеши, конечно же не обязательно, проще заплестись в конфигурацию сервера и настроить его верно. К тому же, можно рекурсивно пройтись вначале по массиву и удалить слешики (если уж совсем беда).
Единственная функция, которая порой бывает полезна, это nl2br, но опять же, получается чушь - вначале ты экранируешь теги, а потом добавляешь вместо \n тег <br />, и опять получается балеберда, типа этой:
Цитата |
<b>Hello world!</b><br /> |
И вместо однобайтого символа переноса строки в базе у тебя лежит 6 байт информации.
Итог - При внесении в базу нужно использовать лишь 1 функцию - mysql_real_escape_string(), ну можно использовать конечно и trim(), но это лишь для параноиков, но а при выводе делать htmlspecialchars() и nl2br(), так как все программисты эгоисты :)
Думаю, мой разбор будет полезен.
Спустя 32 минуты, 12 секунд (23.07.2012 - 06:53) NierRa написал(а):
Благодарю, жаль не хватает постов + к карме добавить.
Кстати, после того как запостил, нашел http://phpforum.ru/index.php?showtopic=19168
Много полезного узнал для себя по своему текущему вопросу.
Кстати, после того как запостил, нашел http://phpforum.ru/index.php?showtopic=19168
Много полезного узнал для себя по своему текущему вопросу.
_____________
Задача на корректную обработку данных (мое решение)
http://eu.battle.net/sc2/ru/profile/2212951/1/IIIIIIIIIIII/