mysql игнорирует » при вставке json

#javascript #php #mysql #json

#javascript #php #mysql #json

Вопрос:

я должен хранить содержимое html в базе данных как json вместе с другими данными. когда я получаю определенные данные html в javascript, я переношу их в объект вместе с другими данными и преобразую его в строку json, которая применяет escape «, что позволяет избежать любых конфликтов. когда я передаю данные с помощью AJAX в php и вставляю их в MYSQL, в таблице базы данных нет выхода » и поэтому, когда я считываю данные и пытаюсь десериализовать, он выдает ошибку из-за недопустимого json (как на php, так и на js)/

когда я конвертирую в json с помощью js, у меня есть что-то вроде

 {"cat":"education-content","id":"45a93325-2bab-4296-cc8d-92e7994dabe0","contents":"<p><span style="background-color: rgb(224, 62, 45);" data-mce-style="background-color: #e03e2d;">شستنیتشنسذیت سشای تشس ایتنشسا تینشاسنتیاستشن ایتنشس ایتنش</span></p><p><span style="color: rgb(22, 145, 121);" data-mce-style="color: #169179;">شتسنیاتشسایتنشساتینشساتیناشس یاشست نیاتنشس </span></p><p><span style="font-size: 14pt;" data-mce-style="font-size: 14pt;"><strong>سشیتاشتنسیاش</strong></span></p><p><br data-mce-bogus="1"></p>"}
 

но в таблице базы данных он хранится как

 {"cat":"education-content","id":"45a93325-2bab-4296-cc8d-92e7994dabe0","contents":"<p><span style="background-color: rgb(224, 62, 45);" data-mce-style="background-color: #e03e2d;">شستنیتشنسذیت سشای تشس ایتنشسا تینشاسنتیاستشن ایتنشس ایتنش</span></p><p><span style="color: rgb(22, 145, 121);" data-mce-style="color: #169179;">شتسنیاتشسایتنشساتینشساتیناشس یاشست نیاتنشس </span></p><p><span style="font-size: 14pt;" data-mce-style="font-size: 14pt;"><strong>سشیتاشتنسیاش</strong></span></p><p><br data-mce-bogus="1"></p>"}
 

этот json генерируется jquery как

  var education_obj={
            cat : cat,
            id : id,
            contents : contents

        };


        var item_wrapp_json = JSON.stringify(education_obj);
 

который передается ajax. я проверил json в последний момент вставки в php, и все в порядке.

РЕДАКТИРОВАТЬ: php-код, который вставляет элементы.

 $citems_query = "INSERT INTO `course_items_tbl`(`CIID`, `CSFK`, `CFK`, `CIORDER`, `CIOPTIONS`) VALUES ";

       

        foreach($data_obj["courseSections"] as $item){


            $sectionID = $item["section_id"];
            $sectionName = $item["section_name"];
            $sectionType = $item["section_type"];



            //$item["section_questions"] this is the json string from js
            foreach($item["section_questions"] as $qitem){

                

                $test = $qitem;

                
                

                
                $citems_query .= "('".$qid."','".$sectionID."','".$course_id."', ". $qorder ." , '".$qitem."' ),";
                
                $qorder  ;
            }
 

Комментарии:

1. Покажите PHP-код, взаимодействующий с базой данных. Используете ли вы параметризованные запросы? Вероятно, вы этого не делаете, и это проблематично несколькими способами. Это также может объяснить вашу текущую проблему, так как также является escape-символом в MySQL.

2. я отредактировал свой вопрос… а также удалите некоторый код, который является бессмысленным для этого способа, чтобы избежать путаницы. я генерирую запрос, за которым следует итерация для каждого элемента, который нужно вставить, чтобы получить запрос с несколькими наборами значений

3. Да, это именно то, что я подумал, вы используете конкатенацию строк для получения значений в запросе. Это нехорошо, поскольку может привести к забавным результатам (например, к проблеме, которая у вас есть) и делает программу уязвимой для атак SQL-инъекций. Перепишите его, чтобы использовать параметризованные запросы.

4. В MySQL символ shash является символом кавычек по умолчанию. Если вы хотите использовать его как обычный, вы должны либо заключить его в кавычки (т. Е. Удвоить), либо определить другой символ кавычек (ESCAPE-символ) в операторе (если оператор поддерживает).

Ответ №1:

Просто используйте addslashes() для экранирования кавычек, прежде чем вставлять их в базу данных. При извлечении вы можете использовать stripslashes() функцию извлечения исходной строки.

Комментарии:

1. это также работает для добавления addslashes() перед вставкой, однако решение @sticky bit более элегантно