как сохранить объект модели json в базу данных php mysql

это мой первый пост, так что если я что-то пропустил, наберитесь терпения :).

я использую библиотеку go-debug.js из GoJS для создания некоторых диаграмм в браузере, но я работаю проблема с возможностью сохранения. Эта диаграмма создает объект JavaScript, который вы можете преобразовать в Json и передать в базу данных с помощью этой команды myDiagram.model.toJson() . Я хочу, когда я нажимаю кнопку сохранения, чтобы сохранить диаграмму с помощью метода Ajax в PhP, а затем в базу данных mySQL.

Спасибо за помощь!

вот мой скрипт сохранения, но я не могу понять, почему он не работает.

  window.onload = function(){


jQuery(document).ready(function(){
    $.ajax({
    type: 'POST',
    contentType: "application/json; charset=utf-8",
    url: 'savemodel.php',
    data: {json: JSON.stringify(modelJson)},
    dataType: 'json'
})

.done( function( data ) {
    console.log('done');
    console.log(data);
})
.fail( function( data ) {
    console.log('fail');
    console.log(data);
})
});

    //return modelJson;



  }
  function load() {
    myDiagram.model = go.Model.fromJson(document.getElementById("mySavedModel").value);
    // loadDiagramProperties gets called later, upon the "InitialLayoutCompleted" DiagramEvent
  }


  function loadDiagramProperties(e) {
    var pos = myDiagram.model.modelData.position;
    if (pos) myDiagram.position = go.Point.parse(pos);
  }



  }

и мой php-код:

      <?php 

header('Content-Type: application/json');
include 'config.php';
session_start();
error_reporting(E_ALL);
ini_set('display_errors', 1);

$session_id=$_SESSION['sess_user_id']; // User session id

$modelJson = $_POST['json'];




$sql = "INSERT INTO c_map 
       (ref_num, members_id, title, description, ingredients) 
        VALUES (NULL, '$session_id', 'title', 'description',
        '".mysql_real_escape_string($modelJson)."');";


mysqli_query($connection, $sql);





?>

например. Результат команды myDiagram.model.toJson(); которая представляет собой древовидную диаграмму с 2 дочерними элементами, будет выглядеть так:

{ "class": "go.GraphLinksModel",
  "modelData": {"position":"-545.114064532096 -44.69966023522102"},
  "nodeDataArray": [ 
{"key":"Alpha"},
{"key":"N"},
{"key":"N2"}
 ],
  "linkDataArray": [ 
{"from":"Alpha", "to":"N"},
{"from":"Alpha", "to":"N2"}
 ]}

Я цитирую документацию по сохранению модели с сайта GoJs:

GoJS не требует от вас сохранения моделей на каком-либо конкретном носителе или в каком-либо формате. Но поскольку это JavaScript, а JSON — самый популярный формат обмена данными, мы упрощаем написание и чтение моделей в виде текста в формате JSON.

Просто вызовите Model.toJson, чтобы сгенерировать строку, представляющую вашу модель. Вызовите статический метод Model.fromJson, чтобы построить и инициализировать модель с учетом строки, созданной Model.toJson. Многие примеры демонстрируют это — ищите функции JavaScript с именами «сохранить» и «загрузить». Большинство этих функций записывают и читают TextArea на самой странице, чтобы вы могли видеть и изменять текст JSON, а затем загружать его для получения новой диаграммы. Но будьте осторожны при редактировании, потому что синтаксис JSON очень строг, и любые синтаксические ошибки приведут к сбою этих «загрузочных» функций.

Текст в формате JSON имеет строгие ограничения на типы данных, которые вы можете представить без дополнительных предположений. Чтобы сохранять и загружать любые свойства данных, которые вы установили для данных узла (или данных ссылки), они должны соответствовать следующим требованиям:

свойство является перечислимым, и его имя не начинается с подчеркивания (вы можете использовать имена свойств, которые начинаются с подчеркивания, но они не будут сохранены) значение свойства не является неопределенным и не является функцией (JSON не может точно хранить функции) модель знает, как преобразовать значение свойства в формат JSON (числа, строки, массивы JavaScript или простые объекты JavaScript) значения свойств, которые являются объектами или массивами, образуют древовидную структуру — без общих или циклических ссылок Model.toJson и Model .fromJson также будет обрабатывать экземпляры кистей Point, Size, Rect, Spot, Margin, Geometry и non-pattern. Однако мы рекомендуем хранить эти объекты в их строковых представлениях, используя статические функции синтаксического анализа и строковой обработки этих классов.

Поскольку вы используете JavaScript, вам несложно добавить свойства данных к данным вашего узла. Это позволяет вам связать любую информацию, которая вам нужна, с каждым узлом. Но если вам нужно связать с моделью какую-то информацию, которая будет присутствовать даже при отсутствии данных узла вообще, вы можете добавить свойства в объект Model.modelData. Свойства этого объекта будут записаны Model.toJson и прочитаны Model.fromJson, точно так же, как записываются и считываются объекты данных узла.


person Steven    schedule 19.01.2015    source источник
comment
Похоже, вы просто укорачиваете буквальное значение "modelJson", тогда как я полагаю, вы хотели преобразовать значение модели в строку из своего приложения?   -  person RobV    schedule 19.01.2015
comment
Я не знаю, нужно ли его жалеть, и если да, то передать его на php   -  person Steven    schedule 19.01.2015
comment
Если у вас есть дополнительные сведения для добавления к вашему вопросу, используйте ссылку edit под вашим вопросом, комментарии не являются хорошим форматом для добавления дополнительного кода.   -  person RobV    schedule 19.01.2015


Ответы (1)


Вам не нужно json_decode этот JSON, потому что он становится объектом.
Удалите эту часть:

$directions = json_decode($_POST['json']);
var_dump(directions); // here's an error btw

И измените его на это:

$directions = $_POST['json'];

Затем просто сохраните его в текстовом режиме.
Не забудьте экранировать его:

$sql = "INSERT INTO c_map 
       (ref_num, members_id, title, description, ingredients) 
        VALUES (NULL, '$session_id', 'title', 'description',
        '".mysql_real_escape_string($directions)."');";
person Oleg Dubas    schedule 19.01.2015
comment
хорошо, но откуда php знает, что это $directions = $_POST['json']; исходит из поста ajax? - person Steven; 19.01.2015
comment
что ты имеешь в виду? Это не так. Если вас беспокоит безопасность, возможно, вам придется добавить еще несколько переменных и т. д. Я полагаю, это другая тема. - person Oleg Dubas; 19.01.2015
comment
ну, я изменил его, но он все еще не работает. Как я могу увидеть ошибки этого? Это новый php-код: $modelJson = $_POST['json']; $modelJson=$str_json; //$ingred=$_POST['modelJson']; $sql = "INSERT INTO c_map (ref_num, members_id, title, description, ingredients) VALUES (NULL, '$session_id', 'title', 'description', '".mysql_real_escape_string($modelJson)."');"; mysqli_query($connection, $sql); - person Steven; 19.01.2015
comment
ну нет смысла. Посмотрите, что вы сделали: $modelJson = $_POST['json']; $modelJson=$str_json; . Переменная перезаписывается - person Oleg Dubas; 19.01.2015
comment
упс, правильно.. я удалил `$modelJson=$str_json; `, но в db по-прежнему ничего не отображается. Могу ли я каким-то образом увидеть ошибки PhP? Я имею в виду, как я могу быть уверен, что моя логика php-кода работает... :/ Приведенные ниже команды также не работают error_reporting(E_ALL); ini_set('display_errors', 1); Спасибо за помощь - person Steven; 19.01.2015
comment
Проверьте журналы веб-сервера на наличие сообщений об ошибках. Они всегда есть, даже если они скрыты в браузере. Пожалуйста, выберите ответ, если он помог - person Oleg Dubas; 20.01.2015
comment
я не уверен, в чем проблема... моя консоль отладки говорит Uncaught TypeError: undefined is not a functionmain-js.js:185 (anonymous function)jquery.min.js:16 f.resolveWithjquery.min.js:16 f.donejquery.min.js:16 d.fn.d.readymain-js.js:184 save Также я процитировал документацию библиотеки GoJs в описании. - person Steven; 20.01.2015
comment
Если не можете дать ссылку, сделайте хотя бы скриншот кода и вставьте сюда - person Oleg Dubas; 20.01.2015
comment
хорошо, я решаю это. Проблема заключалась в конфликте с переменной $. я использовал Jquery вместо $. Спасибо за вашу помощь в любом случае. - person Steven; 20.01.2015