cfqueryparam
является заполнителем значения для подготовленного утверждения. Нельзя использовать заполнители значений для имен таблиц или столбцов, потому что подготовленный оператор требует, чтобы запрос был завершен и действителен до того, как будут введены какие-либо значения. Одна из целей разработки подготовленных операторов заключается в предотвращении злонамеренного внедрения путем разделения запроса и значений. Разделение достигается отправкой запроса без фактических значений, сначала (заполнители значений обычно обозначаются знаком вопроса ?
), анализируют сервер SQL и понимают его (интерпретатор запросов), а затем ждут, когда данные будут помещены в подготовлено значение слотов. Это также дает выигрыш в производительности, поскольку сервер SQL может повторно использовать уже интерпретированные запросы при отправке простого строкового оператора с запросом, а значения всегда требуют его повторного анализа.
Для решения вашей проблемы вам потребуется чтобы очистить имена таблиц, используя соответствующий компоновщик команд / квотер (зависит от поставщика SQL, проверьте драйвер JDB C) или проверьте имя вручную.
Если вам нужно go при ручном способе вы должны быть консервативны и разрешать вводить только надежные символы, такие как буквы алфавита c, цифры, подчеркивания и дефисы. Учтите это:
<cfloop list="#tableList#" index="t">
<!--- make sure the table name only consists of alphabetic letters, digits, underscores and hyphens --->
<cfif not reFind("^[a-zA-Z0-9_-]+$", t)>
<cfthrow message='The specified table name, which is "#t#", contains illegal characters.'>
</cfif>
<cfquery name="getcount" datasource="erisnetselect">
SELECT COUNT(*) FROM AUDITOR.#t#
</cfquery>
...