2012-08-23 29 views
7

我使用PHP 5.4.4和我得到与FuelPHP ORM保存和更新功能很奇怪的行为。FuelPHP更新导致",而不是“偶尔

我试图挽救要么序列化或JSON数据在数据库中的字段,以便像{"name":"michael"}。当我使用model->save()Model::forge()后直接似乎工作的时候,你看到的字符串罚款100%是获取存储在MySQL数据库的一个。

但是,如果我马上更改类似模型 - >属性=“新属性”(不是JSON或序列化的数据属性),然后做一套model->save()它将90%的时间把我所有的"变成"

看来,当我调试的问题,并通过线通过线步骤,它不会重现此问题!它将通过整个脚本并且仍然具有正确的"而不是"

这个问题让我发疯。我会认为它是一个配置的东西,或者会有更多的投诉,但我找不到合适的开关。我已经在我的.htaccess中设置了 php_flag magic_quotes_gpc Offphp_flag magic_quotes_runtime Off(虽然它不应该在PHP 5.4以上版本中使用)并验证它们都是错误的。

我在这里没有想法。任何要调查的东西都会很有帮助。

+0

似乎与输出过滤有关,我注意到了sendin g使用数据的通知电子邮件似乎是导致问题的原因,然后再次尝试从模型上的某个函数通过它所做的视图访问该字段。 – michael

+0

如果你没有更多的想法,安装xdebug,遵循伪造和保存...魔术引号与编码引号到html无关,它不存在于5.4无论如何(即使是你的系统是依靠他们现在它走了),还有就是在你的ORM一些设置转化这个值 – fd8s0

+1

这不是从你的问题*清晰此时*您意识到'“'已经变成'"'。如果由Fuelphp之后,你应该扫描该字符串的所有文件 – hakre

回答

0

尝试加入一些“回声”报表打印出你的变量,这样就可以揣摩出它的发生。这通常会发现原因。

您也可以尝试添加类似double_encode为HTML实体从编码它们停止。

0

如果“在数据库中被转换为"那么它不是问题,它的安全性如果你在浏览器上渲染输出,它会再次出现”。

而且如果你的浏览器中显示“为",那么你需要在打印前值进行解码。

3

你的ORM可能使用某种逃生功能,以节省您的JSON字符串。这是一项安全功能,以防止SQL注入攻击。如果你需要JSON存储使用的NoSQL解决方案,如MongoDB的或CouchDB的。否则,你将需要清理你的JSON字符串后,他们出来的MySQL之前,你对它们进行解码。

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

+0

我不认为“*使用不同的数据库*”是这里的正确答案,很可能您正在运行[fuelphp的视图过滤](http://fuelphp.com/docs/ general/views.html#/ security)。使用'$ view-> set_safe('var',$ value)'来绕过这个问题。** ProTip ** - 您还可以使用orm的配置使用'data_type ='json''和Observers自动解码/编码json:http://fuelphp.com/docs/packages/orm/observers/included.html#/os_typing – iturgeon