>  기사  >  백엔드 개발  >  MySQL 이스케이프 와일드카드가 예기치 않게 작동하는 이유는 무엇입니까?

MySQL 이스케이프 와일드카드가 예기치 않게 작동하는 이유는 무엇입니까?

DDD
DDD원래의
2024-11-07 08:25:03696검색

Why is MySQL Escaping Wildcards Behaving Unexpectedly?

와일드 카드에 대한 MySQL 이스케이프 이해

문제:

mysql_real_escape_string을 사용하여 사용자 입력을 이스케이프하는 동안 MySQL의 출력은 다음과 같습니다. 특정 캐릭터의 예상치 못한 동작. 특히 밑줄 문자 앞에는 백슬래시가 오고 작은따옴표와 큰따옴표는 앞에 오지 않습니다.

설명:

가정과 달리 및 %는 다음과 같습니다. 일반적인 사용에서는 MySQL 와일드카드가 아니며 문자열 리터럴에 삽입할 때 이스케이프해서는 안 됩니다. mysql_real_escape_string은 이 목적에 충분하며 및 %에 addcslash를 추가하는 것은 피해야 합니다.

와일드카드는 LIKE 일치의 맥락에서만 관련됩니다. 문자열을 리터럴 LIKE 표현식으로 표현하는 경우 _ 및 %를 이스케이프해야 하는 추가 이스케이프 계층이 필요합니다. 이는 동일한 백슬래시 문자를 사용하여 일반 문자열 이스케이프 처리와 별도로 수행됩니다.

해결책:

LIKE 일치의 경우 다음 단계를 따르세요.

  1. LIKE 이스케이프를 사용합니다. 여기서 _ 및 %는 이스케이프되어야 하며 이스케이프 문자도 이스케이프되어야 합니다.
  2. MySQL의 mysql_real_escape_string 또는 다른 데이터베이스의 적절한 함수를 사용하여 일반 문자열 이스케이프를 수행합니다.

예:

리터럴 백분율 기호를 일치시키려면 LIKE 이스케이프(예: MySQL의 LIKE 'something\%')에서 이중 백슬래시 이스케이프를 사용하거나 다른 이스케이프를 사용하세요. 이식성을 위해 LIKE ... ESCAPE ... 구문을 사용하는 문자.

이식 가능한 LIKE 이스케이프 함수:

function like($s, $e) {
    return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s);
}

매개변수가 있는 예:

$escapedname = mysql_real_escape_string(like($name, '='));
$query = "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ...";

위 내용은 MySQL 이스케이프 와일드카드가 예기치 않게 작동하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.