문자 집합 및 정렬이 다른 사람이 언급 한 것처럼
, 당신의 문제 중 하나는 문자 집합 및 정렬까지 될 수 있습니다. 사용중인 문자를 처리 할 수 있도록 전체 체인 (입력, 저장 및 출력)이 올바르게 구성되어 있는지 확인해야합니다. 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 주입 신화와 착오talk 및 slides를 참조하십시오.
출력 이제 데이터가 원래의 형식으로 저장됩니다, 당신은 그러나 당신이 원하는 출력에 무료입니다. 리터럴 HTML로 표시되도록 HTML을 출력하는 경우 출력하기 전에 이스케이프 처리해야합니다. 이를 수행하는 방법에는 여러 가지가 있습니다 (예 : htmlspecialchars 및 HTML Purifier). 어떤 방법을 선택할지는 데이터 원본과 표시 방법에 따라 다릅니다.
mysql_real_escape_string은 작은 따옴표 문제를 해결합니다. 모든 큰 따옴표를 작은 따옴표로 바꿀 수 있습니다. 이것은 단추 값이 HTML 코드로 표시되는 문제 만 남겨 둡니다 (예 : 단추에 위 첨자 문자를 사용하고 싶습니다). 그러나 이것에 대한 해결책이 없을 수도 있습니다. 모든 도움에 많은 감사드립니다! – Fred
@Fred : IMO mysql_real_escape_string은 prepared statement가 대신 사용 가능할 때 피해야하는 불쾌한 해킹입니다. 단추 값에 대한 자세한 정보를 포함하도록 질문을 업데이트 할 수 있습니까? – Mike
준비된 문장은 좋은 생각처럼 들리지만 저는 이것에 대해 매우 익숙하며 사용법을 이해하지 못합니다. mysql insert에 무엇을 추가해야합니까? 버튼 값과 관련하여 4 개의 버튼으로 4 개의 대안을 표시하는 객관식 퀴즈가 있습니다. 예를 들어 나는 접두어 zetta의 요소를 묻고 버튼 중 하나는 sup 태그 안에 10과 21을 표시해야합니다 (물론 태그 자체가 표시되기를 원하지 않습니다. – Fred