2012-01-16 90 views
0

我正在研究一个涉及修改一些现有代码的项目,并且存在一种对我来说毫无意义的行为。我希望有人看到类似的东西,因此可以提供一些有关问题源于何处的见解。HTML实体转换非常奇怪

最好的简短的例子,我可以给如下:

A user enters "This & that" into a textarea on an input form and when saved 
once it becomes: "This & that", when it is saved again it becomes: 
"This & that", save it again and you get: 
"This & that". 

显然问题继续与各保存变得更糟。实际存储在数据库(MySQL)中的数据是上面显示的文本,前端没有用于转换字符/实体的过滤器。很明显,如果他们被正确存储,它会很容易打电话给htmlspecialchars_decode()但这不是一个选项呢...

是否有一些前端检查,我可以做,看看哪里符号正在被破坏?我正在查看处理数据的控制器,它使用休息事件来做这件事,但是我没有看到任何可以尝试转换HTML实体的东西,更不用说将不正确地转换它们的东西了。

正如我在介绍中所说的那样,我希望有人可能以前见过这个,并且可以帮助查明它可能发生的位置。这是使用PHP(Protean,MVC框架),Propel,patforms/smarty在后台,MySQL(通过PDO)在后端,jQuery为大多数JS相关的东西。

+1

您究竟如何存储数据并将其重新填充到文本输入中?这实际上与Smarty有什么关系,或者这个标签对这个问题毫无意义? – 2012-01-16 22:19:26

+0

使用休息事件(存储发布数据)存储数据,然后smarty仅输出数据库中的内容。由于垃圾编码在数据库中,所以在数据被保存时发生的问题绝对是一个问题。 – 2012-01-16 22:23:32

+0

奇怪的是,如果我输出表单处理程序正在处理的内容“This&that”。变成“这&那。”这很棒,但数据库显示“This & amp; that。” - >这听起来像是发生在数据库级别吗? – 2012-01-16 22:26:14

回答

0

我讨厌在这里回答我自己的问题,但它实际上是埋在框架中的一个集合方法的双产品,导致了双重编码。我改变了一点数据流,现在一切都被正确存储了,现在我可以在输出周围抛出一个htmlspecialchars_decode(),并且生活很好。

感谢大家的建议!

- N

0

您的数据是htmlentities()太多次了。这是一种常见的,无意义的错误,通常涉及在发送到数据库之前对数据进行urlen编码,并在检索时再次对其进行编码。一旦(输出)就足够了。你不应该编码它进去。

+0

这是'htmlentities()',而不是'urlencode()'。 – 2012-01-17 01:54:40

+0

谢谢。这就是我输入得太快= P – Kenaniah 2012-01-17 17:30:55

+0

我同意,编码进入之前是非常不必要的,并导致类似这样的问题。我可以保证这不会被输出解码,所以问题更大。我希望那些曾经使用过这种框架/ etc的组合的人曾经看到过这种情况,也许是Propel PDO的本地特性。我仍在挖掘,希望能尽快解决。 – 2012-01-17 18:03:22