Использование данных массива для детализации запроса - PullRequest
0 голосов
/ 11 декабря 2011

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

product array. Как лучше всего использовать эту информацию для запроса моей базы данных, мой запрос будет

<cfquery name="getRecent" datasource="#application.dsn#">
SELECT uid_product,txt_product_name
FROM tbl_products
</cfquery>

Я думал о выводе массива в виде списка и использовании оператора IN, но не уверен, что это правильный способ, кажется немного громоздким?Могу ли я использовать запрос запросов с использованием данных массива?Если да, то какие-нибудь указатели?

Ответы [ 2 ]

2 голосов
/ 11 декабря 2011

Если вы просто поддерживаете список идентификаторов продуктов, то вам не нужно использовать массивы или структуры, вы можете просто сохранить их как простой список и запросить их следующим образом:

<cfset recentProducts = "4,5" />

<cfquery name="getRecent" datasource="#application.dsn#">
    SELECT uid_product,txt_product_name
    FROM tbl_products
    where productID IN (<cfqueryparam cfsqltype="cf_sql_integer" value="#recentProducts#" list="true" />)
</cfquery>
1 голос
/ 11 декабря 2011

Во-первых, если вы не собираетесь добавлять дополнительные элементы в структуру, я бы сказал, что наличие структуры для хранения ProductID кажется чрезмерным.Я бы просто имел массив с productID в качестве каждого элемента, без структуры.

Таким образом, ваш массив структурирован как:

[
  {  ProductID= 4 },
  {  ProductID= 5 },
  ...
]

Я бы предложил вам просто сделать:

[4,5]

Это облегчит следующий шаг.Прямо сейчас я бы сказал, что вам нужно перебрать массив, добавив каждый productID в список, который вы затем сможете использовать в своем запросе.Затем измените исходный запрос, чтобы использовать этот список (запомните и используйте cfqueryparam).

<cfset lstIDs = "">
<cfloop index="productStruct" array="#productsArray#">
  <cfset lstIDs = listAppend(lstIDs, productStruct.ProductID)>
</cfloop>

<cfquery name="getRecent" datasource="#application.dsn#">
SELECT uid_product,txt_product_name
FROM tbl_products
WHERE productID IN <cfqueryparam value="#lstIDs#" cfsqltype="CF_SQL_INTEGER" list="yes">
</cfquery>

Или, если вы упростите свой массив, просто сделайте ArrayToList для достижения того же самого.

<cfquery name="getRecent" datasource="#application.dsn#">
SELECT uid_product,txt_product_name
FROM tbl_products
WHERE productID IN <cfqueryparam value="#ArrayToList(productsArray)#" cfsqltype="CF_SQL_INTEGER" list="yes">
</cfquery>
...