집 >데이터 베이스 >MySQL 튜토리얼 >LIKE 절에서 MySQL 와일드카드를 올바르게 이스케이프하는 방법은 무엇입니까?
Prepared 문을 사용할 수 없는 레거시 서버에서는 사용자 입력을 MySQL로 보내기 전에 이스케이프하는 것이 필수적입니다. 그러나 mysql_real_escape_string만 사용하면 MySQL 와일드카드(_ 및 %)를 이스케이프할 수 없으며 특정 패턴은 예상치 못한 결과를 반환합니다.
예를 들어 "test_test' 입력이 전송되면 데이터베이스에 "test_test '"가 표시됩니다. 밑줄에는 백슬래시 접두사가 있고 작은따옴표와 큰따옴표에는 그렇지 않습니까?
_ 및 %는 MySQL에서 와일드카드가 아니며 문자열 리터럴에 삽입할 때 이스케이프해서는 안 됩니다.
그러나 , _ 및 %는 LIKE 일치 표현식에 사용될 때 패턴이 아닌 리터럴 값만 일치하는지 확인하기 위해 특별한 처리가 필요합니다. 두 가지 이스케이프 수준:
LIKE 이스케이프:
문자열 리터럴 이스케이프:
MySQL의 경우 리터럴 백분율 기호와 일치시키려면 이중 백슬래시 이스케이프를 사용합니다(예: LIKE 'something\%`).
이러한 혼란을 피하고 이식성을 보장하려면 LIKE ...를 사용하여 기본 이스케이프 문자를 재정의할 수 있습니다. ESCAPE ... 구성
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 ...";
또는 PDO의 매개변수 사용:
$q= $db->prepare("... WHERE name LIKE ? ESCAPE '=' AND ..."); $q->bindValue(1, '%'.like($name, '=').'%', PDO::PARAM_STR);
위 내용은 LIKE 절에서 MySQL 와일드카드를 올바르게 이스케이프하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!