2013-06-15 4 views
4

원시 형식의 데이터베이스 테이블에 HTML 및 텍스트 데이터를 저장하고 있습니다. 그러나 올바르게 출력하려면 약간의 문제가 있습니다.MySQL에 HTML 저장

출력에
<p>Professional Freelance PHP & MySQL developer based in Manchester. 
<br />Providing an unbeatable service at a competitive price.</p> 

이 데이터 I가 수행 :

echo $row['details']; 

그리고이 I는 W3C 검증을 할 때 그것이라고 확인 정확하게 데이터를 출력한다 여기 테이블에 저장된 일부 샘플 데이터이고 :

character "&" is the first character of a delimiter but occurred as data 

그래서 나는 htmlemtitieshtmlspecialchars를 사용하여 시도하지만, 이것은 단지 페이지에 출력하는 HMTL 태그됩니다.

올바른 방법은 무엇입니까?

+5

나는 그것이 좋은 충고인지 모르겠지만 내가 당신이라면 나는 그것이 검증이 올바른 규칙/문서 타입 사용하고 있는지 확인 – bugwheels94

+1

무시했을 것 - XML은/XHTML은 HTML과 이스케이프하지 않습니다 &는 HTML의 해당 컨텍스트에서 * valid *입니다. 그러나 '&'은 항상 "안전 할 것"이므로 선호해야합니다. – user2246674

답변

10

& 대신 &amp;을 사용하십시오. 당신이 원하는 무엇

+0

이 문제를 해결하는 가장 간단한 방법입니다. 데이터는 어쨌든'HTML '입니다. –

+1

당신이 맞다고 생각합니다. HTML 데이터를 저장하고 있기 때문에 HTML 엔티티를 저장할만큼 안전해야합니다. – GSTAR

2

htmlentities은 기본적으로 htmlspecialchars의 상위 집합으로, 은 <>을 대체합니다. 사실

은 무엇을 당신이하려고하는 것은 잘못된 HTML 코드를 수정하는 것입니다, 나는이 임시 솔루션이 필요하다고 생각 :

$row['details'] = preg_replace("/&(?![#0-9a-z]+;)/i", "&amp;", $row['details']); 

이 완벽한 솔루션이 문자열 실패 할 것이기 때문에, 아니다를 예 : someone&son; (꼬리표 ; 포함)이지만 적어도 기존 HTML 항목을 손상시키지 않습니다.

그러나 데이터 저장 방법에 대한 결정권이있는 경우 데이터베이스에 저장된 HTML 코드가 올바른지 확인하십시오.

+3

이것은 유효한 html을 깨뜨릴 수 있습니다. '... & ...'과 같은 유효한 html을 가진 경우를 생각해보십시오.'... & amp; ...' – urraka

+0

오, 신경 쓰지 마라, 지금 공간을 추가했다;) – urraka

+0

그래,하지만 정규 표현식을 사용하면 더 좋게 만들 수 있다고 생각한다. – gd1

5

는 PHP는 그것은 HTML 엔티티로 입력을 변환합니다
기능 htmlentities() ... 등을 사용하는 것입니다 다음은이 HTML로 해석하고 HTML의 결과로 출력됩니다 출력됩니다. .. 예를 들어
:

$mything = "<b>BOLD & BOLD</b>"; 
//normally would throw an error if not converted... 
//lets convert!! 
$mynewthing = htmlentities($mything); 

이제 당신의 데이터베이스에 $mynewthing를 삽입!

0

내 프로젝트에서는 XSLT 파서를 사용하므로 &nbsp;&#160; (예 :)으로 변경해야했습니다. 그러나 이것은 내가 찾은 안전 방법 ... 여기

내 코드

$html = trim(addslashes(htmlspecialchars(
     html_entity_decode($_POST['html'], ENT_QUOTES, 'UTF-8'), 
     ENT_QUOTES, 'UTF-8' 
    ))); 

입니다 그리고 당신은 DB에서 읽을 때, (위해서 stripslashes를 사용하는 것을 잊지 마세요)입니다;

$html = stripslashes($mysq_row['html']);