Hey Dave,

The root of our differences here is that we're designing the
application differently - it affects both the upload and the insert,
and the same logic I used in my insert can (and, imho, should) be used
in the upload portion.

On a really low level, your design has a table that looks like this:

tblProductImages
-------------------------
ProductId
ImageFileName1
ImageFileName2
ImageFileName3

If I understand correctly, you'd do this to handle the upload:

<cffile action="upload" formfield="ImageFileName1"...>
<cfset ImageFileName1 = cffile.serverFile>
<!--- do it again --->
<cffile action="upload" formfield="ImageFileName2"...>
<cfset ImageFileName1 = cffile.serverFile>
<!--- do it...again --->
<cffile action="upload" formfield="ImageFileName3"...>
<cfset ImageFileName3 = cffile.serverFile>

And this for your insert:

<cfquery...>
  INSERT INTO tblProductImages (ImageFileName1, ImageFileName2, ImageFileName3)
  VALUES (...)
</cfquery>

And if you needed all image file names:

<cfquery name...>
  SELECT ImageFileName1, ImageFileName2, ImageFileName3
  FROM tblProductImages
  WHERE productId = ....
</cfquery>

What Scott means by this being a "static" design is that the number of
images per product supported by your application is a static value,
unable to be changed without changing code.  Why trap yourself like
this?  One of the reasons relational databases _exist_ is to avoid
situations like this.

This is a design that would be more of a best practice:

tblProductImages
-------------------------
ProductId
ImageFileName

Then, in your app, have a configuration variable that stores how many
images are allowed per product.  Let's say that's stored in a variable
called, well, "maxProductImages".

First, we put our upload and insert into one loop:

<cfloop from="1" to="#maxProductImages#" index="i">
  <cffile action="upload" formfield="ImageFileName#i#"...>
  <cfquery...>
    INSERT INTO tblProductImages (ImageFileName)
    VALUES ('#cffile.serverfile#')
  </cfquery>
</cfloop>

Much more streamlined, and you can just change maxProductImages
instead copying/pasting code, introducting typos, etc.

And if you needed all image file names:

<cfquery name...>
  SELECT ImageFileName
  FROM tblProductImages
  WHERE productId...
</cfquery>

Don't let your design box you in.  If you're repeating code, there's
likely to be a better way to do it - try to find it!  Numbered
fieldnames like "ImageFile1, ImageFile2, ImageFile3" or
"FavoriteUrl[1-17]" should set off warning klaxons.

Finding better design now also makes the future a lot less painful. 
If your client suddenly wanted to choose a "preferred" image to show
on the product's main page, you'd have a few different options.

One would be to add a new column to tblProductImages that says which
other column is preferred.  Yuck - you'd have to do something like two
queries or a subquery to find out what the preferred column name was.

Another would be to created a tblPreferredProductImages that kept
track of which column currently kept track of which image is preferred
for a given product.  Again, selects would get ugly and costly.

The design I suggest, and that I think most developers would prefer,
make it easy and elegant.  You'd just add a "Preferred" column to
tblProductImages that was a simple bit flag, and do "SELECT
ImageFileName FROM tblProductImages WHERE productId = #productId# AND
Preferred = 1".  It's elegant, it's quick, and doesn't affect our
existing design or queries in the slightest.  And yes, I skipped using
cfqueryparam to avoid monkeying up the example.

Have a good night, I've finished my beer now.

-Joe

-- 
For Tabs, Trees, and more, use the jComponents:
http://clearsoftware.net/client/jComponents.cfm

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Purchase Contribute 3 from House of Fusion, a Macromedia Authorized Affiliate 
and support the CF community.
http://www.houseoffusion.com/banners/view.cfm?bannerid=53

Message: http://www.houseoffusion.com/lists.cfm/link=i:4:190183
Archives: http://www.houseoffusion.com/cf_lists/threads.cfm/4
Subscription: http://www.houseoffusion.com/lists.cfm/link=s:4
Unsubscribe: 
http://www.houseoffusion.com/cf_lists/unsubscribe.cfm?user=11502.10531.4
Donations & Support: http://www.houseoffusion.com/tiny.cfm/54

Reply via email to