اذهب إلى المحتوى

السؤال

نشر

أريد أن أقوم بتخزين وإحضار بعض البيانات من قاعدة بيانات SQLite وأقوم بإستعمال formatted string لوضع المتغيرات في جملة SQL لكن أعتقد أن هذه الطريقة غير صحيحة وقد تسبب مشكلة إن قام المستخدم بإدخال علامات تنصيص ' " على سبيل المثال، لذلك كيف أقوم بإستخدام المتغيرات في جمل SQL بطريقة صحيحة

هذا هو الكود الخاص بي:

setting = input("Change settings")
cr.execute(f"SELECT * FROM settings WHERE id = {setting}")

 

Recommended Posts

  • 1
نشر

عندما نريد تمرير أكثر من متغير، نمرر tuple كوسيط ثاني للدالة execute:

في MySQLdb:

cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))

أما في sqlite3:

cursor.execute("INSERT INTO table VALUES (?, ?, ?)", (var1, var2, var3))

ويمكن استخدام النمط الذي يدعم التسمية:

(:var1, :var2, :var3) or (%(var1)s, %(var2)s, %(var3)s)

 

  • 0
نشر

هناك عدة طرق في بايثون لإضافة متغيرات variables في سلاسل نصية string وهذه بعض الطرق

بإستخدام التسلسل concatenation

setting = input("Change settings")
cr.execute("SELECT * FROM settings WHERE id = " + setting)
setting = input("Change settings")
cr.execute("SELECT * FROM settings WHERE id = " + str(setting))

بإستخدام العامل %

setting = input("Change settings")
cr.execute("SELECT * FROM settings WHERE id =%s"%setting)

بإستخدام format

setting = input("Change settings")
cr.execute("SELECT * FROM settings WHERE id ={}".format(setting))

بإستخدام f-string

setting = input("Change Settings ")
print(f"SELECT * FROM settings WHERE id ={setting}")
  • 1
نشر

بالفعل، فمن الخطأ أن تقوم بإستخدام المتغيرات بداخل جملة SQL مباشرة خصوصًا إذا كان المتغير يحتوي على مدخلات من المستخدم، والحل هو إستخدام Bindings أي تمرير المتغيرات أثناء تنفيذ جملة SQL وهذا اللأمر يحمي البرنماج من ثغرة SQL injection التي قد تؤدي إلى تسريب أو حذف البيانات من قاعدة البيانات.

يمكنك إستخدام هذه الطريقة من خلال تمرير مدخل ثاني يكون عبارة عن قائمة أو Tuple من المتغيرات المستخدمه في جملة SQL بنفس الترتيب، كالتالي:

cursor.execute("SELECT * FROM settings WHERE id = ?", (setting,))

لاحظ تم إضافة فاصلة , بعد كلمة setting عند إستخدام متغير واحد فقط.

كما يمكنك أن تستخدم متغيرات تحمل مسميات لتسهل  هذا الأمر كالتالي:

cursor.execute("SELECT * FROM settings WHERE id = :id AND name = :name", {'id': 15, 'name': 24})

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...