ورود

View Full Version : خطا در دستورات mysql در پایتون



parvizmo
یک شنبه 19 شهریور 1391, 10:06 صبح
سلام دوستانمن میخوام با فرستادن اسم فایلی که در دیتابیس ذخیره شده است،مقدار فیلدcount همون سطر را افزایش بدمبرای اینکار از ایجکس استفاده کرده ام و نام فایل را با به صفحه ای که قرار است عملیات افزایش در آن انجام شود می فرستم:بصورت زیر:


print """
<script type="text/javascript">
function addrate() {
var request = $.ajax({
url: 'addrate.py',
type: 'GET',
data:'pathfile='+"%s",
dataType:'text'
});
request.done(function(val1) {
alert("رای مثبت شما به ثبت رسید"+val1);
$('#emtiaz').text(val1);
});
request.fail(function(jqXHR, textStatus) {
alert( "Request failed: " + textStatus );
});
}
</script>
"""%pathfile

توی فایل addrate هم کد زیر را نوشته اما اما خطا میده :


#!/python26/python
# -*- coding:utf-8 -*-
import MySQLdb,cgi
print 'content-type:text/html\n'
con=MySQLdb.connect("localhost","root","","python")
cur = con.cursor()
form=cgi.FieldStorage()
filename=form.getvalue("pathfile")
with con:
cur.execute("select count from emtiaz where filename=%s"%filename)
r=cur.fetchone()
for row in r:
row+=1
rate=row
cur.execute("UPDATE emtiaz SET count=%d where filename=%s"%(rate,filename))
con.close()
print rate

هنگام اجرا خطاهای زیر رو میده:



Traceback (most recent call last):
File "C:/xampp/htdocs/myproject/addrate.py", line 10, in <module>
cur.execute("select count from emtiaz where filename=%s"%filename)
File "C:\Python26\lib\site-packages\MySQLdb\cursors.py", line 173, in execute
self.errorhandler(self, exc, value)
File "C:\Python26\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler
raise errorclass, errorvalue
_mysql_exceptions.OperationalError: (1054, "Unknown column 'None' in 'where clause'")


لطفا راهنمایی کنید

pykello
یک شنبه 16 مهر 1391, 17:56 عصر
گمان کنم مشکل این است که در query مقدار filename در داخل single quote قرار نگرفته. یک راه این است که به صورت زیر تغییر دهید:

cur.execute("select count from emtiaz where filename='%s' "%filename)

راه دیگر این است که از prepared statements طبق صورتی که صورتی که در اینجا (http://zetcode.com/databases/mysqlpythontutorial/) ذکر شده عمل کنید. یعنی:

cur.execute("select count from emtiaz where filename=%s ", (filename, ))

که مزیت اینکار احتمالا این است که جلوی SQL Injection را می گیرد. دقت کنید که در این روش از single quote استفاده نشده است.