2010-06-21 9 views
1

또 다른 두뇌 티저.아주 이상한 아포스트로피 MySQL PHP 오류

이것은 탈출과 살균에 관한 모든 것을 알고 있으므로 평소와 다르지 않습니다. "그러나 아포스트로피는 내 질문을 깨고 있습니다.

"Assassin 's"및 "Babe 's"와 같은 이름을 가진 많은 많은 것들이 "Assassin \"s "및"Babe \ "s로 끝나며 복구는 좋지만 텍스트 검색은 ... 아픈.

LIKE "% Babe \ 's %"에는 결과가 없으며 "% Babe \\'s"에 결과가 없으며 "% Babe \ 's"에 결과가 없습니다.

하지만 서버에 직접 연결하면 결과가 모두 생성됩니다.

즉, 완전히 편집되지 않은 SAME 쿼리는 MySQL 엔진에서 직접 작동하지만 php의 mysql api를 통해 전송되면 일치하는 결과가 산출되지 않습니다.

어떤 아이디어가 발생할 수 있습니까? (I는 문자 집합 문제가, 슬래시 등의 100 배 양을 확인했다 "

많은 많은 많은 많은 감사를 사전에

편집 :?.

나는 더 이상 자신을 생각한다 명확 :

"SELECT title FROM games WHERE title LIKE "%assassin\\\'s%"; (SQL은 아포스트로피 보관 하였다 슬래시로 바뀝니다 슬래시 중 하나를 탈출해야하기 때문에 우리는이 예에서 "어쌔신 \ '의 신조"를 찾고 이후부터)

EDIT2 : 우린 우린 겨우 먹었어. 빨간 불량은 빈약 한 위생 처리로 인해 실제 DB에서 탈출 한 것으로 인해 발생합니다. 현재 db 및 입력 메소드를 정리하는 중입니다.

edit3 : 마술 따옴표가 어떻게 든 위에 있던 것처럼 보인다 ... 나는 꺼 졌다고 맹세한다. 그러나 그것은 그저 그런 것이 아닙니다. 이 사이트의 DB 랩퍼에는 클린 이벤트가 있으며 문제를 일으키는 사전 클리닝이 있습니다. 즉 이제 고정 된 지금은 (희망)이 DB를 정화하는 스크립트를 ... 실행 해요

+0

수정? – Rwky

+0

mysql_query() php의 표준입니다. – Dorjan

답변

5

데이터베이스의 데이터를 수정하는 것이 중요합니다.

이제 MySQL은 \'''을 이스케이프 된 아포스트로피로 인식합니다. 즉, 서버 모드가 엄격한 SQL을 사용하도록 설정되지 않은 경우 '' 만 인식됩니다.당신이 그것을 호출 할 때

데이터는 가장 확실하게 mysql_real_escape_string 다시 사용자가 (addslashes를 사용 magic_quotes_gpc에 의해)을 입력하면 대부분 한 번, 이중 이스케이프 항목을 얻고있다.

이것은 Assassin's CreedAssassin\\\'s Creed으로 바꾸고 궁극적으로 Assassin\'s Creed으로 저장합니다.

수정 가능한 것보다 많은 문제가 발생할 수 있으므로 가능한 경우 magic_quotes_gpc을 비활성화하는 것이 좋습니다. 문서 says으로

+0

DB와 입력 기능을 수정하는 것이 최선의 행동이라고 생각합니다. 건배 모두, 내가 고칠 때까지 열어두고 다음 누구에게 최선을 도울 대답을 줄 : 다들 다시 고마워 – Dorjan

+0

나는 DB를 수정했습니다. 큰 일이지만 그만한 가치가 있기 때문에 모든 것이 이제는 행동해야합니다. 입력을 정리 했으므로 더 이상 데이터가 손상되지 않아야합니다. 모두에게 감사드립니다. – Dorjan

1

magic_quotes를 활성화하고 문자열 덤비는 경우 당신은 또한, mysql_real_escape_string을 사용하여 확인하려고 했

+0

예, mysql_real_escape_string은 내가 사용한 적이 있지만 서버로 보내기 직전에 원시 문을 생성했습니다. 내가 magic_quotes로 알고 있듯이, 데이터가 PHP에 들어올 때만 존재합니까? 나는 ofc라고 착각 할 수는 있지만, 그렇다면 magic_quotes의 유일한 문제는 추가 이스케이프이므로 단일 탈출구가 작동 할 것이다. – Dorjan

1

아포스트로피를 이스케이프하면 MySQL에 저장할 수 있으므로 백 슬래시는 저장되지 않습니다.

그래서이 시도 대신의

SELECT title FROM games WHERE title LIKE "%assassin\'s%"; 

: 게임 FROM

SELECT title FROM games WHERE title LIKE "%assassin\\\'s%"; 
+0

불행히도이 경우 이전의 사람은 탈출구가 DB에 저장된 수동 탈출구를 사용했습니다. – Dorjan

+1

수동 탈출조차도 MySQL이 백 슬래시를 저장하지 않습니다. 'SELECT * FROM title'을 할 때'Assassin \'s Creed '같은 것을 보게된다고 말하는 겁니까? 그렇다면 부적절하게 탈출하여 데이터가 손상됩니다. –

+0

그게 내가 말하는거야. 그것은 저기 다 저기 다. 삼중 탈출 했나봐. – Dorjan

0

SELECT 제목을 WHERE 제목 정규 표현식 "암살자 \ '의";

REGEXP는 MySQL에서보다 강력하고 덜 까다로운 "LIKE"로 생각하십시오 .... 모든 것, 끝으로,하지만 다른 멋진 도구가 아닙니다.

+0

나는 이것을 결코 알지 못했다. 나는 내일 그에게 총을 줄 것이다. 감사. – Dorjan

-1

는 LIKE 슬래시와의 정규 표현식 절은

편집을 두 배로해야합니다 잘못된 링크가 어떻게 기능하는 데이터베이스를 쿼리하는 PHP를 사용하는

+0

예, 불행히도 날짜가 실제로 슬래시를 저장하고 있기 때문에 "LIKE"가 통과 할 때 결과를 가져 오지 못하게합니다. hecne 왜 이것이 예상치 못한 행동을하는 것처럼 이상한 질문입니까? 다른 사람들은 데이터 셋 자체가 MySQL 표준에 맞지 않아 실패 할 것이라고 말했기 때문에 실패하게됩니다. – Dorjan

+0

@Dorjan 어쨌든 데이터를 복구 한 후에도 여전히 도리언이 필요합니다 –

+0

질문을 읽으면 "슬래시가 두 배로 증가했습니다"라고 바로 알았을 것입니다 – Dorjan