PDO: 백슬래시가 포함된 DB에서 필드 선택
이 내용으로 테이블이 있습니다.
ID|name
----------------
1 |My Shop No. \6\
(왜 식스가 백슬래시 안에 있는지 묻지 마세요, 저는 전혀 모르겠어요, 그냥 작업해야 해요.)
저는 제 테이블에서 이 특정 값을 선택하려고 합니다.내 쿼리는 다음과 같습니다.
$sql = "SELECT `id` FROM shops WHERE `name` = :name";
$params = array(':name' => "My Shop No. \6\");
$this->fetchOne($sql, $params); // the binding happens in my mysql class
이 쿼리는 어떤 데이터도 반환하지 않으며, 항목이 없다는 것을 나타냅니다.을 사용하여 SQL 문을 모니터링하는 경우Neor Profiler SQL
, 데이터베이스가 다음 쿼리를 수신하고 있음을 알 수 있습니다.
SELECT `id` FROM shops WHERE `name` = 'My Shop No. \\6\\'
PHPMyAdmin에서 이 쿼리를 직접 사용해도 결과가 반환되지 않습니다.
이런 경우에는 어떻게 대처해야 합니까?
데이터베이스의 데이터를 변경할 수 있는 옵션은 전혀 없습니다.
많은 제품(PHP, MySQL 등)에서 백슬래시를 탈출 캐릭터로 사용합니다.
그 자체로, 그것은 보통 그 다음에 캐릭터에게 무언가를 함으로써 소비됩니다.예를들면,a\tb
당신에게 편지를 줍니다.a
그리고.b
탭에 의해 구분됩니다(통상적인 해석).\t
).
백슬래시 2배 증가\\xyz
일반적으로 다음과 같이 해석됩니다.첫 번째 백슬래시는 두 번째를 탈출하기 때문에\xyz
.
문자열이 여러 개의 코드 계층(예: PDO + MySQL)을 통과하는 경우 각 계층이 회전하므로 백슬래시가 두 배 더 필요할 수 있습니다.\\
안으로\
.
또 다른 진단 도구는SELECT HEX(col) ...
데이터베이스에 저장된 내용을 확인할 수 있습니다.예:
610962 a\tb -- a=61, tab=09, b=62
615C7462 a\\tb -- a=61, \=5C, t=74, b=62
코드로 돌아가기:
$params = array(':name' => "My Shop No. \6\");
\6 is probably treated as just "6" (not everything has some escaped meaning)
\" possibly caused a syntax error. Normally this is now to get a " inside a string
'My Shop No. \\6\\'
이제 백슬래시 쌍이 단일 백슬래시로 변환되고 다음에 오는 사람에게 문자열이 전달됩니다.
(이러한 맥락에서 단일 따옴표와 이중 따옴표는 동일하게 작동합니다.)
언급URL : https://stackoverflow.com/questions/53320127/pdo-select-field-from-db-which-contains-a-backslash
'programing' 카테고리의 다른 글
자동 배선 종속성을 주입하지 못했습니다. (0) | 2023.09.21 |
---|---|
부트스트랩에서 용기의 수직 중심을 맞추는 방법은? (0) | 2023.09.16 |
Wordpress REST API _fields 및 _embed 파라미터가 동시에 작동하지 않습니다. (0) | 2023.09.16 |
C++ 문자열을 한 줄에 여러 개 연결하려면 어떻게 해야 합니까? (0) | 2023.09.16 |
MySQL에서 NOW(), SYSDATE() 및 CURRENT_DATE()의 차이 (0) | 2023.09.16 |