как сохранить данные запроса в переменных в ColdFusion для последующего использования?

Я пытаюсь получить и сохранить идентификаторы для каждого элемента, полученного из моей таблицы, чтобы я мог использовать эти идентификаторы позже. Я попытался вложить запросы, но это не сработало. Вот мой первый запрос:

<CFQUERY datasource="MyDSN" name="MAIN2"> SELECT * from order_items where orderID= #orderID#</CFQUERY>

Теперь, если я выведу этот запрос, он отобразит 1 и 117, которые являются двумя идентификаторами, которые мне нужны.

Мой следующий запрос:

<CFQUERY datasource="MyDSN" name="MAIN3">select c.catalogueID,
c.product_name,
c.product_price,
c.description,
p.productID

from products p
join product_catalogue c on c.catalogueid = p.catalogueid
where p.productid = "#productID#"</CFQUERY>

Но он говорит мне, что productID не определен, он явно пуст. Я только начинаю использовать ColdFusion, поэтому я не уверен, что это лучший способ сохранить нужные мне значения, поэтому я использую их снова. Мне также нужно зациклить второй запрос для каждого ID 1 и 117, то есть дважды.

Любые предложения о том, как это сделать, будут очень признательны.

Спасибо


person deucalion0    schedule 06.05.2012    source источник


Ответы (2)


Мое основное правило заключается в том, что если я обнаружу, что использую запросы для создания других запросов или зацикливаюсь на запросе для выполнения других запросов; пришло время подумать об объединении запросов.

Я не уверен, какое поле вы используете в запросе MAIN2 для подачи запроса MAIN3. Итак, я вставил «productID» в запрос ниже. Возможно, вам придется изменить его, чтобы оно соответствовало имени вашего поля.

<CFQUERY datasource="MyDSN" name="MAIN3">select c.catalogueID,
c.product_name,
c.product_price,
c.description,
p.productID

from products p
join product_catalogue c on c.catalogueid = p.catalogueid
where p.productid IN (SELECT DISTINCT productID from order_items where orderID= <cfqueryparam value="#orderID#" cfsqltype="CF_SQL_INTEGER">)
</CFQUERY>

Вы также можете изменить этот запрос, чтобы использовать «объединение» для подключения [order_items] к запросу.

Наконец, вы должны использовать тег <cfqueryparam> для предложений where; это помогает защитить ваш запрос от атак SQL-инъекций.

person Scott Jibben    schedule 07.05.2012
comment
Отличный совет, спасибо, я проверил ваш ответ, и это сработало. Спасибо - person deucalion0; 07.05.2012

Всякий раз, когда я кэширую данные для последующего использования, я обычно спрашиваю себя, как я буду использовать эти данные и принадлежат ли они другому типу данных, а не запросу.

Например, если мне нужен набор данных, к которым я, скорее всего, получу доступ через идентификатор, я могу создать структуру, в которой ключ — это идентификатор, а данные — другая структура набора данных. Затем я сохраню эту структуру в области приложения и обновлю ее только тогда, когда это необходимо. Это молниеносно, и с ним гораздо проще работать, чем запрашивать его каждый раз. Это особенно полезно, когда запрос, который создает исходный набор данных, является ресурсоемким с большим количеством соединений, подзапросов, волшебных хранимых процедур между базами данных, но возвращаемые наборы данных на самом деле довольно малы.

Таким образом, создание структуры продуктов будет выглядеть примерно так:

<CFQUERY datasource="MyDSN" name="MAIN3">
  SELECT 
    c.catalogueID,
    c.product_name,
    c.product_price,
    c.description,
    p.productID
  FROM products p
  JOIN product_catalogue c 
  ON c.catalogueid = p.catalogueid
  WHERE p.productid = <cfqueryparam value="#ProductID#" cfsqltype="cf_sql_integer">
</CFQUERY>

<cfset products = structNew() />
<cfset item = structNew() />
<cfloop query="MAIN3">
   <cfif NOT structKeyExists(products, productID)>
      <cfset item = structNew() />
      <cfset item.catalogueID = catalogueID />
      <cfset item.product_name = product_name />
      <cfset item.product_price = product_price />
      <cfset item.description = description />
      <cfset products[productID] = structCopy(item) />
   </cfif>
</cfloop>

<cfset application.products = structCopy(products) />
person Sharondio    schedule 07.05.2012
comment
Спасибо за Ваш ответ! Я приму к сведению то, что вы предлагаете, и, надеюсь, когда-нибудь воспользуюсь этим! Спасибо! :) - person deucalion0; 07.05.2012