توضح هذه المقالة MySQL، وهي أداة فعالة لتطوير التجارة الإلكترونية ومواقع الويب الديناميكية المعقدة الأخرى باستخدام قواعد بيانات الطرف الثالث. MySQL هو خادم SQL سريع ومتعدد الخيوط وكامل الميزات. بالإضافة إلى وصف البنية الأساسية لنظام MySQL، توفر هذه المقالة أيضًا أمثلة بسيطة مكتوبة بلغة Tcl وC++ لمساعدتك في تطوير تطبيقات الويب المدعومة بقاعدة البيانات. توضح هذه المقالة MySQL، وهي أداة فعالة لتطوير التجارة الإلكترونية ومواقع الويب الديناميكية المعقدة الأخرى باستخدام قواعد بيانات الطرف الثالث. MySQL هو خادم SQL سريع ومتعدد الخيوط وكامل الميزات. بالإضافة إلى وصف البنية الأساسية لنظام MySQL، توفر هذه المقالة أيضًا أمثلة بسيطة مكتوبة بلغة Tcl وC++ لمساعدتك في تطوير تطبيقات الويب المدعومة بقاعدة البيانات.
يمكن للتطبيق الذي يجب أن يخزن كميات كبيرة من المعلومات أو يصل إليها أن يستفيد بشكل كبير من استخدام منتج قاعدة بيانات تابع لجهة خارجية. وينطبق هذا بشكل خاص عندما يجب أن يتم الوصول إلى المعلومات في مثيلات متعددة من البرنامج. وتشكل التطبيقات المستندة إلى الويب (بما في ذلك التجارة الإلكترونية) أمثلة جيدة على ذلك.
لماذا استخدام قاعدة بيانات مستقلة؟
يجب أن يكون لدى خوادم الويب طريقة لبرامج المعالجة النصية الخاصة بها لتخزين معلومات حول حالتها للوصول إليها لاحقًا. على الرغم من أنه من الممكن استخدام أساليب أكثر بدائية - مثل تفريغ ملف نصي أو تطوير قاعدة بيانات صغيرة محلية الصنع - إلا أن تطبيق قاعدة بيانات كاملة يمكنه توفير جميع الخدمات التي يتطلبها تطبيق ويب أكثر تعقيدًا. ليس هناك فائدة كبيرة في كتابة محرك قاعدة بيانات مخصص خاص بالتطبيق نظرًا لوجود بعض حزم البرامج المتاحة مجانًا لهذا الغرض. بالإضافة إلى ذلك، فإن استخدام قاعدة بيانات تابعة لجهات خارجية يلغي أيضًا حاجة مطوري الويب إلى تكريس أنفسهم لمهمة تطوير قاعدة البيانات وصيانتها.
قاعدة بيانات ماي اس كيو ال
يمكن أن يكون دمج قواعد البيانات في تطبيقات Linux أمرًا سهلاً للغاية من خلال استخدام لغات البرمجة النصية ولغات النظام المترجمة مثل C. توفر قاعدة بيانات MySQL المتوفرة مجانًا (الموزعة بموجب ترخيص GNU العام) مجموعة متطورة من وظائف SQL ويسهل دمجها في التطبيقات. MySQL سريع ومتعدد الخيوط ويدعم معايير ANSI وODBC SQL. جنبًا إلى جنب مع برامج الطرف الثالث، تدعم MySQL الجداول الآمنة للمعاملات لتطبيقات معالجة المعاملات.
ملاحظة: ما هي معالجة المعاملات؟
المعاملة عبارة عن سلسلة من التغييرات في قاعدة البيانات والتي يجب تنفيذها ذريًا. إما أن يتم إعدامهم جميعاً، أو لا يتم إعدام أي منهم. على سبيل المثال، جميع التغييرات الضرورية في قاعدة البيانات عند بيع منتج على الويب تشكل معاملة واحدة.
تحتاج قاعدة البيانات إلى طرح كل من رصيد حساب العميل ومخزون المنتج، وإلا فإنها ستفشل ولن يتم تنفيذ أي من العمليتين.
لا ينبغي أن يؤدي تعطل الخادم لأي سبب من الأسباب إلى تنفيذ المعاملات جزئيًا. على سبيل المثال، قد تكون المبالغة في الفواتير أو عدم تسليم المنتجات أو المخزون غير الدقيق نتيجة للمعاملات المكتملة جزئيًا.
يمكن لقاعدة البيانات التي تدعم معالجة المعاملات تغليف مجموعة من تعليمات برمجية قاعدة البيانات في المعاملة. سيؤدي أي فشل أثناء تنفيذ المعاملة إلى عودة قاعدة البيانات إلى الحالة التي كانت عليها قبل بدء المعاملة.
يتم تحقيق ذلك من خلال الاحتفاظ بسجل لجميع عمليات قاعدة البيانات، بالإضافة إلى نسخة من جدول الحالة الأصلي الخاص بها، مما يسمح بعمليات التراجع في المرة التالية التي يتم فيها إعادة تشغيل الخادم بعد الفشل. يعد هذا الوقت والمساحة بمثابة مقايضة ضرورية لنظام قاعدة بيانات آمن للمعاملات.
يتحكم خادم MySQL واحد في سلسلة من قواعد البيانات، والتي يمكن الوصول إليها جميعًا بطريقة مماثلة من خلال الخادم. كل قاعدة بيانات هي في الواقع مجموعة من أي عدد من الجداول، تشبه في المفهوم مستخدمي قواعد بيانات SQL الأخرى. يتكون كل جدول من أعمدة بيانات مكتوبة. يمكن أن تكون البيانات أعدادًا صحيحة أو قيمًا حقيقية أو سلاسل أو أنواعًا أخرى، بما في ذلك التدفقات الثنائية الأولية. كل صف في الجدول هو سجل مخزن في قاعدة البيانات.
تم تصميم MySQL وتنظيمه كعميل/خادم. يمكن تشغيل خادم mysqld على أي جهاز يمكن الوصول إليه من الإنترنت (ويفضل أن يكون ذلك على نفس الجهاز مثل خادم الويب أو في أقرب وقت ممكن لضمان أوقات استجابة معقولة). يستخدم عميل MySQL طلبات الاتصال بخادم MySQL لتعديل قاعدة البيانات المملوكة للخادم أو الاستعلام عنها. في تطبيق ويب ممكّن لقاعدة البيانات، يكون عميل قاعدة البيانات هو خادم الويب أو برنامج نصي CGI تم إنشاؤه بواسطة خادم الويب. يمكن كتابة هؤلاء العملاء بلغة برمجة عالية المستوى أو لغة نظام منخفضة المستوى، طالما توجد واجهة برمجة تطبيقات لقاعدة البيانات لتلك اللغة. في Linux، يتم تنفيذ معظم لغات البرمجة النصية في لغة C، وبما أن MySQL C API موجودة، فمن السهل إضافة دعم MySQL إلى أي لغة أو أداة برمجة نصية موجودة. لقد أكملت معظم لغات البرمجة النصية هذه الخطوة بالفعل.
واجهة برمجة تطبيقات MySQL
تتوفر MySQL API بمجموعة متنوعة من اللغات، بما في ذلك جميع اللغات المستخدمة فعليًا لكتابة الواجهات الخلفية لموقع الويب. باستخدام واجهات برمجة التطبيقات هذه، يمكننا إنشاء عميل MySQL يتم التحكم فيه بواسطة خادم الويب.
تعمل واجهة برمجة التطبيقات (للوصول إلى قاعدة البيانات) في الوضع القائم على الاتصال. أول شيء يجب على العميل فعله هو فتح اتصال بخادم MySQL. يتضمن ذلك مصادقة الاتصال بشكل مناسب باستخدام اسم مستخدم وكلمة مرور معروفين للخادم. بعد إنشاء الاتصال، يقوم الخادم بتحديد قاعدة بيانات معينة لاستخدامها. بمجرد تحديد التهيئة، يكون تطبيق العميل (في حالتنا، برنامج CGI النصي من جانب الخادم) حرًا في التفاعل مع قاعدة البيانات بإحدى طريقتين: يمكنه تشغيل أوامر SQL عادية، بما في ذلك إضافة الجداول وإسقاطها، وإضافة سجلات إلى يمكنك أيضًا تشغيل الاستعلامات على قاعدة البيانات التي تُرجع النتائج. يقوم الاستعلام بإنشاء مجموعة من السجلات التي تطابق الاستعلام، ويمكن للعميل بعد ذلك الوصول إلى السجلات واحدًا تلو الآخر حتى يتم عرض كافة السجلات، أو يقوم العميل بإلغاء استرداد السجل المعلق. بمجرد انتهاء البرنامج النصي من العمل مع قاعدة البيانات، يتم إغلاق الاتصال بالخادم.
لإنشاء موقع ويب يدمج الوصول إلى قاعدة البيانات، تحتاج إلى كتابة نصوص CGI لإنشاء نتائج ديناميكية بناءً على حالة قاعدة البيانات. تقوم خوادم الويب بتشغيل برامج CGI النصية ثم تقوم بإخراج HTML المنسق بشكل مناسب إلى دفق الإخراج القياسي الخاص بها. يلتقط خادم الويب HTML ويرسله مرة أخرى إلى العميل كما لو كان الطلب لصفحة HTML ثابتة. في عملية إنشاء HTML، يمكن للبرامج النصية تعديل قاعدة البيانات، أو يمكنها الاستعلام عن النتائج ودمجها في مخرجاتها.
كمثال لشرح العملية المذكورة أعلاه بإيجاز، تقوم التعليمات البرمجية التالية (المكتوبة بلغة C وTcl) بالاستعلام عن قاعدة بيانات تحتوي على قائمة بالمنتجات المعروضة للبيع من قبل شركة ما. لا يستخدم هذا بأي حال من الأحوال جميع ميزات MySQL API في كلتا اللغتين، ولكنه يوفر مثالًا سريعًا وقابل للتوسيع بسهولة يمكنه تنفيذ أي أمر SQL على محتويات قاعدة البيانات. في هذا المثال، يعرض البرنامج النصي جميع المنتجات بسعر أقل من سعر محدد. ومن الناحية العملية، يمكن للمستخدم إدخال السعر في متصفح الويب ثم إرساله إلى الخادم. لقد استبعدنا تفاصيل القراءة من متغيرات البيئة لتحديد قيم نموذج HTML لأنها لا تختلف عن التنفيذ في برنامج نصي CGI لا يدعم قاعدة بيانات. من أجل الوضوح، نفترض أن بعض المعلمات (مثل السعر المطلوب الاستعلام عنه) قد تم تحديدها مسبقًا.
يتم تنفيذ التعليمات البرمجية التالية في Tcl باستخدام واجهة قاعدة البيانات العامة Tcl المتوفرة مجانًا. ميزة هذه الواجهة هي أن Tcl يتم تفسيرها ويمكنها تطوير التعليمات البرمجية وتعديلها بسرعة.
مثال تي سي ال
# يقوم هذا الكود بطباعة كافة المنتجات الموجودة في قاعدة البيانات
# التي تكون أقل من سعر محدد (يُفترض أنه تم تحديده
# مسبقًا، ومخزنًا في المتغير targetPrice)
# الإخراج بتنسيق جدول HTML، مناسب لمخرجات CGI
يمكن أيضًا تحميل مكتبة كائنات SQL المشتركة بواسطة مترجم Tcl
# تم تجميعها مع المكتبة، مما يجعل هذا السطر غير ضروري
تحميل /home/aroetter/tcl-sql/sql.so
#هذه الأمور محددة جيدًا مسبقًا، أو يمكن فعل ذلك
#يتم تمريرها إلى البرنامج النصي
تعيين DBNAME "clientWebSite"؛
تعيين TBLNAME "المنتجات"؛
قم بتعيين DBHOST على "backend.company.com"
مجموعة DBUSER "mysqluser"
تعيين DBPASSWD "abigsecret"
تحديد السعر المستهدف 200؛
#الاتصال بقاعدة البيانات
تعيين المقبض [sql Connect $DBHOST $DBUSER $DBPASSWD]
sql Selectdb $handle $DBNAME؛# الحصول على قاعدة بيانات اختبارية
# قم بتشغيل استعلام باستخدام كود SQL المحدد
استعلام SQL $handle "اختر * من $TBLNAME حيث السعر <= $targetPrice"
# اطبع رأس جدول HTML
يضع "<حدود الجدول=4>"
يضع "
# صفوف جدول الإخراج - يسترد كل جلب نتيجة واحدة
# من استعلام SQL
بينما {[تعيين الصف [sql fetchrow $handle]] != ""} {
مجموعة المنتج [ليندكس $row 0]
تعيين الوصف [lindex $row 1]
السعر المحدد [ليندكس $row 2]
يضع "
يضع ""
#empty المخزن المؤقت لنتيجة الاستعلام - يجب أن يكون فارغًا بالفعل في هذه الحالة
مقبض الاستعلام النهائي SQL
# أغلق اتصال قاعدة البيانات - عمليًا نفس الاتصال
# يستخدم لاستعلامات متعددة
SQL قطع اتصال مقبض $
الكود أدناه هو البرنامج النصي المكافئ المكتوب بلغة C++ باستخدام MySQL C++ API MySQL++ الرسمي. ميزة هذا الإصدار هو أنه تم تجميعه وبالتالي فهو أسرع من اللغات المترجمة. يجب كتابة كود قاعدة البيانات المستخدم بشكل متكرر على موقع معين بلغة C أو C++ ثم الوصول إليه عن طريق البرامج النصية أو مباشرة من خادم الويب لتحسين وقت التشغيل الإجمالي.
مثال C++
#يشمل
#يشمل
#يشمل
const char *DBNAME = "clientWebSite";
const char *DBTABLE = "المنتجات";
const char *DBHOST = "backend.company.com";
const char *DBUSER = "mysqluser";
const char *DBPASSWD = "abigsecret":
إنت الرئيسي () {
يحاول {
// افتح اتصال قاعدة البيانات والاستعلام
اتصال يخدع (DBNAME، DBHOST، DBUSER، DBPASSWD)؛
استعلام الاستعلام = con.query();
//اكتب رمز SQL صالحًا لكائن الاستعلام
الاستعلام << "اختر * من" << DBTABLE;
// قم بتشغيل الاستعلام وتخزين النتائج
النتيجة res = query.store();
//اكتب رأس جدول HTML
cout << "
معرف المنتج <العرض=200>الوصف" << " | السعر ($)" << endl; النتيجة :: التكرار curResult؛ // كرر كل نتيجة وضعها في جدول html | |
---|---|---|
" << صف[0] << " | " << الصف[1] << " | " << الصف[2] << endl; } |
} قبض (BadQuery إيه) {
// التعامل مع استعلام سيئ (عادة ما يكون سببه خطأ في بناء جملة SQL)
cerr << "خطأ:" << er.error << endl;
العودة -1؛
} التقاط (محول سيئ) {
// التعامل مع أخطاء التحويل خارج قاعدة البيانات أيضًا
cerr << "خطأ: لا يمكن تحويل "" << er.data << "" إلى ""
<< er.type_name << ""." << endl;
العودة -1؛
}
العودة 0؛
}
حماية
يتضمن إنشاء تطبيقات مدعومة بالويب على الويب بعض المشكلات التي يجب على المطورين مراعاتها. لا تزال جميع المشكلات المتعلقة ببرامج CGI على خادم الويب، مثل أذونات معالجة خادم الويب وفحوصات الإدخال على جانب البرنامج النصي، بحاجة إلى النظر فيها.
بالإضافة إلى ذلك، من الضروري أيضًا الحفاظ على أمان نظام قاعدة البيانات. يتضمن ذلك تأمين نظام أذونات خادم قاعدة البيانات وإجراء اتصالات آمنة من عملاء قاعدة البيانات إلى الخادم.
توفر MySQL نظام أمان متعمقًا يصفه بعض الأشخاص بأنه "متقدم ولكنه ليس قياسيًا". يسمح MySQL بالوصول إلى العميل بناءً على اسم المستخدم ومضيف العميل وقاعدة البيانات المراد الوصول إليها. لإنشاء نظام آمن، اطلب من جميع المستخدمين استخدام كلمات مرور قوية ولا تمنحهم أي وصول لا يحتاجون إليه مطلقًا. يتضمن ذلك امتيازات تبدو غير ضارة مثل امتيازات التعامل التي تسمح للمستخدم بعرض جميع العمليات الجارية، بما في ذلك تلك التي تغير كلمات مرور المستخدمين الآخرين. أفضل طريقة هي تشغيل عملية الخادم نفسها كمستخدم Unix لا يتمتع بأي امتيازات، بحيث لا يؤدي اختراق قاعدة بيانات واحدة إلى انهيار النظام بأكمله. يشبه هذا تشغيل httpd كمستخدم لا أحد بدلاً من الجذر. يتم تخزين الجداول التي تصف الوصول إلى النظام كقواعد بيانات MySQL منفصلة ويمكن تحديثها بواسطة مستخدم MySQL الجذر. لاحظ أن خادم MySQL يمنح امتيازات بناءً على أسماء مستخدمي MySQL، والتي تختلف عن أسماء مستخدمي Unix. ومع ذلك، هناك اسم مستخدم جذر MySQL، والذي يتمتع بالأذونات الكاملة لقاعدة البيانات. بمجرد أن يحدد الخادم من هم العملاء المتصلين وما يحاولون الاتصال به، يتم التحكم في الوصول بناءً على مجموعة معينة من الأذونات. لمنع انتحال أسماء المضيفين في جدول الوصول بواسطة DNS، يمكنك إدخال عناوين IP الخاصة بجميع المضيفين، أو مطالبة الخادم بإعادة تحليل عناوين IP إلى أسماء المضيفين الأصلية لجعل الأمر أكثر صعوبة على الآخرين لاعتراض طلبات DNS وإجاباتها .
بالإضافة إلى جداول الوصول إلى الخادم، يجب أن يكون الاتصال بالخادم آمنًا أيضًا. عند تسجيل الدخول إلى الخادم من العميل، لا يتم إرسال كلمة المرور بنص عادي، ومع ذلك، سيتم إرسال كافة أوامر SQL اللاحقة بنص عادي. لمزيد من الأمان، استخدم ssh لإعداد إعادة توجيه المنفذ. فهو يقوم بتشفير جميع الاتصالات بين الخادم والعميل، مما يمنع أي شخص من مراقبتها أثناء النقل. يتم إرسال البيانات من العميل إلى المنفذ الموجود على الجهاز المحلي للعميل حيث يستمع خادم ssh المحلي. يتم استخدامه من قبل خادم ssh المحلي، ويتم تشفيره وإرساله إلى خادم ssh البعيد، الذي يقوم بفك تشفيره وإعادة توجيهه إلى منفذ خادم MySQL.
من الناحية العملية، الطريقة الأكثر أمانًا هي تشغيل خادم قاعدة البيانات على نفس جهاز خادم الويب والسماح لنصوص CGI التي تم إنشاؤها بواسطة خادم الويب بالتواصل مع خادم MySQL عبر مآخذ توصيل UNIX (الأصلية). يسمح هذا الإعداد لمسؤول قاعدة البيانات بتعطيل جميع الاتصالات عن بعد بخادم MySQL. إذا كان يجب أن تكون خوادم الويب وقواعد البيانات موجودة على أجهزة مختلفة، فقم بتشفير جميع الاتصالات بينهما، أو قم بتوصيل الجهازين من خلال شبكاتهما المخصصة والمعزولة فعليًا. قم بإنشاء حساب مستخدم واحد فقط (بخلاف المستخدم الجذر) يستخدمه خادم الويب لتسجيل الدخول إلى خادم قاعدة البيانات.
تعد مواقع الويب المستندة إلى قواعد البيانات أدوات قوية تسمح للمطورين بإنشاء مواقع ديناميكية توفر معلومات محدثة وتسمح باستمرار التغييرات التي يبدأها العميل عبر جلسات متعددة. يعد استخدام قواعد البيانات الخلفية أمرًا ضروريًا لإدارة مستخدمي التجارة الإلكترونية والتطبيقات الأخرى. باستخدام البرامج المتاحة مجانًا، من الممكن إنشاء موقع يعتمد على قاعدة البيانات ويدمج بشكل آمن اتصال قاعدة البيانات في بنية CGI الموجودة بالموقع.