Результат обновления ORM FuelPHP вместо «спорадически

Я использую PHP 5.4.4, и у меня очень странное поведение с функциями сохранения и обновления ORM FuelPHP.

Я пытаюсь сохранить либо сериализованные данные, либо данные JSON в поле базы данных, поэтому что-то вроде {"name":"michael"}. Когда я использую model->save() сразу после Model::forge(), он работает нормально в 100% случаев, и строка, которую вы видите, — это та, которая сохраняется в базе данных MySQL.

Однако, если я немедленно изменю что-то вроде model->property = 'new property' (не свойство JSON или сериализованных данных), а затем сделаю еще одно model->save(), это в 90% случаев превратит все мои " в "

Кажется, что когда я отлаживаю проблему и выполняю ее построчно, она не воспроизводит эту проблему! Он пройдет через весь сценарий и по-прежнему будет иметь правильный " вместо "

Эта проблема сводит меня с ума. Я бы предположил, что это проблема конфигурации, иначе было бы гораздо больше жалоб, но я не могу найти правильный переключатель. Я установил как php_flag magic_quotes_gpc Off, так и php_flag magic_quotes_runtime Off в своем .htaccess (хотя это не нужно в PHP 5.4+) и убедился, что оба они ложны.

У меня нет идей. Все, что нужно исследовать, было бы действительно полезно.


person michael    schedule 23.08.2012    source источник
comment
Кажется, это связано с выходной фильтрацией. Я заметил, что отправка электронного письма с уведомлением, в котором использовались данные, по-видимому, вызывала проблему, а затем снова, если я пытаюсь получить доступ к этому полю из функции в модели через представление, оно делает это.   -  person michael    schedule 23.08.2012
comment
если у вас больше нет идей, установите xdebug, следуйте за форжем и сохраните... магические кавычки не имеют ничего общего с кодированием кавычек в html, и их все равно нет в 5.4 (даже если ваша система полагалась на них и теперь его нет), в вашем ORM есть некоторая настройка, преобразующая эти значения   -  person fd8s0    schedule 22.09.2012
comment
Из вашего вопроса неясно, в какой момент вы понимаете, что " превратилось в ". Если это делает Fuelphp, вы должны сканировать все файлы на наличие этой строки.   -  person hakre    schedule 01.10.2012


Ответы (3)


Ваш ORM может использовать какую-то функцию escape для сохранения вашей строки json. Это функция безопасности для предотвращения атак SQL-инъекций. Используйте решения noSql, такие как MongoDB или CouchDB, если вам нужно хранить json. В противном случае вам нужно будет очистить ваши строки json после того, как они выйдут из mysql, и перед тем, как вы их декодируете.

http://dev.mysql.com/doc/refman/5.0/en/string-literals.html

person atorres757    schedule 06.11.2012
comment
Я не думаю, что использовать другую базу данных — правильный ответ. Скорее всего, вы столкнулись с фильтрацией представлений вfuelphp. Используйте $view->set_safe('var', $value), чтобы обойти эту проблему. Подсказка: вы также можете автоматически декодировать/кодировать json, используя конфигурацию формы, используя data_type = 'json' и Observers: fuelphp.com/docs/packages/orm/observers/included.html#/ - person iturgeon; 03.11.2013

Попробуйте добавить несколько операторов «эхо», чтобы распечатать ваши переменные, чтобы вы могли понять, где это происходит. Это обычно проходит долгий путь к выяснению причин.

Вы также можете попробовать добавить что-то вроде double_encode для объектов html, чтобы они не кодировались.

person RecentCoin    schedule 02.10.2012

если " преобразуются в базу данных, то это не проблема. Это для безопасности. Если вы отобразите вывод в браузере, он снова появится как ".

И если ваш браузер отображает "как тогда, вам нужно декодировать значение перед печатью.

person user1635914    schedule 06.11.2012