2011-08-19 4 views
0

질문과 대답이있는 MySQL 데이터베이스가 HTML 단락과 버튼으로 표시되어 있습니다. q &에는 é, ..., ', ", ö와 같은 특수 문자가 많이 포함되어 있습니다.mysql 데이터베이스의 특수 문자

mysqli_real_escape_string, htmlentities 및 백 슬래시를 추가했지만 일부 문자는 항상 잘못 표시됩니다. 페이지에서 가끔 문단에서 올바르지 만 버튼에는 맞지 않습니다.

이러한 특수 문자를 올바르게 표시하는 데 사용할 올바른 기능은 무엇이며 언제 사용해야합니까? (데이터베이스에 삽입하거나 데이터베이스/HTML로 만들기

많은 감사

답변

2

문자 집합 및 정렬이 다른 사람이 언급 한 것처럼

, 당신의 문제 중 하나는 문자 집합 및 정렬까지 될 수 있습니다. 사용중인 문자를 처리 할 수 ​​있도록 전체 체인 (입력, 저장 및 출력)이 올바르게 구성되어 있는지 확인해야합니다. UTF-8은 유니 코드 문자 집합의 모든 문자를 처리 할 수 ​​있으므로 종종 좋은 선택입니다.

대소 문자를 구분 데이터 정렬로 UTF-8을 사용하여 MySQL 데이터베이스 또는 테이블을 만들려면

CREATE DATABASE mydb 
    DEFAULT CHARACTER SET utf8 
    DEFAULT COLLATE utf8_general_ci; 

CREATE TABLE mytable (...) 
    DEFAULT CHARACTER SET utf8 
    DEFAULT COLLATE utf8_general_ci; 

는 데 사용됩니다 (난 당신이 PHP를 사용하고 있으리라 믿고있어)

mysql_real_escape_string 탈출 MySQL 파서가 매개 변수와 SQL 키워드를 구분할 수 있도록 도와줍니다. 백 슬래시는 MySQL은 문자열의 중간에 따옴표가 사실 중간에 문자 따옴표는 것을 이해하는 데 도움이 필요합니다

INSERT INTO mytable VALUES ("this \" is a double quote"); 

: 전체 SQL 명령을 하나의 문자열로 공급 될 때 사용됩니다 닫는 큰 따옴표가 아니라 문자열의.

데이터를 데이터베이스에 삽입하기 전에 이스케이프 처리하면 데이터를 직접 변경합니다. 더 이상 원래 데이터를 저장하지 않으므로 데이터베이스에서 데이터를 검색 할 때 다시 처리해야합니다 (이스케이프 취소 그것). 당신과 MySQL의 모두, 대신 prepared statements을 사용할 수 있습니다에 대한

준비된 문

은 일을 더 쉽게 확인하십시오.준비된 문은 정확히 SQL 문 부분이있는 당신의 매개 변수를 MySQL의를 표시하는 자리 표시자를 사용

$stmt = $dbh->prepare("INSERT INTO mytable VALUES (?)"); 
$stmt->execute(array('this " is a double quote')); 

준비된 문을 사용하면 수정되지 않은 데이터베이스에 데이터를 삽입 할 수 있습니다 - 더 지저분한 이스케이프가 필요하지 않습니다. 이것은 SQL 주입의 가능성을 현저히 감소시키는 추가 장점을 가지고 있습니다. 이 주제에 대한 자세한 내용은 Bill Karwin's는 SQL 주입 신화와 착오talkslides를 참조하십시오.

출력 이제 데이터가 원래의 형식으로 저장됩니다, 당신은 그러나 당신이 원하는 출력에 무료입니다. 리터럴 HTML로 표시되도록 HTML을 출력하는 경우 출력하기 전에 이스케이프 처리해야합니다. 이를 수행하는 방법에는 여러 가지가 있습니다 (예 : htmlspecialcharsHTML Purifier). 어떤 방법을 선택할지는 데이터 원본과 표시 방법에 따라 다릅니다.

+0

mysql_real_escape_string은 작은 따옴표 문제를 해결합니다. 모든 큰 따옴표를 작은 따옴표로 바꿀 수 있습니다. 이것은 단추 값이 HTML 코드로 표시되는 문제 만 남겨 둡니다 (예 : 단추에 위 첨자 문자를 사용하고 싶습니다). 그러나 이것에 대한 해결책이 없을 수도 있습니다. 모든 도움에 많은 감사드립니다! – Fred

+0

@Fred : IMO mysql_real_escape_string은 prepared statement가 대신 사용 가능할 때 피해야하는 불쾌한 해킹입니다. 단추 값에 대한 자세한 정보를 포함하도록 질문을 업데이트 할 수 있습니까? – Mike

+0

준비된 문장은 좋은 생각처럼 들리지만 저는 이것에 대해 매우 익숙하며 사용법을 이해하지 못합니다. mysql insert에 무엇을 추가해야합니까? 버튼 값과 관련하여 4 개의 버튼으로 4 개의 대안을 표시하는 객관식 퀴즈가 있습니다. 예를 들어 나는 접두어 zetta의 요소를 묻고 버튼 중 하나는 sup 태그 안에 10과 21을 표시해야합니다 (물론 태그 자체가 표시되기를 원하지 않습니다. – Fred

0

데이터베이스 인코딩과 페이지 인코딩이 UTF-8인지 확인하면 대부분의 작업에 도움이됩니다.

0

문제가 사용중인 문자 세트에 있다고 생각됩니다. mysql 데이터 정렬은 사용하려는 문자를 지원해야하며 웹 페이지는 일치하는 문자 집합에 있어야합니다.

웹 사이트가 UTF-8로 표시되는 동안 MySQL 데이터베이스는 latin1_general_ci와 같은 데이터 정렬을 사용하고있을 가능성이 큽니다. UTF-8로 데이터를 저장하도록 MySQL을 설정하고 웹 페이지에 UTF-8이라는 헤더를 출력해야합니다.

+0

html로 말한다 및 데이터베이스 데이터 정렬이 utf8_general_ci입니다. 이거 괜찮아? 이러한 설정과 특수 문자에 대한 PHP 함수를 사용하지 않고 단락은 괜찮아 보이지만 큰 따옴표 안에있는 버튼 텍스트는 표시되지 않고 HTML 태그는 그대로 출력됩니다 (사용자 출력에 표시되지 않음). 또한 데이터베이스에 삽입하려면 모든 단일 인용 부호 (많은 이름에서 필요)를 제거해야합니다. – Fred

+0

는 오히려 작은 따옴표를 제거하는 것보다 일반적으로, 당신이 정말로 원하는 것은 데이터를 삽입 할 준비된 문을 사용하는 것입니다 (예를 들어 문 ') (주석 값에 삽입?,?,?'와 같은 뭔가해야하며 값은 바운드 될 것입니다 데이터베이스 라이브러리. – asc99c

+0

죄송 추가하는 것을 잊었다, 문자 세트. 나는 브라우저가 정말 UTF-8 보는 것을 (방화범 같은에서) 확인을 두 배로 것 잘보세요. 우리는 한 지점의 밖으로 응용 프로그램에서 문제가 있었다 아파치 헤더는 ISO-8859-1, 우리의 메타 태그 동안 UTF-8. – asc99c