[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Обработка данных
NierRa
Добрый день! Пользуюсь данным ресурсом достаточно давно, но написать на форуме решил только сейчас. Помогите со следующим вопросом пожалуйста.

Суть вопроса:
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->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 байт информации, а после обрабоки получится такая шняжечка:

Цитата

&lt;b&gt;Hello world!&lt;/b&gt;


теперь у тебя с каждой стороны прибавилось по 3 лишних байта. Сторон 4 - итого 12 лишних байт. Конечно, здесь это малая цифра, но на продакшне - огромная, особенно, если это форум с текстами и хтмл оформлениями.

Плетемся дальше.

Удалять слеши, конечно же не обязательно, проще заплестись в конфигурацию сервера и настроить его верно. К тому же, можно рекурсивно пройтись вначале по массиву и удалить слешики (если уж совсем беда).

Единственная функция, которая порой бывает полезна, это nl2br, но опять же, получается чушь - вначале ты экранируешь теги, а потом добавляешь вместо \n тег <br />, и опять получается балеберда, типа этой:

Цитата

&lt;b&gt;Hello world!&lt;/b&gt;<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://eu.battle.net/sc2/ru/profile/2212951/1/IIIIIIIIIIII/
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.