За последние 24 часа нас посетили 18047 программистов и 1744 робота. Сейчас ищут 1008 программистов ...

Проблема с " Менять обработку вывода и ввода в БД?

Тема в разделе "Прочие вопросы по PHP", создана пользователем borus, 16 июн 2015.

  1. borus

    borus Активный пользователь

    С нами с:
    16 апр 2012
    Сообщения:
    161
    Симпатии:
    0
    Здравствуйте!

    Скрипт расширения выводит неправильно(а может браузер так воспринимает) названия товаров в <input>. Если в названии товара встречается двойная кавычка " то в инпуте отображается часть имени, идущая до первой кавычки. Если смотреть код элемента инструментами разработчика Хром, то видно что оставшаяся невидная часть названия товара интерпретируется как набор атрибутов элемента input.
    Если я подменяю вывод в коде с
    echo $this->product->product_name;
    на
    echo htmlentities($this->product->product_name);
    либо
    echo htmlspecialchars($this->product->product_name);
    то в первый раз после подмены при открытии карточки товара на редактирование в инпуте имя товара отображается вместе с кавычками. После нажатия кнопки Save в карточке товара название товара начинает отображаться с &#34; вместо кавычек.
    Если же в коде вывод наименования поставить следующий код:
    echo str_replace('"', "&qout;", $this->product->product_name);
    то после сохранения товара его имя в карточке отображается с &qout; в названии и повторное сохранение приводит к сохранению этих &qout; в имени и соответственно к отображению таких наименований на сайте.
    ! Правда если руками переписать эти &qout; на " и нажать Сохранить, проблем с кавычками не возникает больше, сколько бы данный товар ни сохранял потом.
    Посоветуйте, пожалуйста, в каком направлении надо копать(направление вывода, либо ввода в БД) и как копать :) , чтобы при открытии карточки товара кавычки отображались и адекватно сохранялись
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Подобная фигня гарантированно возникает когда программисты начинают совать предметы в неподходящие отверстия. Экранирование данных для БД и экранирование для странички это две абсолютно разные операции и делать их надо в верном контексте. Действие функций описано в официальной справке.
    ВСЁ ОЧЕНЬ ПРОСТО И НЕ НАДО ИЗОБРЕТАТЬ НИКАКИХ САМОДЕЛОК.

    • При записи в БД: mysql_real_escape_string (или аналог) либо подготовленные запросы с параметрами либо приведение к целому через intval() — выбор зависит от используемого интерфейса к БД и типа данных. Пожалуйста! Никаких стр-/прег-реплейсов!
    • При выводе на страницу: htmlentities или htmlspecialchars, выбор зависит от места применения. Пожалуйста! Никаких стр-/прег-реплейсов!

    Для удобства использования советую взять любую, блеать, авторитетную оболочку над БД, типа safemysql или один раз написать свою и больше НИКОГДА не экранировать данные "ручками" в прикладном коде. Пусть параметры обрабатывает интерфейсный класс: единообразно и скучно.

    То же самое с выводом HTML: любой, блеать, известный шаблонизатор имеет вывод с экранированием. Не экономьте микросекунды на этом, важнее правильный результат.
     
  3. borus

    borus Активный пользователь

    С нами с:
    16 апр 2012
    Сообщения:
    161
    Симпатии:
    0
    Спасибо. htmlentites внедрил.
    Когда начал копать, что происходит при записи в БД, то выяснил, что после строки вида:
    Код (Text):
    1. return filter_var_array($var, $filter);
    где в $filter сидит константа FILTER_SANITIZE_SPECIAL_CHARS(в отладчике имеет значение 515)
    все красивые кавычки превращаются в &#34;
    Получается надо тут в цикле ко всем элементам массива $var, в котором хранятся записываемые значения, применить функцию mysql_real_escape_string. Я правильно понял?