2012-02-07 7 views
1

나는 전원에게 검색 내 프로그램에서 함수를 작성하려고 해요 :PDO/MYSQL 준비 문이 이스케이프 문자가 아닙니까?

$search = "%".$_POST['search']."%"; 
$query=$connection->prepare("SELECT * FROM TABLE WHERE COLUMN LIKE ?"); 
$query->execute(array($search)); 

그러나, 사용자가 단순히 %를 입력 할 수있는 것으로 보인다 및 그것은 모든 결과를 반환합니다. 어떻게 이런 일이 일어나지 않도록합니까? 준비된 문장을 사용하면 이러한 문자를 이스케이프했을 것입니다. 다른 문자 (\, ', 등)에도 적용됩니까? 이 문제를 어떻게 해결할 수 있습니까?

답변

1

준비 문은 아무 것도 벗어나지 않습니다. 명령문을 준비 할 때 쿼리는 미리 컴파일되어 있으므로 자리 표시 자 (?) 만 채워야합니다. 사전 컴파일 된 쿼리의 SQL을 변경하지 않으므로 이스케이프가 필요하지 않습니다.

이 문제를 해결하려면 %_을 수동으로 이스케이프 처리하십시오.

추가 :

상식적인 추론의 비트 : 귀하의 경우에는, WHN 사용자가 검색 창에 % 입력, 당신의 $search 변수는 문자열 %%%을 포함합니다. MySQL은 어떻게 알 수 있습니까? %은 탈출해야하며 어느 것이 혼자 떠나야합니까?

1

유효한 입력으로 사용하지 않으려면 응용 프로그램 코드에 % 또는 _이 포함되지 않도록 보호해야합니다.

if (strpos($_POST['search'], '%') !== FALSE || strpos($_POST['search'], '_') !== FALSE) { 
    $query = $connection->prepare("SELECT * FROM TABLE WHERE COLUMN LIKE ?"); 
    $query->execute(array($search)); 
} 
else echo "% and _ are not allowed!"; 

' 같은 문자에 관해서는, 그들은이 ? 자리를 대신 전달 된 문자열의 일부로 취급하고, SQL 문을 구축에 연결된 없습니다. 그래서 그들은 안전합니다.

0

서버에서 와일드 카드 문자와 일치시킬 데이터를 알 수 있도록 사용자 입력을 올바르게 이스케이프 처리해야합니다.

$search = '%' . str_replace(array('_', '%'), array('\\_', '\\%'), $_POST['search']) . '%'; 

이렇게하면 와일드 카드로 간주되는 문자를 이스케이프 처리합니다.

%100\%% 

I always give 100% when working하지만 I do 100 pushups daily 일치합니다 : $search 지금의 라인을 따라 뭔가를 포함 할 것이다.

관련 문제