2015-05-01 6 views
0

My MySQL database has some fields that sometimes include an apostrophe, so I take care to encode html entities. For example "Cote d'Or" is stored in the database as "Cote d&039;Or".Html лица в <a href=

When a MySQL query populates an href I get something like this in my source code.

<a href="/page.php?location=Cote d&039;Or">Text link</a> 

However when I click on the link I get a 403 "Forbidden" error. On checking, hovering on the link says it is reading &039; as an apostrophe. That seems to be the cause of the page error as putting an apostrophe in the database produces the same error and having nothing in there works correctly.

My question now is, how can I have the html entity in the database and still get the link to work correctly?

ответ

0

Хотя не лучший подход, так как вы используете htmlentities() вы можете использовать html_entity_decode()

От: http://php.net/html_entity_decode

html_entity_decode() является противоположностью htmlentities() в что он преобразует все объекты HTML в строку в соответствующие символы.

2

Для URL-адресов вы не хотите использовать htmlentities(), так как это отображает HTML.

Вместо этого, вы хотите использовать urlencode():

$link = '/page.php?location=' . urlencode($location); 

Если данные уже HTML закодированы, вам необходимо декодировать его, прежде чем передать его через urlencode(). Хорошая функция для этого html_entity_decode():

$location = html_entity_decode($row['location']); 
$link = '/page.php?location=' . urlencode($location); 
+0

Хотя 'urlencode()' является правильным способом представления специальных символов в URL-адресах, при посылке их в HTML по-прежнему требуется вызов 'htmlspecialchars()' или 'htmlentities()'. Правильный способ сделать это: '$ link = '/page.php?location='. htmlspecialchars (UrlEncode ($ место)); ' – axiac

0

Ну, получается, что реальная проблема не в HTML сущности. Это были некоторые вещи безопасности, написанные в Apache. Спокойное слово с моей хостинговой компанией, и они сделали что-то, что заставило все работать (предположительно, удалило правило mod_security).

Мораль истории: если вы получаете ошибку 403, сначала убедитесь в безопасности Apache.

Спасибо ребятам, которые дали ответы.