7

我正在使用 PHP 5.4.4,并且使用 FuelPHP ORM 保存和更新功能时出现了非常奇怪的行为。

我正在尝试将序列化或 JSON 数据保存到数据库中的字段中,例如{"name":"michael"}. 当我model->save()直接使用它时,Model::forge()它似乎 100% 的时间都可以正常工作,并且您看到的字符串是存储在 MySQL 数据库中的字符串。

但是,如果我立即更改诸如 model->property = 'new property' (不是 JSON 或序列化数据属性)之类的东西,然后再做另一个model->save(),它将 90% 的时间将我的全部"变为"

似乎当我调试问题并逐行执行时,它不会重现此问题!它将贯穿整个脚本,并且仍然具有正确的"而不是"

这个问题快把我逼疯了。我会假设它是一个配置问题,否则会有更多投诉,但我找不到合适的开关。我已经在我的 .htaccess 中设置了两者 php_flag magic_quotes_gpc Offphp_flag magic_quotes_runtime Off尽管在 PHP 5.4+ 中不需要它)并验证两者都是错误的。

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

4

3 回答 3

3

您的 ORM 可能使用某种转义函数来保存您的 json 字符串。这是防止 sql 注入攻击的安全功能。如果需要存储 json,请使用 MongoDB 或 CouchDB 等 noSql 解决方案。否则,您需要在它们从 mysql 出来之后和解码它们之前清理您的 json 字符串。

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

于 2012-11-06T15:58:05.367 回答
0

如果“在数据库中转换为”,那么它不是问题。它是为了安全。如果您在浏览器上呈现输出,它将再次显示为“。

如果您的浏览器显示“为”,那么您需要在打印前解码该值。

于 2012-11-06T11:53:22.130 回答
0

尝试添加一些“回声”语句来打印出你的变量,这样你就可以弄清楚它发生在哪里。这通常对找出原​​因大有帮助。

您也可以尝试为 html 实体添加类似 double_encode 的内容,以阻止它对其进行编码。

于 2012-10-02T23:13:53.533 回答