You're requesting the same form variables on each iteration. Besides that, interpolation occurs where you declare and assign the SQL statement -- not when you "re-assign" to $quantity and $gross_sales. Print $sql2 in the loop to see.
Placeholders are definitely the way to go -- though I've never used FreeTDS, I know that DBI emulates placeholders for databases that don't support them natively.
As for iterating over form variables, you're looping over the contents of the files named in @ARGV, or STDIN, which isn't what you want. I bet your loop contents aren't being executed once.
You need to figure out how to iterate over your form variables. If they have programmatic names, that's one way. If they have the same name, you'll have to read their contents into arrays. It's hard to say without seeing the HTML form.