2012-01-16 48 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