Something More Elegant
Victor Subervi
victorsubervi at gmail.com
Sat Jan 9 09:01:25 EST 2010
On Sat, Jan 9, 2010 at 8:39 AM, Tim Chase <python.list at tim.thechases.com>wrote:
> Victor Subervi wrote:
>
>> Hi;
>> The following code works fine. I would like you to suggest something more
>> simple and elegant:
>>
>> sql = 'select p.ID from %sPackages p join %sCategoriesPackages c
>> where
>> c.CategoryID=%s;' % (store, store, categoryID)
>> cursor.execute(sql)
>> tmp = [itm[0] for itm in cursor]
>> packageIDs = []
>> for t in tmp:
>> if t not in packageIDs:
>> packageIDs.append(t)
>>
>
> You mean like
>
> sql = "select distinct p.ID from ..." % (...)
>
Oh, that's good!
> # ^^^^^^^^
> cursor.execute(sql)
> package_ids = [row[0] for row in cursor.fetchall()]
>
> It would also help if you didn't pass the categoryID as a string-formatted
> value, but as a proper parameter, something like
>
> sql = "... where c.categoryid=?" % (store, store)
> cursor.execute(sql, (category_id,))
>
I now have the following:
sql = 'select distinct p.ID from %sPackages p join
%sCategoriesPackages c where c.CategoryID=?;' % (store, store)
cursor.execute(sql, (categoryID,))
packageIDs = [itm[0] for itm in cursor]
It threw this error:
/var/www/html/angrynates.com/christians/cart/display.py
141 print '</td></tr></table>\n'
142 cursor.close()
143 bottom()
144
145 display()
display = <function display>
/var/www/html/angrynates.com/christians/cart/display.py in display()
109 categoryID = cursor.fetchone()[0]
110 sql = 'select distinct p.ID from %sPackages p join
%sCategoriesPackages c where c.CategoryID=?;' % (store, store)
111 cursor.execute(sql, (categoryID,))
112 packageIDs = [itm[0] for itm in cursor]
113 for pid in packageIDs:
global cursor = <MySQLdb.cursors.Cursor object>, cursor.execute = <bound
method Cursor.execute of <MySQLdb.cursors.Cursor object>>, sql = 'select
distinct p.ID from productsPackages p join productsCategoriesPackages c
where c.CategoryID=?;', categoryID = 1L
/usr/lib64/python2.4/site-packages/MySQLdb/cursors.py in
execute(self=<MySQLdb.cursors.Cursor object>, query='select distinct p.ID
from productsPackages p join productsCategoriesPackages c where
c.CategoryID=?;', args=(1L,))
146 query = query.encode(charset)
147 if args is not None:
148 query = query % db.literal(args)
149 try:
150 r = self._query(query)
query = 'select distinct p.ID from productsPackages p join
productsCategoriesPackages c where c.CategoryID=?;', db = <weakproxy at
0x2b79db9dc470 to Connection>, db.literal = <bound method Connection.literal
of <_mysql.connection open to 'localhost' at 142be8b0>>, args = (1L,)
TypeError: not all arguments converted during string formatting
args = ('not all arguments converted during string formatting',)
> This helps prevent SQL-injection attacks (assuming you have full control
> over the value of "store"...otherwise, as you've been advised, if the remote
> user has control over the value in "store", you're asking to be exploited).
>
They have control over it. I pass it in the url. Please advise.
> You'd have to check the place-holder character for your particular
> back-end:
>
> >>> import <your database engine> as db
> >>> print db.paramstyle
>
> Printed "format". What's that mean? I use MySQLdb
TIA,
beno
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20100109/f7c7f13e/attachment-0001.html>
More information about the Python-list
mailing list