Проверьте это утверждение:
String query= "SELECT t.ptr, t.id ";
query+= "FROM users t ";
query+= "WHERE (t.ptr = ? OR 1 = ?)"
query+= " AND " ;
query+= "(t.id = ? OR 1 = ?)";
Вы видите, что для каждого из t.id
и t.ptr
есть соответствующий параметр.Всего будет 4 параметра.Вы говорите, что по крайней мере 1 из t.id
или t.ptr
имеет допустимое значение, поэтому есть 2 случая: [1] t.id
и t.ptr
оба имеют допустимые значения.Для обоих параметров партнера вы передаете 0
, и запрос становится:"SELECT t.ptr, t.id FROM users t WHERE (t.ptr = valueptr OR 1 = 0) AND (t.id = valueid OR 1 = 0)"
В ГДЕ часть:t.ptr = valueptr OR 1 = 0
эквивалентно t.ptr = valueptr
, иt.id = valueid OR 1 = 0
эквивалентно t.id = valueid
,и запрос, наконец, становится:"SELECT t.ptr, t.id FROM users t WHERE t.ptr = valueptr AND t.id = valueid"
[2] из t.id
или t.ptr
только одно имеет допустимое значение, допустим, это t.ptr
.Для аналога t.ptr
вы передаете 0
, для t.id
вы передаете -1
(или любое другое несуществующее значение), а для аналога t.id
вы передаете 1
, и запрос становится:"SELECT t.ptr, t.id FROM users t WHERE (t.ptr = valueptr OR 1 = 0) AND (t.id = -1 OR 1 = 1)"
В ГДЕ часть:t.ptr = valueptr OR 1 = 0
эквивалентно t.ptr = valueptr
, иt.id = -1 OR 1 = 1
эквивалентно true
, потому что 1 = 1
всегда true
,и запрос, наконец, становится:"SELECT t.ptr, t.id FROM users t WHERE (t.ptr = valueptr OR 1 = 0)"
эквивалентно:"SELECT t.ptr, t.id FROM users t WHERE (t.ptr = valueptr)"
(В случае, когда только t.id
имеет допустимое значение, вы передаете недопустимое значение для t.ptr
и 1
для его аналога и для аналога, если t.id
вы передаете 0
.)Может быть, это кажется сложным, но оно работает и может быть расширено более чем на 2 столбца.