MySQLi
امتداد MySQLi ( MySQL المحسّن) هو برنامج تشغيل لقواعد البيانات العلائقية يُستخدم في لغة البرمجة النصية PHP لتوفير واجهة مع قواعد البيانات المتوافقة مع بروتوكول MySQL ( MariaDB ، MySQL ، Percona Server ، TiDB ). [ 1 ] [ 2 ]
يُعدّ MySQLi إصدارًا مُحسّنًا من برنامج تشغيل MySQL القديم الخاص بلغة PHP، ويُقدّم مزايا عديدة. [ 3 ] يُوصي مُطوّرو لغة البرمجة النصية PHP باستخدام MySQLi عند التعامل مع إصدارات خادم MySQL 4.1.3 والإصدارات الأحدث، نظرًا لاستفادته من الوظائف الجديدة. [ 3 ]
التفاصيل الفنية
يتألف كود PHP من نواة أساسية، مع إضافات اختيارية لوظائفها الأساسية. أما إضافات PHP المتعلقة بـ MySQL، مثل إضافة MySQLi وإضافة MySQL، فتُنفذ باستخدام إطار عمل إضافات PHP.
يوفر ملحق MySQLi مزايا متنوعة مقارنة بسابقه، وأبرزها (وفقًا لموقع PHP الإلكتروني [ 3 ] ) هي:
- واجهة كائنية التوجه
- دعم البيانات المعدة مسبقاً
- دعم عبارات متعددة
- دعم المعاملات
- دعم مُحسّن لتصحيح الأخطاء
مقارنة الميزات
المصدر: [ 3 ]
هناك ثلاثة خيارات رئيسية لواجهة برمجة التطبيقات (API) عند التفكير في الاتصال بخادم قاعدة بيانات MySQL :
- امتداد MySQLi الخاص بلغة PHP
- كائنات بيانات PHP (PDO)
- امتداد MySQL الخاص بلغة PHP
| امتداد MySQLi الخاص بلغة PHP | منتج منشأ محمي | امتداد MySQL الخاص بلغة PHP | |
|---|---|---|---|
| تم طرح إصدار PHP | 5.0 | 5.0 | ما قبل الإصدار 3.0 |
| مضمن في PHP 5.x | نعم | نعم | نعم |
| مضمن في PHP 7.x | نعم | نعم | لا |
| حالة التطوير | التطوير النشط | التطوير مستمر اعتبارًا من PHP 5.3 | تم إيقاف استخدامها في PHP 5.5، وتمت إزالتها في PHP 7.0 |
| توصي به MySQL للمشاريع الجديدة | نعم - الخيار المفضل | نعم | لا |
| تدعم واجهة برمجة التطبيقات مجموعات الأحرف | نعم | نعم | لا |
| تدعم واجهة برمجة التطبيقات (API) البيانات المُجهزة من جانب الخادم | نعم | نعم | لا |
| تدعم واجهة برمجة التطبيقات (API) البيانات المُجهزة من جانب العميل | لا | نعم | لا |
| تدعم واجهة برمجة التطبيقات الإجراءات المخزنة | نعم | نعم | لا |
| تدعم واجهة برمجة التطبيقات (API) عبارات متعددة | نعم | معظم | لا |
| يدعم جميع وظائف MySQL 4.1+ | نعم | معظم | لا |
الاستخدام
المصدر: [ 4 ]
واجهة مزدوجة
يتميز ملحق MySQLi بواجهة مزدوجة: فهو يدعم كلاً من نماذج البرمجة الإجرائية والبرمجة الموجهة للكائنات.
قد يُفضّل المستخدمون الذين ينتقلون من امتداد MySQL القديم سهولة استخدام الواجهة الإجرائية؛ ففي كثير من الحالات، لا تختلف أسماء الدوال إلا في البادئة. تأخذ بعض دوال MySQLi مُعرّف الاتصال كوسيطها الأول، بينما كانت الدوال المطابقة في واجهة MySQL القديمة تأخذه كوسيط أخير اختياري.
استدعاءات الدوال الأصلية الجديدة والقديمة
<?php $mysqli = mysqli_connect ( "example.com" , "user" , "password" , "database" ); $result = mysqli_query ( $mysqli , "SELECT * FROM myDatabase" ); echo mysqli_num_rows ( $result );$mysql = mysql_connect ( "example.com" , "user" , "password" ); mysql_select_db ( "database" ); $result = mysql_query ( "SELECT * FROM myDatabase" , $mysql ); echo mysql_num_rows ( $result ); ?>الاتصالات
يدعم خادم MySQL استخدام طبقات نقل متنوعة للاتصالات. وتستخدم هذه الاتصالات بروتوكول TCP/IP، أو مقابس نطاق Unix، أو قنوات Windows المسماة.
يحمل اسم المضيفlocalhost دلالة خاصة: فهو مرتبط باستخدام مقابس نطاق يونكس. لا يمكن فتح اتصال TCP/IP باستخدام اسم المضيف localhost، بل 127.0.0.1يجب استخدام بروتوكول آخر.
أمثلة على الاتصال:
<?php $mysqli = new mysqli ( "localhost" , "user" , "password" , "database" ); if ( $mysqli- > connect_errno ) { echo "فشل الاتصال بقاعدة بيانات MySQL: " . $mysqli- > connect_errno . ") " . $mysqli- > connect_error ; } echo $mysqli- > host_info . " \n " ;$mysqli = new mysqli ( "127.0.0.1" , "user" , "password" , "database" , 3306 ); if ( $mysqli- > connect_errno ) { echo "فشل الاتصال بقاعدة بيانات MySQL: " . $mysqli- > connect_errno . ") " . $mysqli- > connect_error ; }echo $mysqli -> host_info . " \n " ; ?>الناتج
المضيف المحلي عبر مقبس يونكس 127.0.0.1 عبر بروتوكول TCP/IP
تنفيذ العبارات
يمكن تنفيذ العبارات باستخدام الدوال mysqli_query() و mysqli_real_query() و mysqli_multi_query(). تُعدّ الدالة mysqli_query() الأكثر شيوعًا، حيث تجمع بين تنفيذ العبارة وجلب مجموعة النتائج المخزنة مؤقتًا ، إن وُجدت، في استدعاء واحد. استدعاء الدالة mysqli_query() يُعادل استدعاء الدالة mysqli_real_query() متبوعًا بالدالة mysqli_store_result().
مثال:
<?php $mysqli = new mysqli ( "example.com" , "user" , "password" , "database" ); if ( $mysqli- > connect_errno ) { echo "فشل الاتصال بقاعدة بيانات MySQL: " . $mysqli- > connect_errno . ") " . $mysqli- > connect_error ; }إذا لم تنجح عملية حذف الجدول test إذا كان موجودًا، أو لم تنجح عملية إنشاء الجدول test ( مع تحديد نوع البيانات id)، أو لم تنجح عملية إدراج البيانات في الجدول test ( مع تحديد نوع البيانات id ) ، فسيتم عرض رسالة خطأ تفيد بفشل إنشاء الجدول .مجموعات النتائج المخزنة مؤقتًا
بعد تنفيذ الاستعلام، يمكن استرجاع النتائج دفعة واحدة ليتم تخزينها مؤقتًا من قِبل العميل، أو قراءتها صفًا صفًا. يسمح تخزين النتائج مؤقتًا من جانب العميل للخادم بتحرير الموارد المرتبطة بنتائج الاستعلام في أسرع وقت ممكن. وبشكل عام، يستهلك العملاء مجموعات النتائج ببطء، لذا يُنصح باستخدام مجموعات النتائج المخزنة مؤقتًا. تجمع دالة mysqli_query() بين تنفيذ الاستعلام وتخزين النتائج مؤقتًا.
تستطيع تطبيقات PHP التنقل بحرية بين النتائج المخزنة مؤقتًا. وتتميز عملية التنقل بالسرعة لأن مجموعات النتائج محفوظة في ذاكرة العميل.
مثال: التنقل عبر النتائج المخزنة مؤقتًا
<?php $mysqli = new mysqli ( "example.com" , "user" , "password" , "database" ); if ( $mysqli- > connect_errno ) { echo "فشل الاتصال بقاعدة بيانات MySQL: " . $mysqli- > connect_errno . ") " . $mysqli- > connect_error ; }إذا لم تنجح عملية حذف الجدول test إذا كان موجودًا ، أو لم تنجح عملية إنشاء الجدول test (id INT)، أو لم تنجح عملية إدراج البيانات في الجدول test (id) ( 1 ) , ( 2), (3 ) ( ) ، فسيتم عرض رسالة خطأ تفيد بفشل إنشاء الجدول .$res = $mysqli -> query ( "SELECT id FROM test ORDER BY id ASC" );echo "ترتيب عكسي... \n " ; for ( $row_no = $res- > num_rows - 1 ; $row_no >= 0 ; $row_no-- ) { $ res- > data_seek ( $row_no ); $row = $res- > fetch_assoc (); echo "id = " . $row [ 'id' ] . " \n " ; }echo "ترتيب مجموعة النتائج... \n " ; $res- > data_seek ( 0 ); while ( $row = $res- > fetch_assoc ()) { echo "id = " . $row [ 'id' ] . " \n " ; } ?>سيُخرج المثال أعلاه ما يلي:
ترتيب عكسي... المعرف = 3 المعرف = 2 المعرف = 1 ترتيب مجموعة النتائج... المعرف = 1 المعرف = 2 المعرف = 3
مجموعات النتائج غير المخزنة مؤقتًا
إذا كانت ذاكرة العميل محدودة، ولم تكن هناك حاجة لتحرير موارد الخادم في أسرع وقت ممكن للحفاظ على انخفاض الحمل عليه، فيمكن استخدام النتائج غير المخزنة مؤقتًا. ولا يمكن تصفح هذه النتائج قبل قراءة جميع الصفوف.
مثال: التنقل عبر النتائج غير المخزنة مؤقتًا
<?php $mysqli- > real_query ( "SELECT id FROM test ORDER BY id ASC" ); $res = $mysqli- > use_result ();echo "ترتيب مجموعة النتائج... \n " ; while ( $row = $res- > fetch_assoc ()) { echo "id = " . $row [ 'id' ] . " \n " ; } ?>أنواع بيانات قيم مجموعة النتائج
تُستخدم الدوال mysqli_query() و mysqli_real_query() و mysqli_multi_query() لتنفيذ الاستعلامات غير المُجهزة. على مستوى بروتوكول خادم عميل MySQL، يُستخدم الأمر COM_QUERY وبروتوكول النص لتنفيذ الاستعلامات. باستخدام بروتوكول النص، يقوم خادم MySQL بتحويل جميع بيانات مجموعة النتائج إلى سلاسل نصية قبل إرسالها. يتم هذا التحويل بغض النظر عن نوع بيانات عمود مجموعة نتائج SQL. تستقبل مكتبات عميل MySQL جميع قيم الأعمدة كسلاسل نصية. لا يتم إجراء أي تحويل إضافي من جانب العميل لإعادة الأعمدة إلى أنواعها الأصلية. بدلاً من ذلك، يتم توفير جميع القيم كسلاسل نصية PHP.
مثال: بروتوكول النص يُرجع سلاسل نصية افتراضيًا
<?php $mysqli = new mysqli ( "example.com" , "user" , "password" , "database" ); if ( $mysqli- > connect_errno ) { echo "فشل الاتصال بقاعدة بيانات MySQL: " . $mysqli- > connect_errno . ") " . $mysqli- > connect_error ; }إذا لم تنجح أي من أوامر MySQL التالية : ` DROP TABLE IF EXISTS test`، أو ` CREATE TABLE test(id INT, label CHAR(1))` ، أو ` INSERT INTO test ( id, label) VALUES (1, ' a ' ) ` ، فسيتم عرض رسالة خطأ تُفيد بفشل إنشاء الجدول .$res = $mysqli- > query ( "SELECT id, label FROM test WHERE id = 1" ); $row = $res- > fetch_assoc ();printf ( "id = %s (%s) \n " , $row [ 'id' ], gettype ( $row [ 'id' ])); printf ( "label = %s (%s) \n " , $row [ 'label' ], gettype ( $row [ 'label' ])); ?>سيُخرج المثال أعلاه ما يلي:
id = 1 (سلسلة نصية) label = a (سلسلة نصية)
يمكن تحويل أعمدة الأعداد الصحيحة والعشرية إلى أرقام PHP عن طريق ضبط خيار الاتصال MYSQLI_OPT_INT_AND_FLOAT_NATIVE، عند استخدام مكتبة mysqlnd. عند ضبط هذا الخيار، تتحقق مكتبة mysqlnd من أنواع أعمدة البيانات الوصفية لمجموعة النتائج، وتحول أعمدة SQL الرقمية إلى أرقام PHP، إذا كان نطاق قيم أنواع بيانات PHP يسمح بذلك. بهذه الطريقة، على سبيل المثال، تُعاد أعمدة SQL من نوع INT كأعداد صحيحة.
مثال: أنواع البيانات الأصلية مع mysqlnd وخيار الاتصال
<?php $mysqli = mysqli_init (); $mysqli- > options ( MYSQLI_OPT_INT_AND_FLOAT_NATIVE , 1 ); $mysqli- > real_connect ( "example.com" , "user" , "password" , "database" );إذا ( $mysqli -> connect_errno ) { echo "فشل الاتصال بـ MySQL: (" . $mysqli -> connect_errno . ") " . $mysqli -> connect_error ; }إذا لم تنجح أي من أوامر MySQL التالية : ` DROP TABLE IF EXISTS test`، أو ` CREATE TABLE test(id INT, label CHAR(1))` ، أو ` INSERT INTO test ( id, label) VALUES (1, ' a ' ) ` ، فسيتم عرض رسالة خطأ تُفيد بفشل إنشاء الجدول .$res = $mysqli- > query ( "SELECT id, label FROM test WHERE id = 1" ); $row = $res- > fetch_assoc ();printf ( "id = %s (%s) \n " , $row [ 'id' ], gettype ( $row [ 'id' ])); printf ( "label = %s (%s) \n " , $row [ 'label' ], gettype ( $row [ 'label' ])); ?>سيُخرج المثال أعلاه ما يلي:
id = 1 (عدد صحيح) label = a (سلسلة نصية)
البيانات المعدة مسبقاً
تدعم قاعدة بيانات MySQL العبارات المُجهزة. تُستخدم العبارة المُجهزة أو العبارة المُعاملة لتنفيذ نفس العبارة بشكل متكرر بكفاءة عالية. [ 5 ]
تتألف عملية تنفيذ العبارة المُجهزة من مرحلتين: التجهيز والتنفيذ. في مرحلة التجهيز، يتم إرسال نموذج العبارة إلى خادم قاعدة البيانات. يقوم الخادم بإجراء فحص لبنية الجملة وتهيئة موارده الداخلية لاستخدامها لاحقًا.
يدعم خادم MySQL استخدام العناصر النائبة المجهولة والموضعية مع علامة الاستفهام (؟).
الإجراءات المخزنة
تدعم قاعدة بيانات MySQL الإجراءات المخزنة . الإجراء المخزن هو روتين فرعي مُخزّن في فهرس قاعدة البيانات. يمكن للتطبيقات استدعاء الإجراء المخزن وتنفيذه. تُستخدم عبارة CALL SQL لتنفيذ إجراء مخزن. [ 6 ]
يمكن أن تحتوي الإجراءات المخزنة على معلمات إدخال (IN) ومعلمات إدخال/إخراج (INOUT) ومعلمات إخراج (OUT)، وذلك بحسب إصدار MySQL. ولا تحتوي واجهة MySQLi على مفهوم خاص لأنواع المعلمات المختلفة.
يتم توفير معلمات الإدخال مع عبارة CALL. [ 6 ]
عبارات متعددة
يُتيح MySQL اختيارياً إمكانية تضمين عدة عبارات في سلسلة عبارات واحدة. يُقلل إرسال عدة عبارات في وقت واحد من عدد مرات الاتصال بين العميل والخادم، ولكنه يتطلب معالجة خاصة. [ 7 ]
يجب تنفيذ عدة عبارات أو استعلامات متعددة باستخدام الدالة mysqli_multi_query(). تُفصل العبارات الفردية في سلسلة الاستعلامات بفواصل منقوطة. بعد ذلك، يجب جلب جميع مجموعات النتائج التي تُرجعها العبارات المنفذة.
يسمح خادم MySQL بوجود عبارات تُرجع مجموعات نتائج وعبارات لا تُرجع مجموعات نتائج في عبارة واحدة متعددة.
دعم واجهة برمجة التطبيقات للمعاملات
يدعم خادم MySQL المعاملات بناءً على محرك التخزين المستخدم. منذ إصدار MySQL 5.5، أصبح محرك التخزين الافتراضي هو InnoDB ، الذي يدعم معاملات ACID بشكل كامل. [ 8 ]
يمكن التحكم في المعاملات إما باستخدام لغة SQL أو استدعاءات واجهة برمجة التطبيقات (API). يُنصح باستخدام استدعاءات واجهة برمجة التطبيقات لتفعيل وتعطيل وضع الالتزام التلقائي، ولإتمام المعاملات وإلغائها.
البيانات الوصفية
تحتوي مجموعة نتائج MySQL على بيانات وصفية. تصف هذه البيانات الأعمدة الموجودة في مجموعة النتائج. يمكن الوصول إلى جميع البيانات الوصفية التي يرسلها MySQL عبر واجهة MySQLi. لا يُجري هذا الامتداد أي تغييرات، أو تغييرات طفيفة للغاية، على المعلومات التي يتلقاها. لا تتوافق الاختلافات بين إصدارات خادم MySQL. [ 9 ]
يتم الوصول إلى البيانات الوصفية من خلال واجهة mysqli_result.
امتداد MySQLi والاتصالات الدائمة
أُضيفت ميزة دعم الاتصالات الدائمة في PHP 5.3 لامتداد MySQLi. وكانت هذه الميزة متوفرة مسبقًا في PDO MYSQL و ext/mysql. وتقوم فكرة الاتصالات الدائمة على إمكانية إعادة استخدام الاتصال بين عملية العميل وقاعدة البيانات، بدلًا من إنشائه وحذفه عدة مرات. وهذا يقلل من عبء إنشاء اتصالات جديدة في كل مرة يُطلب فيها ذلك، حيث تُخزَّن الاتصالات غير المستخدمة مؤقتًا وتكون جاهزة لإعادة الاستخدام. [ 3 ]
على عكس إضافة MySQL، لا توفر MySQLi وظيفة منفصلة لفتح اتصالات دائمة. لفتح اتصال دائم، يجب إضافة p: إلى اسم المضيف عند الاتصال.
تكمن مشكلة الاتصالات المستمرة في إمكانية تركها في حالات غير متوقعة من قِبل العملاء. على سبيل المثال، قد يتم تفعيل قفل الجدول قبل إنهاء العميل بشكل غير متوقع. سيحصل أي عميل جديد يعيد استخدام هذا الاتصال المستمر على الاتصال "كما هو". سيتعين على العميل الجديد إجراء أي تنظيف قبل أن يتمكن من الاستفادة من الاتصال المستمر بشكل كامل، مما يزيد من عبء المبرمج.
مع ذلك، يوفر اتصال MySQLi المستمر رمزًا مدمجًا لمعالجة عمليات التنظيف. وتشمل عمليات التنظيف التي يقوم بها MySQLi ما يلي:
- التراجع عن المعاملات النشطة
- أغلق الطاولات المؤقتة وأزلها
- فتح الطاولات
- إعادة ضبط متغيرات الجلسة
- إغلاق العبارات المُجهزة (يحدث هذا دائمًا مع لغة PHP)
- مساعد مقرب
- تحرير الأقفال التي تم الحصول عليها باستخدام GET_LOCK()
يضمن هذا أن تكون الاتصالات المستمرة في حالة نظيفة عند عودتها من مجمع الاتصالات ، قبل أن تستخدمها عملية العميل.
يقوم ملحق MySQLi بعملية التنظيف هذه عن طريق استدعاء وظيفة C-API mysql_change_user() تلقائيًا.
تتمتع ميزة التنظيف التلقائي بمزايا وعيوب. فمن مزاياها أن المطور لم يعد بحاجة إلى إضافة كود التنظيف، إذ يتم استدعاؤه تلقائيًا. أما من عيوبها، فقد يكون الكود أبطأ قليلًا، لأن كود التنظيف يحتاج إلى التشغيل في كل مرة يتم فيها إرجاع اتصال من مجمع الاتصالات.
من الممكن إيقاف تشغيل رمز التنظيف التلقائي، عن طريق تجميع PHP مع تعريف MYSQLI_NO_CHANGE_USER_ON_PCONNECT.
مراجع
- ↑ "PHP: مقدمة - دليل المستخدم" . www.php.net . تم الاطلاع عليه بتاريخ 6 أغسطس 2024 .
- ↑ "الاتصال بـ MySQL/MariaDB/Percona لـ PHP" . Virtuozzo . تم الاطلاع عليه بتاريخ 22 نوفمبر 2023 .
- 1 2 3 4 5 "نظرة عامة - دليل المستخدم" . PHP . تم الاطلاع عليه بتاريخ 11 أغسطس 2014 .
- ↑ "PHP: دليل البدء السريع - دليل المستخدم" . In2.php.net . تم الاطلاع عليه بتاريخ 11 أغسطس 2014 .
- ↑ "PHP: العبارات المُجهزة - دليل المستخدم" . In2.php.net . تم الاطلاع عليه بتاريخ 11 أغسطس 2014 .
- 1 2 جوناثان (24 مايو 2013). "PHP: الإجراءات المخزنة - دليل" . In2.php.net . تم الاطلاع عليه في 11 أغسطس 2014 .
- ↑ eric.noel@gmail.com (31 مارس 2014). "PHP: عبارات متعددة - دليل" . In2.php.net . تم الاطلاع عليه في 11 أغسطس 2014 .
- ↑ "PHP: دعم واجهة برمجة التطبيقات للمعاملات - دليل المستخدم" . In2.php.net . تم الاطلاع عليه بتاريخ 11 أغسطس 2014 .
- ↑ "PHP: البيانات الوصفية - الدليل" . In2.php.net . تم الاطلاع عليه بتاريخ 11 أغسطس 2014 .
للمزيد من القراءة
- الوصول إلى بيانات SQL
- تقنيات الوصول إلى البيانات
- MySQL
- مكتبات PHP
