#coldfusion #cfquery #cfqueryparam
Вопрос:
У меня есть поле ввода флажка, в котором пользователь может выбрать несколько флажков в форме, и в зависимости от того, что он выберет, он создаст строку идентификаторов, например 10,14,35,47, и она будет отправлена в базу данных. Я могу отправить это, если просто отправлю его напрямую, как показано ниже:
user_job_type_id="#form.user_job_type_id#",
Но если я попытаюсь завернуть это в cfqueryparam, что я бы предпочел сделать, чтобы сделать его более безопасным, я получу ошибку, независимо от того, что я делаю. Независимо от того, устанавливаю ли я его в список true или false, varchar, целое число, все выдает ошибку, например cfqueryparam не принимает список.
Например, ниже не будет работать
user_job_type_id=<cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#form.user_job_type_id#" list="Yes"/>,
Что я здесь упускаю?
Комментарии:
1. В чем заключается ошибка, которую вы получаете?
2. Если вы пытаетесь выполнить поиск по нескольким идентификаторам, синтаксис sql неверен. Оператор equals
=
сравнивает только отдельные значения. Для нескольких значений используйтеIN (...)
. т. е.where user_job_type_id IN ( <cfqueryparam list ....> )
. Более подробную информацию смотрите в документации по СУБД.
Ответ №1:
Как упоминал @SOS, вам нужно использовать IN
оператор при проверке списка значений в круглых скобках. Кроме того, поскольку все значения являются целыми числами, обязательно укажите правильные cfsqltype
. Это гарантирует правильную проверку типа даты для каждого элемента в списке.
Неправильный:
user_job_type_id = <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#form.user_job_type_id#" list="Yes"/>,
Лучше:
user_job_type_id IN (<cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#form.user_job_type_id#" list="Yes"/>),
Лучшие:
user_job_type_id IN (<cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#form.user_job_type_id#" list="Yes"/>),
Комментарии:
1. Спасибо, я все же пытаюсь вставить в базу данных, а не запрашивать. Таким образом, это был бы пример: ` обновите задание пользователя, установите идентификатор типа пользователя @ job_type_id=<cfqueryparam cfsqltype=»CF_SQL_VARCHAR» значение=»#form.user_job_type_id#» список=»Да»/> где идентификатор пользователя @ job_id= #form.user_job_id# ` » Это приводит к ошибке при использовании cfqueryparam. Если я не использую cfqueryparam и делаю следующее, это работает нормально, хотя я предпочитаю использовать cfqueryparam, если это возможно: « обновите user_job, установите user_job_type_id=user_job_type_id=»#форма.user_job_type_id#», где user_job_id= #форма.user_job_id#«
2. У вас есть способ связать элементы в #form.user_job_type_id# с элементами в #form.user_job_id#? Затем пройдите по списку, чтобы выполнить вставку.
3. Список хранится в одной ячейке базы данных в виде списка, разделенного запятыми. Так что, например, это будет выглядеть как «49,56,87». Я не могу понять, почему cfqueryparam не нравится список, разделенный запятыми.
4. В этом случае удалите атрибут списка и просто вставьте его в виде строки. Атрибут списка больше подходит для
where x in ()
предложений.