2017-04-16 2 views
0

내 데이터베이스에 삽입하려는 모든 문자열을 이스케이프하고 싶습니다.MySQL의 실제 탈출 - 자신의 탈출 - o를 ö?

function escape($value) { 
    $return = ''; 
    for($i = 0; $i < strlen($value); ++$i) { 
     $char = $value[$i]; 
     $ord = ord($char); 
     if($char !== "'" && $char !== "\"" && $char !== '\\' && $ord >= 32 && $ord <= 126) 
      $return .= $char; 
     else 
      $return .= '\\x' . dechex($ord); 
    } 
    return $return; 
} 
: 내가 확인하는 이상 10.000 문자열을 가지고 있기 때문에하지만 내 문제는 데이터베이스 쿼리

그래서 내가 stackoverflow.com에 여기이 탈출 기능을 사용하여 ... 너무 많은 것입니다

효과가 있습니다. 하지만 내 문제는 내가 그와 같은 어떤 ö, ä 또는 문자가없는 것을입니다 ... 나는이 같은 문자열이이 함수를 호출

하기 전에 : Königsedition를 그리고이 함수를 호출 한 후, 나는 K\xc3\x83\xc2\xb6nigsedition을 얻어야한다. 그러나 문제는 몇 가지 이유 때문에 내 데이터베이스에 Kxc3xb6nigsedition이 있습니다 ...

어떻게 이것을 Königsedition으로 바꿀 수 있습니까? 더 10.000 SQL 쿼리보다 문자열을 탈출하고 UTF 8 서식을 유지하기 위해 다음 내가해야하기 때문에

또는의 SQL 실제 이스케이프 기능을 사용하지 않고 문자열을 탈출 할 수있는 다른 방법은 무엇입니까? (나는이 방법을 선호 할 것이다!)

안녕하십니까!

+1

매개 변수화 된 쿼리는 어떻게됩니까? – frz3993

+0

"어떤 이유로 든"데이터베이스에서 문자열을 얻습니다 ... "escape"기능을 호출하지 않습니다. INSERT 또는 UPDATE 문을 실행했기 때문에 데이터베이스에 문자열이 생깁니다. 그 "이스케이프"함수에서 문자열 반환을 삽입하는 경우, 그것은 데이터베이스에서 문자열을 얻는 "이유"가됩니다. 나는 당신이 데이터베이스에 삽입하기 위해 삽입 한 문자열과 다른 문자열을 기대하는 이유를 이해하지 못합니다. 왜 "이 탈출 함수를 사용합니까"? 나는 그 목적을 이해하지 못한다. – spencer7593

+0

바인드 자리 표시 자와 함께 준비된 문을 사용하고 삽입 할 문자열의 값을 제공하십시오. 값으로 전달 된 문자열의 인코딩이 MySQL 클라이언트 및 열에 지정된 문자 집합과 일치하는지 확인하십시오. https://dev.mysql.com/doc/refman/5.7/en/charset-connection.html – spencer7593

답변

2

문자열 인코딩에 'escape'하지 않아도됩니다. 테이블, 연결 및 입력에 모두 같은 인코딩 (예 : UTF-8)이 있는지 확인하십시오.

테이블의 경우 열 (선호하는 테이블 자체)에 즉, utf8_general_ci 데이터 정렬이 있어야합니다.

PDO를 사용하는 경우 DSN에 ;charset:utf8을 추가하거나 PDO를 사용하지 않는 경우 다른 쿼리를 실행하기 전에 SET NAMES utf8 쿼리를 실행하십시오. charset이있는 DSN의 예는 mysql:host=HOSTNAME;dbname=DATABASE;charset=utf8입니다.

페이지에 UTF-8 인코딩이 있는지 확인하고 브라우저가 UTF-8 형식으로 콘텐츠를 보낼 수 있도록 HTML 페이지에 Content-Type 헤더 Content-Type: text/html; charset=utf-8을 보냅니다.

+0

저는 UTF-8을 가지고 있습니다! -하지만'escape' 함수를 사용하면 UTF-8을 얻지 못합니다. –

+0

왜 매개 변수화 된 쿼리 나 PDO의 quote() 메소드를 사용하면 '탈출'해야합니까? – Dygnus

+0

'quote (...) '를 사용하면 쿼리가 실패합니다 ... –