0

Coldfusion8/MySQLサイトをアップグレードしようとしています。このサイトには複雑な検索があり、(他の基準の中でも)テキスト文字列を取得してキーワードテーブルで検索します。

全文検索には多くの追加条件があるため、全文検索は行いたくありません。私が探しているのは、以下をより「動的」にすることです。これは、自分自身をxy単語に限定せず、それによってこれを少し短くする可能性があります(完全な検索にはこのようなブロックがたくさんあります)。

だから、私は次のような検索文字列を持っていると言います

I'm looking for something

私は現在これを行っています:

<!--- params --->
<cfparam name="s01" default="">
<cfparam name="s02" default="">
<cfparam name="s03" default="">    
<cfparam name="s04" default="">
<cfparam name="s05" default="">

<!--- get length of search string --->
<cfset howManyWords = ListLen(textSearch," ")>

<!--- assign words to params --->
<cfif howManyWords gt 0><cfset s01 = trim(ListGetAt(textSearch, 1," "))></cfif>
<cfif howManyWords gt 1><cfset s02 = trim(ListGetAt(textSearch, 2," "))></cfif>
<cfif howManyWords gt 2><cfset s03 = trim(ListGetAt(textSearch, 3," "))></cfif>
<cfif howManyWords gt 3><cfset s04 = trim(ListGetAt(textSearch, 4," "))></cfif>
<cfif howManyWords gt 4><cfset s05 = trim(ListGetAt(textSearch, 5," "))></cfif>

私の検索クエリでは、検索文字列を3つのデータベースフィールドに一致させています。

...
<cfif textSearch neq "">
    <cfif s01 neq "">AND (a.textSearch LIKE "%#s01#%" OR a.textSearch_xl LIKE "%#s01#%" OR a.ean = "#s01#")</cfif>
    <cfif s02 neq "">AND (a.textSearch LIKE "%#s02#%" OR a.textSearch_xl LIKE "%#s02#%" OR a.ean = "#s02#")</cfif>
    <cfif s03 neq "">AND (a.textSearch LIKE "%#s03#%" OR a.textSearch_xl LIKE "%#s03#%" OR a.ean = "#s03#")</cfif>
    <cfif s04 neq "">AND (a.textSearch LIKE "%#s04#%" OR a.textSearch_xl LIKE "%#s04#%" OR a.ean = "#s04#")</cfif>
    <cfif s05 neq "">AND (a.textSearch LIKE "%#s05#%" OR a.textSearch_xl LIKE "%#s05#%" OR a.ean = "#s05#")</cfif>
</cfif>
...

質問:
これをより動的にする方法はありますか?たとえば、ループを使用して、5つの単語にとらわれないようにする方法はありますか?この場合、パラメータ値をどのようにプリセットしますか?

手伝ってくれてありがとう!

4

2 に答える 2

4

検索用語をクエリ内のリストとしてループすることで展開できます。SQLインジェクション攻撃を防ぐためにクエリパラメータも使用する必要があります。

<cfloop list="#textSearch#" index="word" delimiters=" ">
  AND (
    a.textSearch LIKE <cfqueryparam cfsqltype="cfsql_varchar" value="%#word#%"> 
    OR a.textSearch_xl LIKE <cfqueryparam cfsqltype="cfsql_varchar" value="%#word#%">  
    OR a.ean = <cfqueryparam cfsqltype="cfsql_varchar" value="#word#"> 
  )
</cfloop>
于 2012-05-20T20:11:12.463 に答える
1

代替を使用して単純な正規表現を作成してから、MySQLのREGEXP演算子を使用できます。SQLで次のようなものが必要になります。

and (a.textSearch regexp 'a|b|c|...' or a.textSearch_xl regexp 'a|b|c|...' or a.ean regexp 'a|b|c|...')

ここab、、、、c...はあなたが探しているものです。物事のColdFushion側はわかりませんが、正規表現の作成はかなり簡単なはずです。

于 2012-05-20T20:14:20.490 に答える