2009-09-30 10 views
0

문서의 상대 경로를 MySQL 테이블에 저장해야합니다. 나는 모든 슬래시는 모든 텍스트의 앞에 알 수없는 기호로, 벗겨 '\'이, 관련 컬럼에Store ' abc def fg.jpg'MySQL의 문제

$urlPath ='\abc\def\fg.jpg' 

, 내가 무엇을 얻을 : 문제는 내가이 양식의 문자열을 삽입 할 때이다. 따라서 MySQL 테이블의 결과는 다음과 같습니다.

'(weird symbol)abcdeffg.jpg' 

이 데이터는 쓸모가 없습니다. 이 문제를 어떻게 해결할 수 있습니까?

편집 : 난 아직도 횡설수설있어, $urlPath ="\\abc\\def\\fg.jpg"$urlPath ='\\abc\\def\\fg.jpg' 시도 ..

+0

$ urlPath = '\\ abc \\ def \\ fg.jpg'를 입력하면 어떻게됩니까? –

답변

1

탈출해야합니다 docs에서

:

이 전에 작은 따옴표를 리터럴 백 슬래시를 지정하거나 문자열의 끝에서 두 번에 두 번, 첫째 PHP의 \ 문자는 특별한 의미를 가지고 있기 때문에 그것 (\)

$urlPath ='\\abc\\def\\fg.jpg'; 

그런 다음 리터럴 문자열에 MySQL에 특별한 의미가있는 \가 있기 때문에 다시 이스케이프 처리해야합니다.

mysql_real_escape_string() 전화 의 MySQL의 라이브러리 기능 인 mysql_real_escape_string 다음 문자 앞에 추가 된 백 슬래시 : \의 x00에서, \ n, \ r에, \, ', "와 \의 X1A

$databaseUrlPath = mysql_real_escape_string($urlPath); 
.

MySQL을 사용하고 싶지 않은 경우

0 대신에 addslashes을 사용할 수 있습니다.

반환 등이 문자 데이터베이스 쿼리에서 인용 할 필요가 문자 앞에 백 슬래시 있는 문자열은 작은 따옴표 ('), 큰 따옴표 ("), 백 슬래시()와 NUL합니다 (NULL 바이트)입니다.

$databaseUrlPath = addslashes($urlPath); 
1

이 시도 ...이 문자열을 사용하기 전에 문자열에 특수 문자를 탈출하는

$urlPath ='\\abc\\def\\fg.jpg' 
+0

솔루션을 테스트 한 결과 작동하지 않았습니다. 그것은 여전히 ​​횡설수설을 저장합니다. – Graviton

+0

작은 따옴표를 사용하는 것에주의하십시오 - 큰 따옴표를 사용하면 효과가 없습니다. –

+0

그래도 작동하지 않습니다, 나는 Windows에서 실행 중입니다 ... 그게 diff합니까? – Graviton

6

사용는 mysql_real_escape_string()를 삽입/업데이트 쿼리

백 슬래시는 PHP와 MySQL의 특수 문자이므로 PHP와 MySQL의 두 레벨에서 이스케이프해야합니다.

+0

순수한 PHP 솔루션을 선호합니다 - 대신 MySQL – Graviton

+1

"순수한 PHP 솔루션"에 넥타이 하나? mysql_real_escape_string()은 PHP 함수입니다. – VolkerK

+0

죄송합니다 ... 무슨 뜻인지, MySQL 연결을 열지 않아도 작동하는 코드를 원합니다. 귀하의 경우 여기, 그 함수를 사용하려면 MySQL 연결이 필요합니다 – Graviton

0

\는 PHP를 비롯한 많은 프로그래밍 및 스크립팅 언어에서 이스케이프 문자입니다.

두 개의 \를 사용하여 이스케이프 처리해야합니다. ''와 같은 기호를 데이터베이스에 입력하거나 문자열 내에서 "$ mystr ="내 문자열에 \ "넣을 수있는 문자를 입력하려는 경우에도 마찬가지입니다.

1

I가 무슨 뜻인지, 내가 열 어떤 MySQL을 연결하지 않고도 작동 코드를 원한다.

죄송합니다, 그것은 불가능 : 탈출 방법은 연결 별 때문에 실제로 적절한 탈출을 할 수있는 연결이 필요합니까 :

  1. 일부 문자 세트는 0x27에와 0x5c가 바이트에서 (' 그리고 \)는 멀티 바이트 문자의 일부일 수 있습니다.이 경우 백 슬래시로 이스케이프하면 잘못된 결과가 생성되고 실제로 은 SQL 삽입 가능성을 도입 할 수 있습니다! 따라서 연결의 문자 집합이 '문자이 아닌 바이트이 아닌 올바른 문자로 이스케이프 처리해야합니다.

  2. 서버가 구성 옵션 NO_BACKSLASH_ESCAPES을 사용하여 ANSI SQL과 호환되는 경우 백 슬래시 이스케이프가 잘못되어 SQL 주입을 방지하지 못합니다.

문자열 리터럴을 올바르게 이스케이프하려면 mysql_real_escape_string과 연결 개체가 필요합니다. 이것은 보통 mysql_real_escape_string에 대한 적절한 시간이 실행 ​​된 쿼리에 들어가기 바로 전에 발생하기 때문에 일반적으로 문제가되지 않습니다. 그렇지 않으면 mysql 이스케이프 된 문자열을 주위에서 전달해서는 안됩니다.

ANSI 옵션을 사용/지원하지 않고 데이터베이스 연결이 항상 1 바이트 문자 세트를 사용하고 있거나 비 ASCII 문자가 나타나지 않을 것이라 확신하는 경우 대신 addslashes을 사용하십시오. 연결이 필요하지 않습니다.

더 나은 것은 parameterised queries을 사용하는 것이므로이 물건에 대해 생각할 필요가 없습니다.

+0

매개 변수화 된 쿼리를 사용하십시오 ... 좋은 제안! +1 – Graviton