Я унаследовал сайт coldfusion8, который использует некоторые функции поиска.Как преобразовать строку цикла coldfusion в хранимую процедуру MySQL?
Я пытаюсь хранить стандартизованные запросы базы данных в хранимых процедурах. Так как я новичок на обоих Coldfusion и MySQL я теперь интересно, могу ли я сделать это в MySQL:
<cfquery datasource="db" name="find_cats">
SELECT wg.no, wg.type, wg.keywords, wg.lang
FROM cats AS wg
<cfloop list="searchForm.cats_search_string" delimiters=", " item="tag">
WHERE wg.keywords LIKE <cfqueryparam value='%#tag#%' cfsqltype='cf_sql_varchar'> AND
</cfloop>
wg.lang = <cfqueryparam value="#Session.lang#" cfsqltype="cf_sql_varchar">
</cfquery>
<cfset cond_cats = "AND (1=2">
<cfoutput query="find_cats">
<!--- check if found category belongs to either AAA or BBB classifcation --->
<cfif wg.type is "AAA">
<cfset cond_cats = cond_cats & " OR categoryID1 = #wg.no#">
</cfif>
<cfif wg.typ is "BBB">
<cfset cond_cats = cond_cats & " OR categoryID2 = #wg.no#">
</cfif>
</cfoutput>
<cfset cond_cats = cond_cats & ")">
Поиск может быть либо ключевое слово или индекс (AAA, BBB) на основе. Я все еще пытаюсь понять, что happending, но до сих пор я думаю, что если пользователь вводит строку, как:
string1, string2, string3 string4
Первая часть петли через четыре строки (разделитель запятая и пробел) и querys базу данных для соответствие ключевых слов. Затем он создает новую переменную cond_cats, которая используется, когда происходит фактический поиск. Я предполагаю, что это заменяет строку поиска, с соответствующими категориями, но я не уверен, что здесь, как и результат будет
AND (1=2 OR category1 = 12345 OR category2 = 88888)
прилагается к фактическому поисковому запросу.
Мои вопросы:
Есть ли способ в MySQL, чтобы разделить введенную пользователем строку поиска, так что я смог запустить цикл? Вторая часть должна быть параметром хранимой процедуры, не так ли? Если это выполняется перед каждым поиском, должно ли оно быть хранимой процедурой вообще или я должен продолжать использовать запрос базы данных?
Спасибо за ввод!
Спасибо за информацию. Не уверен, что это помогает, но я могу использовать значениеList. – frequent
Ну, это звучит так, будто ваш вопрос был «будет ли это лучше, чем хранимая процедура?» ИМО №. Таким образом, приведенный выше код демонстрирует, как писать cfquery более эффективно * и безопасно * (без всякой конкатенации, то есть динамической sql). Но не стесняйтесь оставлять вопрос открытым какое-то время, чтобы получить другие мнения. – Leigh
Извините. Я не был ясен. На вопрос ответили правильно. В моем примере кода была ошибка, поэтому ваш фрагмент работает для ошибочного кода примера. Проблема в категорииID1 должна быть категорииID1 и cateogryID2. ID1 - это название классификации продуктов для спортивных товаров, ID2 для одежды. Поэтому мне нужно проверить, соответствует ли какое-либо из ключевых слов какой-либо категории в обоих индексах, и возвращать номер категории в каждом индексе (если таковой имеется). Мой пример только опросил ID1, поэтому IN будет работать. Я не нашел способ использовать его с двумя отдельными идентификаторами. Я отредактировал мой вопрос. Еще раз спасибо за ваш вклад! – frequent