За последние 24 часа нас посетил 15791 программист и 1541 робот. Сейчас ищут 714 программистов ...

Проблема с кавычками в PHP\SQL, экранирование

Тема в разделе "PHP для новичков", создана пользователем V2oD2o, 4 июл 2016.

  1. V2oD2o

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

    С нами с:
    19 янв 2011
    Сообщения:
    23
    Симпатии:
    0
    Всем привет!

    История такая, был в отпуске - на работе образовалась проблема: Сайт из 1С подгружает товары, у товаров есть соответственно артикулы, менеджеры решили ввести номенклатуру с содержанием слеша.. итого из 1С приходит например артикул "158158\", что соотвтественно пишется в SQL - а php переварить этого не может по понятным причинам.

    пробовал str_replace("\\", "\\\\", $request) - нулевой результат, пробовал htmlspecialchars - нулевой результат, пробовал realescapestring - тоже нулевой результат.

    т.е. выполнить запрос - невозможно
    "INSERT INTO `products` (`id`, `art`) VALUES ('', '1111111\')"
    "INSERT INTO `products` (`id`, `art`) VALUES ('', '1111111\\')"

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1111111\')' at line 1


    Кто то сталкивался?
     
    #1 V2oD2o, 4 июл 2016
    Последнее редактирование: 4 июл 2016
  2. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Из 1С приходит не правильный SQL запрос.
    Покажи реальные запросы, потому как очень странные примеры и похоже в них экранирование работает в случайном порядке.
     
  3. V2oD2o

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

    С нами с:
    19 янв 2011
    Сообщения:
    23
    Симпатии:
    0
    Так вот я скинул, запрос я формирую, из 1с приходит массив через soap
     
  4. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    как? покажи пример формирования который можно будет запустить и посмотреть
     
  5. V2oD2o

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

    С нами с:
    19 янв 2011
    Сообщения:
    23
    Симпатии:
    0
    Не знаю успел прочитать нет?

    форум глюкнуло, он каждое мое добавление в новом посте выдал) удалил первое сообщение - исчезли все посты с quote)

    вобщем работает только $query="INSERT INTO `products` (`id`, `art`) VALUES ('', '1111111\\\')";
    т.е. спецсимвол \\ в php это как одинарная \, а \' внутри двойных кавычек это и есть \' в php, а в mysql попадает как \\' - т.е. \\ это для mysql как одинарная \, вот такие пироги.

    придется жестить вроде str_replace("\\", "\\\\\\", $value['art']);
     
  6. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Не вижу код который формирует не правильный SQL запрос, похоже, что загвоздка в нём
     
  7. V2oD2o

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

    С нами с:
    19 янв 2011
    Сообщения:
    23
    Симпатии:
    0
    Да причем тут он? приходит массив, в нем артикул "111111\", формируется запрос, выполняется запрос

    вопрос тут лишь в том как записать в базу артикул 111111\ и все, больше ни в чем)
     
  8. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Используй подготовленные запросы тогда или экранируй методом, real escape string из MySQLi или quote из PDO.
     
  9. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Значит артикул подставляется в запрос без правильной предварительной обработки. Поэтому и просят этот код. Ответ @denis01 уже дал верный - подготовленные запросы или экранирование.