FuelPHP ORM更新结果时偶尔出现"而不是"

7
我正在使用PHP 5.4.4,使用FuelPHP ORM的save和update函数时出现了非常奇怪的行为。我尝试将序列化或JSON数据保存到数据库中的字段中,例如{"name":"michael"}。当我在Model::forge()之后直接使用model->save()时,它似乎总是正常工作,你可以看到存储在MySQL db中的字符串。

然而,如果我立即更改model->property = 'new property'(不是JSON或序列化数据属性),然后再进行另一个model->save(),90%的情况下会将所有的"转换成"。
当我逐行调试并逐行查看该问题时,它似乎不会再次出现!它将通过整个脚本,并仍然具有正确的"而不是"。
这个问题让我疯狂。我认为这是配置问题,否则会有更多的投诉,但我找不到正确的开关。我已经在我的.htaccess中设置了php_flag magic_quotes_gpc Off和php_flag magic_quotes_runtime Off(虽然在PHP 5.4+中不需要),并验证了两者都为false。
我没有更多的想法。任何值得调查的事情都将非常有帮助。

似乎与输出过滤有关。我注意到发送使用数据的通知电子邮件似乎会导致问题,如果我尝试通过视图从模型上的函数访问该字段,则会再次出现此问题。 - michael
如果您没有更多的想法,请安装xdebug,遵循锻炼并保存... 魔术引号与将引号编码为html无关,在5.4中也不存在(即使您的系统依赖它们,现在已经消失了),您的ORM中有一些设置可以转换这些值。 - fd8s0
1
从你的问题中不清楚在哪个时刻你意识到"已经变成了"。如果这是由Fuelphp完成的,那么你应该扫描所有文件以查找该字符串。 - hakre
3个回答

3
你的ORM可能使用某种转义函数来保存你的json字符串。这是一种安全特性,用于防止SQL注入攻击。如果你需要存储json,则应该使用NoSQL解决方案,如MongoDB或CouchDB。否则,在解码之前,你需要清理mysql中的json字符串。

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


我认为“使用不同的数据库”不是正确的答案。很可能你遇到了fuelphp的视图过滤。使用$view->set_safe('var', $value)来解决这个问题。专业提示 - 你也可以使用ORM的配置自动解码/编码json,使用data_type = 'json'和观察者:http://fuelphp.com/docs/packages/orm/observers/included.html#/os_typing - iturgeon

0
如果数据库中的“被转换为“,那么这不是问题。这是为了安全起见。如果您在浏览器上呈现输出,它将再次显示为“。而且,如果您的浏览器将“显示为“,则需要在打印之前对该值进行解码。

0

尝试添加一些“echo”语句以打印出您的变量,以便您可以找出发生了什么。这通常有助于找出原因。

您还可以尝试添加类似于double_encode的内容,以停止对HTML实体进行编码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接