Вы здесь излишне скованы. Вместо этого рассмотрим:
User
UserId, OtherData
UserNames
UserId, Name, Kind
Данные вроде:
UserId, OtherData
1, Blahblah
UserId, Name, Type
1, Lisa, First
1, Jane, Middle
1, Smith, Last
1, Leese, First
1, Jones, Last
Лиза Джейн Смит, также известная как Лиз, вышла замуж и сменила имя на Лизу Джейн Джонс
Если вы представляете пользователь веб-сайта с помощью команды «Введите любое количество имен и укажите их тип», затем вы можете запустить запрос, который найдет идентификаторы пользователей, в которых указаны все типы имен.
Это может быть так же просто, как динамическое присоединение или выполнение условное агрегирование
Например, если пользователь вводит «Leese» в качестве имени и «Jones» в качестве фамилии, вы можете:
SELECT UserID FROM UserNames
WHERE
(name = 'Leese' AND type = 'First') OR
(name = 'Jones' AND type = 'Last')
GROUP BY
UserID
HAVING count(*) = 2 --2 is the number of names entered, leese and jones. If your where clause had 5 names, this would be 5
Или вы можете использовать подход объединения (и это для if веб-пользователь вводит 3 имени / вида):
SELECT u1.UserID
FROM
UserNames u1
INNER JOIN Usernames u2 ON u1.UserID = u2.UserID
INNER JOIN Usernames u3 ON u1.UserID = u3.UserID
WHERE
u1.name = 'Leese' AND u1.type = 'First' AND
u2.name = 'Jones' AND u2.type = 'Last' AND
u3.name = 'Smith' AND u3.type = 'Last' AND
Когда вы go формируете свои динамические c запросы, не объединяйте значения в SQL. Тот факт, что вы создаете динамический c запрос, не является оправданием для того, чтобы выбросить параметризацию из окна. Вы создаете SQL, объединяя вместе строку SQL с заполнителями параметров, а затем даете значения параметров отдельно
Псевдокод (я не знаю php) на языке, который интерполирует свои строки с {заполнители}:
string fromclause = ""
string whereclause = ""
for i = 0 to webrequest.form.values.length - 1
string name = webrequest.form.values[i].name
string type = webrequest.form.values[i].type
if i == 0 then
fromclause = fromclause + "Usernames u{i}"
else
fromclause = fromclause + " INNER JOIN Usernames u{i} ON u1.UserID = u{i}.UserID
whereclause = whereclause + " u{i}.Name = @paramName{i} AND u{i}.type = @paramType{i}"
sqlcommand.parameters.add("@paramName{i}", name)
sqlcommand.parameters.add("@paramType{i}", type)
next i
sqlcommand.commandtext = "SELECT UserID FROM {fromclause} WHERE {whereclause}"
Вы завершаете sh командой sql, которая параметризована, и все параметры имеют заданные значения ..