2012-10-16 6 views
0

사람들이 값을 입력 할 수있는 입력란이 7 개 있습니다. 이 값은 테이블과 비교되어 결국 결과가 나오며 검색 기능이됩니다. 지금은 세 inputboxes있는 페이지를 가지고 다음과 같은 DIT :이 OK입니다입력 된 값에 따라 SQL이 적용됩니다.

if (box1 is filled && box2 is filled & box 3 is filled) { 
sql="take all three values into account when comparing.."; 
} 

if (box1 is not filled && box2 is not filled & box 3 is nog filled) { 
sql="take no values into account when comparing.."; 
} 

and so on... 

세 용 상자, 당신은 세 개의 상자와 몇 조합이있다. 그러나, 이것은 7 박스에 대해 할 수 없다, 당신은 훨씬 더 많은 조합을 얻을! 입력란에 SQL을 신뢰할 수있게하려면 어떻게해야합니까? 당신은 영리한 해결책을 가지기를 바랍니다!

+0

SQL 쿼리에서이 작업을 수행 할 수없는 이유는 무엇입니까? 검색어 샘플을 추가하면 도움을 드리겠습니다. – Gidil

+0

먼저 솔루션을 사용해 보겠습니다. 감사합니다. – user1555076

답변

1

쿼리를 조각 단위로 작성하십시오. 마찬가지로 : 노트의

StringBuilder where=new StringBuilder(); 
String conj=" where "; 
if (box1.length()>0) 
{ 
    where.append(conj).append("value1=").append(esc(box1)); 
    conj=" and "; 
} 
if (box2.length()>0) 
{ 
    where.append(conj).append("value2=").append(esc(box2)); 
    conj=" and "; 
} 
... etc ... 
String sql="select value1, value2, value3 from mytable" + where.toString(); 

커플 :

사용자가 입력 할 수있다 분야의 어떤 조합 아무 생각이 가정, 당신이 바로 conjuctions를 얻기 위해 약간의 재생을 수행해야 할 수 있습니다, 당신이 원하지 않는 즉, 검색어 "where and value2 = 'x'"라고 말합니다. 위 코드는 첫 번째 조건 앞에 "where"를두고 다음에 각각 앞에 "and"를 붙입니다.

사이드 노트 : 이와 같은 쿼리를 작성할 때 SQL 주입을 감시해야합니다. 이스케이프 함수를 작성하십시오. 여기에서는 "esc"라고 가정합니다. 이는 모든 인용 부호를 두 배로 늘립니다. 대부분의 SQL 엔진에서는 걱정해야 할 전부입니다. 어떤 사람들은 당신이 도망쳐 야 할 백 슬라 같은 다른 마법의 캐릭터를 가지고 있습니다. 또는 준비된 명령문을 작성한 다음 돌아가서 값을 채울 수 있습니다. 이것은 더 안전하지만 어느 필드가 두 번 채워 졌는지 확인해야합니다. 한 번은 SQL을 빌드하고 두 번째는 값을 채우십시오. 조금 지저분하지만 더 안전합니다. " '"+ value + "'"를 입력하여 사용자가 입력 한 값을 SQL 문에 입력하는 일은 절대 없으며 ""을 입력 한 해커에게 사용자를 넓게 남겨두고 사용자로부터 *를 선택하십시오. 'x'= ''. 그가해야 할 일은 바로 테이블 이름 하나를 추측하는 것뿐입니다.

+0

정확한 해결책이 아닌 해결책을 찾았지만 여전히 thelp에 감사드립니다! – user1555076

+0

sql-string을 연결하지 않고 sql-parameters를 사용하여 sql-injection을 피하십시오. –

2

당신은 COALESCE (또는 ISNULL)를 사용할 수 있습니다 : 매개 변수는 WHERE 해당 필드에 적용되는 null가 아닌

... 
WHERE Column1 = COALESCE(@Column1, Column1) 
AND Column2 = COALESCE(@Column2, Column2) 
... 
AND Column7 = COALESCE(@Column7, Colum7) 

그래서 경우에만 가능합니다.

+0

허, 나는 이것에 대해 몰랐다. – musefan

+0

나는 이것을 고맙게 생각할 것이다! – user1555076

+0

내가 이해하는 것으로부터, COALESCE는 내 테이블의 필드가 비어 있는지 확인하는 것입니다. 입력 상자에 입력 된 값이 비어 있는지 확인하고 싶습니다. – user1555076

관련 문제