다음과 같은 간단한 검색 쿼리 코드가 있습니다.
function explode_search($squery, $column, $db, $link) {
global $conn;
$ven = explode(' ', safeInput(str_replace(',', '', $squery)));
$ven2 = array_map('trim', $ven);
$qy = ''.$column.' LIKE "%'.implode('%" AND '.$column.' LIKE "%', $ven2).'%"';
$query = 'SELECT DISTINCT '.$column.', id, work_composer FROM '.$db.' WHERE '.$qy.' ORDER BY '.$column.' LIMIT 100';
$result = mysqli_query($conn, $query);
while ($row = mysqli_fetch_assoc($result)) {
echo '<div><span class="mdmtxt" style="margin-bottom:5px;"><a href="'.$link.'.php?id='.$row['id'].'">'.$row[$column].'</a></span> <span class="mdmtxt" style="opacity:0.6;">('.fixcomp(cfid($row['work_composer'], 'cffor_composer', 'composer_name')).')</span></div>';
}
}
(safeInput 함수는 '및 "및 기타 가능한 문제를 제거합니다.)
어느 정도까지는 잘 작동합니다.
누군가 'Stephane'을 찾을 때 'Stéphane'(또는 그 반대)도 찾거나 'Munich'를 찾는 경우 'Münich'도 목록에 표시되어야합니다.
관련된 특수 문자에 관계없이 MySQL을 해당 검색 쿼리와 일치시키는 방법이 있습니까?
"매개 변수화 된 쿼리"를 사용하려고합니다. 대부분의 언어에는 이러한 기능이 있으며 입력을 보호하고 공격으로부터 보호하는 데 사용됩니다.
익숙해지면 사용하기도 매우 쉽습니다.
다음과 같은 간단한 쿼리로 시작합니다.
$stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")
모든 실제 데이터를 ?
s 로 바꿉니다.
그런 다음 각 매개 변수를 바인딩합니다.
$stmt->bind_param("s", $city);
그런 다음 전화 $stmt->execute();
자세한 정보는 여기에서 찾을 수 있습니다. http://php.net/manual/en/mysqli.prepare.php
한 번 대학에서 교수님이 매개 변수화 된 쿼리가없는 라이브러리를 사용하도록하여 직접 구현을 작성했습니다. 매우 멋진 교리가이 모든 것을 처리합니다. 나는 항상 내 자신의 구현을 작성하는 대신 나를 위해이 작업을 수행하는 다른 사람에게 의존합니다. 그런 식으로 곤경에 빠질 것입니다. 기본적으로 당신이하는 일인 새로운 유형을 재발 명하지 않는 것에 대한 글도 많이 있습니다. 유형에는 문제가 있습니다. 유형은 테스트가 필요합니다. 이런 종류의 것은 당신이 아닌 다른 구현에서 잘 테스트되었습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다