| By Bruce Van Horn | Article Rating: |
|
| November 19, 2002 12:00 AM EST | Reads: |
10,252 |
Can you believe it's December already? 2002 was certainly a year of big changes for many CFers as Macromedia released the new MX products. Many of us scrambled to come up to speed on the new changes in CFMX. However, the fundamentals of CF programming didn't really change. The newcomer to CF still has to learn the basic CF tags, functions, and logic that were in previous versions before tackling the new features. With that in mind, here are two questions that came in recently that address some basics that CFers deal with every day.
Q: I'm having trouble with a nested loop. The code shown in Listing 1 should - if I understand the way CF does loops - output both "house" and "mouse" in that order. However, when I run the code, it only outputs "house". Any insight?
Listing 1
<cfloop list="car, boat, house, plane, mouse" index="outer">
<cfloop list="mouse, house, dog, cat" index="inner">
<cfif #outer# IS #inner#>
<cfoutput>#inner#</cfoutput>
</cfif>
</cfloop>
</cfloop>
A: Great question. The answer is easy, but elusive. The problem is the spaces in your lists. In the first (outer) list, the value of element 1 is "car", but the value of element 2 is " boat" (notice the space that follows the comma). CF includes the spaces as part of the value of the list element. In the first list, the value that you think is "mouse" is actually " mouse", whereas it is "mouse" in the second list. Therefore " mouse" will never equal "mouse" and thus doesn't appear in the output.
The solution could simply be to remove all spaces from your lists, but that often isn't practical if you aren't in control of the list's source. The better solution is to use the Trim() function when evaluating your list elements. The Trim() function eliminates any leading or trailing spaces from a value. As a side note, the #s are not necessary inside a CFIF tag (or any CF tag or function for that matter) when evaluating the value of a variable, and your CFOUTPUTs should be outside of the loops. Listing 2 will give you the result you desire.
Listing 2
<cfoutput>
<cfloop list="car, boat, house, plane, mouse" index="outer">
<cfloop list="mouse, house, dog, cat" index="inner">
<cfif Trim(outer) IS Trim(inner)>#inner#</cfif>
</cfloop>
</cfloop>
</cfoutput>
Q: I'm looking for a way to do a database search from a form page where the user can input more than one item in a text input box (separated by commas) and have the query search of each item in the list. For example, in the user input "Tom, Dick, Harry", I'm trying to get the query to execute something like "SELECT * FROM TABLE WHERE Name LIKE '%Tom%' OR Name LIKE '%Dick%' OR Name LIKE '%Harry%'".How can I create the query to do what I want?
A: The question is really, "How do I dynamically build queries?" and it's an issue that CF developers need to address in almost every application. The bottom line is this: you can use CF tags nested inside your CFQUERY tag to dynamically generate the necessary SQL. For your scenario, there are several ways to solve the problem, but here's my suggestion (see Listing 3).
Listing 3
<CFQUERY NAME="qSearch" DATASOURCE="YourDNS">
SELECT * FROM TABLE
WHERE Name = 'PlaceholderText'
<CFLOOP LIST="#Form.SearchText#" INDEX="SearchItem">
OR Name LIKE '%#Trim(SearchItem)#%'
</CFLOOP>
</CFQUERY>
First, you'll need to create what I call a "placeholder" in your SQL. This is a valid SQL statement that you put immediately after the WHERE clause, but it has no real impact on your query; it's just there to make the rest of your query easier to generate. In this case, I've used the statement "WHERE Name = 'PlaceholderText'". The likelihood of having a name equal to "PlaceholderText" is pretty slim.
Next, you need to dynamically build your OR statements by looping over the list that the user submitted. For example, if your form field is called "SearchText" and they submit "Tom, Dick, Harry", you would use CFLOOP to loop over the values in Form.SearchText. Inside your loop, simply create the OR condition for your query using the value of the list index as your search criteria. Be sure to use the Trim() function to eliminate any spaces that the user may have placed after the commas. The end result will be a SQL query that contains an OR clause for each term that the user supplies.
Published November 19, 2002 Reads 10,252
Copyright © 2002 SYS-CON Media, Inc. — All Rights Reserved.
Syndicated stories and blog feeds, all rights reserved by the author.
More Stories By Bruce Van Horn
Bruce Van Horn is president of Netsite Dynamics, LLC, a certified ColdFusion developer/instructor, and a member of the CFDJ International Advisory Board.
- Oracle To Keynote Cloud Computing Expo
- Contrary Opinion: Why Silverlight is Good for Adobe
- Analytics for Adobe Air Applications
- Adobe’s Aiming ColdFusion at Multiple Clouds
- Eval JavaScript in a Global Context
- Fig Leaf Software to Exhibit at Government IT Conference & Expo
- Is Microsoft as Free as Open Source?
- Cloud Computing Journal: Adobe to Deliver ColdFusion in the Cloud
- The Planet Named “Bronze Sponsor” of Cloud Computing Expo
- Adobe Reader Sued
- AJAX World RIA Conference & Expo Kicks Off in New York City
- Adobe Enters Cloud Computing with LiveCycle
- Oracle To Keynote Cloud Computing Expo
- Social Media Terrorists
- Adobe Flash Media Server on iPhone
- Contrary Opinion: Why Silverlight is Good for Adobe
- Adobe Flash Based GetJar Surpasses a Half Billion Downloads
- Adobe ColdFusion 9 and ColdFusion Builder Public Betas Now Available
- Adobe Tries Commercializing Its Online Software
- Adobe Open Sources Flash Initiatives
- The Next Programming Models, RIAs and Composite Applications
- Where Are RIA Technologies Headed in 2008?
- Constructing an Application with Flash Forms from the Ground Up
- AJAX World RIA Conference & Expo Kicks Off in New York City
- CFEclipse: The Developer's IDE, Eclipse For ColdFusion
- Personal Branding Checklist
- Adobe Flex 2: Advanced DataGrid
- Has the Technology Bounceback Begun?
- Building a Zip Code Proximity Search with ColdFusion
- i-Technology Viewpoint: We Need Not More Frameworks, But Better Programmers


































