لقد قمت بحل هذا المشروع لأنه يتطلب الكثير من العمل، في حين أن الفكرة بدت سخيفة في البداية، إلا أنها نجحت بالفعل حتى وجدت الكثير من المشكلات في ترقيم الصفحات ومن حيث الأداء، أعتقد أن التجميع سيكون الأفضل. استخدم هذا على مسؤوليتك الخاصة، لقد كان من الممتع إنشاء هذا المشروع.
هذه مكتبة PHP مجانية وسهلة الاستخدام وخفيفة الوزن وقوية تتيح لك الاتصال بقواعد بيانات MySQL متعددة باستخدام PDO. لقد قمت ببناء هذا خصيصًا لـ MySQL ولكني أعتقد أن هذا سيعمل مع PostgreSQL وMariaDB وCouchDB وما إلى ذلك. تذكر أن هذا مخصص لقواعد بيانات SQL لذلك لن يعمل مع أنظمة إدارة قواعد البيانات مثل MongoDB وApache Cassandra.
✔ الاتصال بقواعد بيانات MySQL متعددة باستخدام PDO.
✔ استرجاع الصفوف من قواعد بيانات متعددة.
✔ قم بإجراء استعلامات الإدراج بكفاءة عن طريق إجراء استعلام واحد فقط بدلاً من إضافة صفوف جديدة في جميع الجداول في كل قاعدة بيانات.
✔ فرز النتائج/الصفوف وتقييدها وإدارتها بسهولة.
✔ التوسع بسهولة، وذلك ببساطة عن طريق إضافة المزيد من قواعد البيانات (لا حاجة لاستخدام العبيد أو الماجستير أو المجموعات).
✔ قم بإنشاء معرفات فريدة حقًا (تسمى MDGUID).
➔ PHP 7+ وApache/Nginx (يستخدم ميزات PHP 7 وما فوق).
➔ MySQL 5.7+ (لتوضيح أن MySQL 5.7 يعمل بشكل جيد، لذا فإن أي إصدار أعلى من MySQL 5.7 سيكون رائعًا).
➔ برنامج تشغيل قاعدة بيانات متوافق مع PDO (اقرأ المزيد حول هذا هنا).
يمكنك استخدام MultiDatabasePDO للاستخدام الشخصي والتعليمي والتجاري بموجب الشروط التالية:
➔ لا يجوز لك بيع أو منح أو استضافة (نسخ أصلية أو محررة) من هذه المكتبة لمستخدمين آخرين، ويجب عليك ربطهم بهذا المستودع.
➔ لا يجوز لك تغيير التعليق في الملف أو إزالته، فإن القيام بذلك سيجعلني أعتقد أنك تريد المطالبة به باعتباره تعليقًا خاصًا بك.
1. الاتصال بقواعد البيانات الخاصة بك!
قبل أن تبدأ، يرجى التأكد من فهمك لأساسيات شركة تنمية نفط عمان. ما عليك سوى تنزيل الإصدار الأحدث وتضمين الملف المسمى MultiDatabasePDO .php
والذي سيتضمن تلقائيًا جميع الفئات الإضافية لك. يجب أن يبدو رمز الإعداد الخاص بك كما يلي:
require " ./ MultiDatabasePDO / MultiDatabasePDO .php " ;
$ multiPDO = new WulfGamesYT MultiDatabasePDO MultiDatabasePDO ([
[ " mysql " , " 1.1.1.1 " , " database_1 " , " username " , " password " ],
[ " mysql " , " 2.2.2.2 " , " database_2 " , " username " , " password " ]
]);
نحتاج الآن إلى التحقق من وجود أي أخطاء باستخدام دالة بسيطة تسمى hasAnyErrors()
. يمكنك سرد الاتصالات التي تفشل باستخدام الدالة getFailedConnections()
.
if ( $ multiPDO -> hasAnyErrors ()) {
error_log ( " Error connecting to database(s): " . $ multiPDO -> getFailedConnections ());
exit ( " Error connecting to our main databases! Please try again later. " );
}
2. قراءة الويكي واستخدام هذه المكتبة بالطريقة الصحيحة!
بعد ذلك، أوصي بقراءة الوثائق الموجودة على الويكي لفهم ما تفعله كل وظيفة. ومن المهم أيضًا معرفة أن هناك بعض الاختلافات بين هذه المكتبة ومكتبة PDO القياسية، ومن أبرزها:
execute()
، استخدم bindValue()
أو bindValues()
.ORDER BY
أو LIMIT
أو OFFSET
في استعلامات SQL الخاصة بك، وبدلاً من ذلك يرجى الاطلاع على هذا الدليل.AUTO INCREMENT
للأعمدة، وبدلاً من ذلك إذا كان لديك عمود معرف فاستخدم هذه الوظيفة. 3. إعداد قواعد البيانات والجداول الخاصة بك!
إذا كنت تخطط لاستخدام MultiDatabasePDO ، فيجب عليك التأكد من أن جميع الجداول الخاصة بك من كل قاعدة بيانات تتصل بها منظمة بنفس الطريقة:
على سبيل المثال، تخيل أن لدينا الجدولين التاليين من قاعدتي بيانات مختلفتين، كلاهما منظمتان ومسميتان بنفس الاسم. يستخدم كل مثال في هذا الملف التمهيدي أدناه هذه الجداول. من الناحية الواقعية، ستحتوي جداولك على الآلاف، إن لم يكن الملايين من الصفوف قبل أن تحتاج إلى التفكير في استخدام MultiDatabasePDO (أو إذا كنت ترغب في الاستعداد لتوسيع نطاق تطبيق الويب الخاص بك).
جدول "المستخدمين"، من قاعدة البيانات 1.
معرف (كثافة العمليات) | اسم المستخدم (نص) | باسهاش (نص) | البريد الإلكتروني (النص) | الاسم الأول (نص) | الاسم الأخير (النص) |
---|---|---|---|---|---|
1 | WulfGamesYT | ThLfkbQFyvDx | [email protected] | ليام | ألين |
2 | إنديانا جونز55 | npxCn975RSaP | [email protected] | إنديانا | جونز |
3 | YaBoiTableFlipper69 | BT7V2U6VJv2d | [email protected] | ستيف | جونز |
جدول "المستخدمين"، من قاعدة البيانات 2.
معرف (كثافة العمليات) | اسم المستخدم (نص) | باسهاش (نص) | البريد الإلكتروني (النص) | الاسم الأول (نص) | الاسم الأخير (النص) |
---|---|---|---|---|---|
4 | حقا المتأنق | 6XBmD4bzGP87 | حقا[email protected] | ليام | ميسون |
5 | HellYeaBoi | LeyTpTwvvMUM | [email protected] | جولي | كروسبي |
لتحديد صفوف من جميع قواعد البيانات وجميع الجداول، يمكنك ببساطة القيام بما يلي، مثل PDO العادي في PHP:
$ selectQuery = $ multiPDO -> prepare ( " SELECT ID, Username, Email FROM Users WHERE Username = :username " );
$ selectQuery -> bindValue ( " :username " , " WulfGamesYT " );
$ selectQuery -> execute ();
while ( $ row = $ selectQuery -> getNextRow ()) { var_dump ( $ row ); }
لنفترض أنه إذا كان لدينا نموذج ويمكنك نشر المعلومات في ملف PHP الخاص بك، وتريد إدراج سجل واحد جديد في جدول من قاعدة بيانات تسمى "المستخدمون"، فكل ما عليك فعله هو ما يلي. لاحظ أنه سيتم إدراج هذا في الجدول الثاني في جداول الأمثلة أعلاه لأنه يحتوي على أقل عدد من الصفوف. بدلاً من إدخال معرف يدوي واستخدام نوع البيانات int في جداولك، استخدم وظيفة generateMDGUID()
أدناه.
$ longSQL = " INSERT INTO Users VALUES (6, :username, :pass, :email, :firstname, :lastname) " ;
$ insertQuery = $ multiPDO -> prepare ( $ longSQL );
$ insertQuery -> bindValues ([
" :username " => $ _POST [ " username " ],
" :pass " => password_hash ( $ _POST [ " password " ], PASSWORD_DEFAULT ),
" :email " => $ _POST [ " email " ],
" :firstname " => $ _POST [ " name-first " ],
" :lastname " => $ _POST [ " name-last " ]
]);
$ insertQuery -> execute ( true , " Users " );
لاحظ أنه باستخدام طريقة execute()
قمنا بإدخال معلمتين، وهذا مطلوب لإدراج صفوف جديدة، لأنه يخبر الفصل الذي نقوم بإدخاله (عن طريق تمرير: صحيح) صفًا جديدًا في جدول يسمى "المستخدمون". لا تضع إدخال مستخدم غير موثوق به كمعلمة ثانية حيث يمكن أن يحدث حقن SQL.
هذا هو نفس إجراء استعلام SELECT، سيؤدي هذا إلى تحديث جميع الجداول في جميع قواعد البيانات التي تطابق جملة WHERE إذا تم تحديدها، على سبيل المثال:
$ updateQuery = $ multiPDO -> prepare ( " UPDATE Users SET Username = :newusername WHERE Username = :oldusername " );
$ updateQuery -> bindValues ([ " :newusername " => " MyFancyUsername " , " :oldusername " => " WulfGamesYT " ]);
$ updateQuery -> execute ();
الآن إذا قمنا بتشغيل استعلام SELECT على جميع الجداول المسماة "المستخدمين" فسنرى الصف المحدث.
مرة أخرى، كل ما يتعين علينا القيام به هو:
$ deleteQuery = $ multiPDO -> prepare ( " DELETE FROM Users WHERE Username = :username " );
$ deleteQuery -> bindValue ( " :username " , " MyFancyUsername " );
$ deleteQuery -> execute ();
الآن إذا قمنا بتشغيل استعلام SELECT على جميع الجداول المسماة "المستخدمين" فسنرى الصف المحدث.
من المهم ملاحظة أنه لا يمكنك استخدام ORDER BY
أو LIMIT
أو OFFSET
في استعلامات SQL الخاصة بك لترتيب جميع الصفوف من كل قاعدة بيانات، فقط الصفوف الموجودة في هذا الجدول الحالي في قاعدة بيانات واحدة. بدلاً من ذلك، يتعين عليك استخدام الوظائف التالية المتوفرة مع MultiDatabasePDO والتي تسهل تنظيم النتائج/الصفوف النهائية.
ترتيب النتائج (بدلاً من "ORDER BY"): يمكنك ترتيب نتائجك تمامًا كما تفعل في استعلامات SQL مع تمرير "ASC" أو "DESC" إلى المعلمة الثانية إلى طريقة sortBy()
.
هذه هي الطريقة التي تقوم بها بترتيب أعمدة الأرقام:
$ selectQuery = $ multiPDO -> prepare ( " SELECT * FROM Users " );
$ selectQuery -> execute ();
//Now sort by the "ID" column in descending order.
$ selectQuery -> sortBy ( " ID " , " DESC " );
while ( $ row = $ selectQuery -> getNextRow ()) { var_dump ( $ row ); }
هذه هي الطريقة التي تقوم بها بترتيب أعمدة السلسلة/الكائن:
$ selectQuery = $ multiPDO -> prepare ( " SELECT * FROM Users " );
$ selectQuery -> execute ();
//Now sort by the "Username" column in ascending order.
$ selectQuery -> sortBy ( " Username " , " ASC " );
while ( $ row = $ selectQuery -> getNextRow ()) { var_dump ( $ row ); }
يمكنك طلب أعمدة متعددة، أو عدة مرات إذا أردت. في المثال أدناه، سنقوم بترتيب عمود يسمى "الاسم الأول" بترتيب تنازلي، ثم عمود يسمى "اسم العائلة". سيؤدي هذا إلى سرد المستخدمين في الجدول بالترتيب الأبجدي، إذا كان لديهم نفس الاسم الأول، فسيتم ترتيبهم أيضًا حسب الاسم الأخير. ضع عمود الطلب الأقل أهمية أولاً، ثم الأكثر أهمية في النهاية كما ترون في الكود:
$ selectQuery = $ multiPDO -> prepare ( " SELECT * FROM Users " );
$ selectQuery -> execute ();
//Now sort both the columns.
$ selectQuery -> sortBy ( " LastName " , " ASC " );
$ selectQuery -> sortBy ( " FirstName " , " ASC " );
while ( $ row = $ selectQuery -> getNextRow ()) { var_dump ( $ row ); }
بدلاً من AUTO INCREMENT
، أو إذا كنت بحاجة إلى طريقة لإنشاء معرّفات GUID فريدة عبر قواعد بيانات متعددة، يمكنك الاستفادة من وظيفتنا المسماة generateMDGUID()
. فيما يلي دليل حول كيفية عملها وكيفية ضمان التفرد بنسبة 100%، ومثال لكيفية استخدام الوظيفة عند إدراج صفوف جديدة في جداولك.
كيف يعمل MDGUID ويضمن تفرده:
مثال:
//Here we generate the MDGUID.
$ mdguid = $ multiPDO -> generateMDGUID ();
$ longSQL = " INSERT INTO Users VALUES (:mdguid, :username, :pass, :email, :firstname, :lastname) " ;
$ insertQuery = $ multiPDO -> prepare ( $ longSQL );
$ insertQuery -> bindValues ([
" :mdguid " => $ mdguid ,
" :username " => $ _POST [ " username " ],
" :pass " => password_hash ( $ _POST [ " password " ], PASSWORD_DEFAULT ),
" :email " => $ _POST [ " email " ],
" :firstname " => $ _POST [ " name-first " ],
" :lastname " => $ _POST [ " name-last " ]
]);
$ insertQuery -> execute ( true , " Users " );
إذا كنت تريد طرح سؤال، تواصل معي على تويتر.
تويتر: https://www.twitter.com/WulfGamesYT
إذا أعجبتك هذه المكتبة، فيرجى التفكير في تمييزها بنجمة ومشاركتها مع زملائك المطورين الذين يحبون PHP وMySQL! ترقبوا التحديثات وتأكد من الإبلاغ عن أي أخطاء تجدها لي. شكرا لك على القراءة!