programing

PDO: 백슬래시가 포함된 DB에서 필드 선택

subpage 2023. 9. 16. 09:05
반응형

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

반응형