PHPLIB عبارة عن مكتبات ملحقة لـ PHP، يمكننا استخدامها لإجراء عمليات مختلفة على قاعدة البيانات بسهولة، ومع ذلك، إذا كنت تريد استخدام قواعد بيانات متعددة، فسيكون ذلك خارج نطاق قدراتك. تقدم هذه المقالة كيفية توسيع PHPLIB للسماح لك باستخدامه لديك أفضل ما في كلا العالمين. يمكنك استخدام قواعد بيانات متعددة أثناء استخدام PHPLIB، ويمكنك أيضًا التعرف على البرمجة الموجهة للكائنات وكيفية توسيع المكتبة.
إدارة قواعد البيانات
يمكنك وضع أي جدول في قاعدة بيانات كبيرة. ومع ذلك، بمرور الوقت، ستصبح قاعدة البيانات أكبر وأكبر. قد لا يتمكن الخادم من متابعة عمل الإدخال/الإخراج، أو قد لا يكون لديه ذاكرة كافية للتعامل مع جميع عمليات الوصول؟ من الصعب جدًا فصل البيانات الموجودة. ومن الحكمة البدء بقواعد بيانات منفصلة وتنفيذ إدارة فعالة لقواعد البيانات. إذا كان لديك موقع ويب لبيع الكتب، فمن المحتمل أن يكون لديك قائمة بالمؤلفين، وقائمة بأسعار الكتب، وقائمة بالمخزون والطلبات الحالية. مع نمو أعمالك، ستستمر الطلبات في النمو، وتتطلب معالجة كل طلب قدرًا كبيرًا من الوصول إلى القرص. على الأرجح أنك ستضع جميع طلباتك في نظام محاسبي في مرحلة ما.
الآن ضع الأوامر في قاعدة بيانات منفصلة. وبما أنه يتم تحديث المخزون أيضًا عبر الطلبات، يتم أيضًا وضع كميات المخزون في نفس قاعدة البيانات.
قائمة المؤلفين وقائمة الكتب عبارة عن معلومات ثابتة يجب قراءتها بشكل متكرر ولكن نادرًا ما يتم تحديثها. من الناحية العملية، قد يلزم تحديث سجل المؤلف مرة واحدة فقط كل 5 سنوات، فقط عندما يكتب المؤلف كتابًا جديدًا (أو يموت). يمكن تكوين الخادم الذي يستضيف هذه البيانات بشكل مختلف تمامًا عن الخادم الذي يستضيف قاعدة بيانات الطلب.
يحتوي على PHPLIB
PHPLIB يصل إلى قواعد بيانات SQL من خلال فئة تسمى DB_Sql. اعتمادًا على نوع قاعدة البيانات التي تحتاج إلى استخدامها، قم بتضمين ملفات inc مختلفة في التعليمات البرمجية الخاصة بك. في هذا المثال أستخدم إصدار MySQL.
من أجل استخدام DB_Sql في التعليمات البرمجية الخاصة بك، قم بتثبيت ملفات PHPLIB في الدليل الخاص بها. بعد ذلك، ابحث عن دليل cgi-bin الخاص بك وقم بإنشاء دليل phplib بجوار دليل cgi-bin. بعد ذلك، انسخ جميع ملفات PHPLIB .inc إلى دليل phplib. أخيرًا، قم بتعديل ملف php.inc، فقط قم بتغيير السطر "include_path =" إلى دليل phplib.
include_path هو الدليل الذي تبحث عنه PHP عند استخدام include() أو require(). في محطة عمل NT الخاصة بي، مسار التضمين هو:
include_path = ".;i:/project52/includes;i:/project52/phplib"
; على نظامك،
أضفinclude_path = ".;/home/httpd/includes;/home/httpd/phplib";
في أعلى كل صفحة PHP
<؟ PHP
تتطلب (common.php)؛
؟ >
يتم وضع common.php3 في الدليل المتضمن ويحتوي على جميع البيانات والوظائف التي تستخدمها كل صفحة. في هذا المثال common.php هو:
<؟ PHP
تتطلب (db_mysql.inc)؛
تتطلب (ct_sql.inc)؛
تتطلب(session.inc);
تتطلب (auth.inc)؛
تتطلب(perm.inc);
تتطلب(user.inc);
تتطلب(page.inc);
؟ >
إذا كنت تريد معرفة الغرض من كل ملف inc، فيمكنك قراءة وثائق PHPLIB على http://phplib.netuse.de . يحتوي Db_mysql.inc على تعريفات كافة فئات DB_SQL. إذا كنت تريد استخدام PostGreSQL بدلاً من MySQL، فما عليك سوى استخدام db_pgsql.inc بدلاً من db_mysql.inc. هناك 10 ملفات .inc أخرى للاستخدام مع قواعد بيانات MS SQL أو Oracle أو Sybase أو غيرها.
لاحظ أنه في هذا المثال، require() و include() متماثلتان تمامًا. ومع ذلك، إذا تم وضعها في التعليمات البرمجية أو استخدامها في عبارة if، فإن استخدام Require() والتضمين مختلفان تمامًا ولهما نتائج تشغيل مختلفة.
توسيع PHPLIB
يصل PHPLIB إلى قاعدة البيانات من خلال كائن تم إنشاؤه بواسطة فئة DB_Sql. يحتوي Db_mysql.inc على فئة DB_Sql المعدلة لـ MySQL. سوف نقوم بتوسيع DB_sql عن طريق إضافة التعليمات البرمجية إلى common.php بعد السطر الذي يحتوي على db_mysql.inc.
يحتوي DB_Sql على العديد من الوظائف للاستعلام. ما نحتاج إلى تعديله هو:
<? PHP
/* عام: إدارة الاتصال*/
وظيفة الاتصال($Database = ""، $Host = ""، $User = ""، $Password = "") {
/* التعامل مع الاتصال الافتراضي */
إذا ("" == قاعدة بيانات $)
$Database = $this->Database;
إذا ("" == مضيف $)
$Host = $this->Host;
إذا ("" == مستخدم $)
$User = $this->User;
إذا ("" == كلمة المرور $)
$Password = $this->Password;
/* إنشاء اتصال واختيار قاعدة البيانات*/
إذا (0 == $this->Link_ID) {
$this->Link_ID=mysql_pconnect($Host, $User, $Password);
إذا (!$هذا->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) Failed.");
العودة 0؛
}
إذا ( !@mysql_select_db($Database,$this->Link_ID )) {
$this->halt("لا يمكن استخدام قاعدة البيانات".$this->Database);
العودة 0؛
}
}
إرجاع $this->Link_ID;
}
؟ >
ابحث عن وظيفة الاتصال () في db_mysql.inc (أو ملفات .inc الأخرى المتعلقة بقاعدة البيانات)، ثم انسخها إلى common.php وضعها خلف الكود الذي يحتوي على db_mysql.inc، وفي النهاية، يجب عليك أيضًا إضافتها مغلفة كتعريف فئة.
لقد وجدت صعوبة في قراءة الكود، لذا قمت أولاً بجعل الكود المنسوخ أكثر قابلية للقراءة:
<? PHP
/* عام: إدارة الاتصال*/
وظيفة الاتصال($Database = ""، $Host = ""، $User = ""، $Password = "") {
/* التعامل مع الاتصال الافتراضي */
إذا ("" == قاعدة بيانات $) {
$Database = $this->Database;
}
إذا ("" == $Host) {
$Host = $this->Host;
}
إذا ("" == مستخدم $) {
$User = $this->User;
}
إذا ("" == كلمة المرور $) {
$Password = $this->Password;
}
/* إنشاء اتصال واختيار قاعدة البيانات */
إذا (0 == $this->Link_ID) {
$this->Link_ID=mysql_pconnect($Host, $User, $Password);
إذا (!$هذا->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) Failed.");
العودة 0؛
}
إذا ( !@mysql_select_db($Database,$this->Link_ID )) {
$this->halt("لا يمكن استخدام قاعدة البيانات".$this->Database);
العودة 0؛
}
}
إرجاع $this->Link_ID;
}
؟ >
قمت بتعديل موضع الأقواس وأضفت قوسًا قبل السطر الواحد وبعده. في عبارة if الخاصة بـ PHP، لا تحتاج إلى أقواس إذا كان هناك سطر واحد فقط من التعليمات البرمجية، ولكن إذا قمت بإضافة سطر آخر من التعليمات البرمجية، فسيحدث خطأ على الفور. لذلك أقترح عليك إضافة قوس لتجنب الأخطاء عند إضافة التعليمات البرمجية لاحقًا.
قبل تغيير رمز الاتصال، يجب عليك أولاً فهم كيفية عمل Connect(). فهو يتحقق من وجود اتصال حاليًا. وإذا لم يكن هناك اتصال، فإنه يقوم بإنشاء اتصال. قبل كل استعلام في قاعدة البيانات، قم أولاً بتشغيل وظيفة الاتصال () هذه. لسوء الحظ، فإنه يحدد قاعدة البيانات فقط عند الاتصال لأول مرة. إذا كانت صفحة PHP الخاصة بك تستخدم أكثر من قاعدة بيانات واحدة، فلن يقوم الاتصال () بتحديد قاعدة بيانات أخرى.
هناك عدة طرق مختلفة لتغيير الرمز. نحتاج إلى اختيار طريقة ذات تأثير أقل على PHPLIB وتسمح لنا بعرض حالة اتصال قاعدة البيانات عندما نحتاج إلى تحليل المشكلة. نحتاج إلى حفظ معرف الاتصال واسم قاعدة البيانات خارج PHPLIB. فقط قم بإضافة common.php:
<? PHP
$db_connection = 0; // معرف اتصال قاعدة البيانات
$db_database = ""; // حالة قاعدة البيانات الحالية؟ >
بعد ذلك، سنقوم بتعديل PHPLIB لتخزين معرف الاتصال واسم قاعدة البيانات في هذه المتغيرات. يمكنك تعيين واستخدام نفس اسم المتغير في تعليمات برمجية أخرى. عند تحليل المشكلة، إذا كنت تريد معرفة قاعدة البيانات المستخدمة، فما عليك سوى إدخال الكود التالي في الصفحة:
<? PHP
طباعة(" db_database: " . $db_database . "");
؟ >
كيف يمكننا أن نجعل الاتصال () يستخدم هذه المتغيرات الجديدة؟ يمكننا إضافة سطر في الأعلى:
<? PHP
{
العوالم $db_connect، $db_database؛
/* التعامل مع الإعدادات الافتراضية */
؟ >
من خلال هذه الرموز، يمكن الوصول إلى المتغيرات الجديدة عن طريق الاتصال ().
بعد تعريف $db_database، أضف:
<؟ PHP
الوظيفة db_connect($db_connect_host = "", $db_connect_user = "),$db_connect_pass = "") {
العوالم $db_connect;
إذا(!فارغ($db_connect_host)) {
$db_connect = mysql_pconnect($db_connect_host,
$db_connect_user، $db_connect_pass)؛
}
العودة($db_connect);
}
وظيفة db_database($db_database_new = "") {
العوالم $db_database؛
إذا(!فارغ($db_database_new)) {
$db_database = @mysql_select_db($db_database_new, db_connect());
}
return($db_database);
}
؟ >
طالما قمت بتعريف هذه الوظائف العامة مرة واحدة، يمكنك استخدام هذه المتغيرات العامة في أماكن مختلفة دون إضافة إعلانات عامة. فيما يلي الوظائف العامة التي تستخدم وظيفة db أعلاه:
<? PHP
وظيفة الاتصال($Database = ""، $Host = ""، $User = ""، $Password = "") {
/* التعامل مع الاتصال الافتراضي */
إذا ("" == قاعدة بيانات $) {
$Database = $this->Database;
}
إذا ("" == $Host) {
$Host = $this->Host;
}
إذا ("" == مستخدم $) {
$User = $this->User;
}
إذا ("" == كلمة المرور $) {
$Password = $this->Password;
}
/* إنشاء اتصال واختيار قاعدة البيانات */
إذا (0 == db_connect()) {
$this->Link_ID = db_connect($Host, $User, $Password);
إذا (!$هذا->Link_ID) {
$this->halt("pconnect($Host, $User, $Password) Failed.");
العودة 0؛
}
}
إذا (0!= db_connect()) {
إذا($Database!= db_database()) {
$this->قاعدة البيانات = db_database($Database))
إذا (فارغة($this->قاعدة البيانات)) {
$this->halt("لا يمكن استخدام قاعدة البيانات" . $this->Database);
العودة 0؛
}
}
}
إرجاع $this->Link_ID;
}
؟ >
انتبه إلى التغييرات التالية:
يتم فصل اختبار قاعدة البيانات عن اختبار الاتصال، لذلك حتى لو كان لدى Connect() اتصال حالي، فلا يزال بإمكانه التحقق مما إذا كان سيتم التغيير إلى قاعدة بيانات أخرى. هذا يعني أن db_connect() يقارن بالصفر مرتين كما كان من قبل، ولكن هذه المعالجة الإضافية ضرورية.
نحن نحتفظ باتصال قاعدة البيانات واختيار قاعدة البيانات خارج PHPLIB حتى تتمكن من استخدام نفس وظيفة اختيار قاعدة البيانات في أي مكان في كود PHP الخاص بك.
ومع ذلك، هناك قيود على المعالجة الحالية، حيث نفترض هنا أنه يتم استخدام نفس المضيف والمستخدم وكلمة المرور لجميع قواعد البيانات. إذا كانت قاعدة البيانات الخاصة بك تحتوي على أذونات مختلفة لمستخدمين مختلفين، فيجب عليك إنشاء اتصال خاص للوصول إليها. كيف؟ ما عليك سوى تحديد المتغيرات التالية:
<? PHP
$db_host = "";
$db_user = "";
$db_pass = "";
؟ >
من خلال توسيع وظيفة db_database()، قم بمقارنة المستخدم والمضيف الحاليين مع مستخدم ومضيف معين. يمكنك أيضًا إضافة:
<? PHP
$db_type = "";
؟ >
يستخدم هذا المتغير لتخزين نوع قاعدة البيانات، mysql أو Oracle، إلخ. بهذه الطريقة يمكنك الوصول إلى قواعد بيانات متعددة.
لكن تغيير التعليمات البرمجية للتعامل مع أنواع مختلفة متعددة من قواعد البيانات أمر معقد للغاية. يجب عليك أيضًا تغيير وظيفة الاستعلام، بالإضافة إلى وظائف الانضمام والاختيار. قد تتمكن من الاتصال عبر ODBC الخاص بـ PHP ثم استخدام خيارات ODBC الخاصة بـ PHPLIB للتعامل معه. يعالج ODBC قواعد بيانات متعددة بطريقة شائعة، لذا سيكون أبطأ. يسمح لك ODBC باستخدام نفس التعليمات البرمجية للتعامل مع عدة أنواع مختلفة من قواعد البيانات. ولكن ستكون هناك مشاكل عند الحاجة إلى استخدام التواريخ بتنسيقات معالجة مختلفة، وستكون هناك أيضًا بعض الاختلافات الغريبة بين قواعد البيانات. يعمل ODBC على تبسيط الاتصال فقط، ولكنه لا يعدل الطريقة التي تفسر بها قاعدة البيانات البيانات وSQL.
الآن دعونا نتعلم كيفية إعادة تعريف فئة الكائن. يتم تغليف وظيفة الاتصال () في تعريف الفئة:
<؟ PHP
فئة DB_Sql {
}
؟ >
عندما نقوم بنسخ هذه الدالة إلى common.php، يجب علينا إعادة تعريف فئة DB_Sql ويمكننا تغليف Connect() مثل هذا:
<؟ PHP
فئة db_DB_Sql تمتد DB_Sql {
}
؟ >
لمعرفة المزيد حول عمل "الامتدادات"، يمكننا إلقاء نظرة على القسم الخاص بالكائنات والفئات في وثائق PHP. ببساطة: أي تعريف في الامتداد يحل محل جميع التعريفات السابقة ويتجاوزها.
يمكن الآن استخدام db_DB_Sql. عند تكوين PHPLIB، يمكنك إجراء العبارة التالية:
<? PHP
$x = DB_Sql جديد؛
؟ > تغييره إلى: <؟ PHP
$x = جديد db_DB_Sql;
؟ >
بهذه الطريقة يمكنك استخدام الفئة المعدلة بدلاً من الفئة السابقة.
عند حدوث خطأ عند الاتصال بقاعدة البيانات، يمكنك إخراج حالة الاتصال الحالية في وظيفة خارجية. في حالة حدوث خطأ في عبارة SQL، يمكنك أيضًا نسخ وظيفة query() في DB_Sql إلى db_DB_Sql في common.PHP، ثم قم بإدراج عبارة الإخراج لمعرفة عبارة SQL الحالية.
يمكنك أيضًا كتابة خطأ أو معلومات تشخيصية إلى ملف قرص. من خلال تحديد
$db_log_file = "t:/diag.txt"؛
أو ملف نصي مشابه. إذا كنت تستخدم نظام التشغيل Windows، فأنت بحاجة إلى التأكد من وجود الدليل، وإلا فستتلقى رسالة خطأ.
ثم حدد الدالة:
<? PHP
وظيفة db_log($db_log_message) {
العوالم $db_log_file;
$db_log_f = fopen($db_log_file, "a");
fwrite($db_log_f, date("Y md H:i:s""." ".$db_log_message."rn");
fClose($db_log_f);
}
؟ >
عندما تريد تسجيل المعلومات، أضف الكود التالي:
<? PHP
db_log("قاعدة البيانات الحالية:" . db_database());
؟ >
في الواقع يمكنك استخدام ملفات سجل النظام أو المضمنة. ولكن عليك بعد ذلك العثور على جزء صغير من المعلومات في الكثير من الملفات. لذلك يساعدك ملف السجل المنفصل هذا في الاختبار. أقترح كتابة الكود التالي قبل وبعد التسجيل:
<? PHP
db_log("قاعدة البيانات الحالية:" . db_database());
db_database("كتالوج الكتب");
db_log("قاعدة البيانات الحالية:" . db_database());
؟ >
عند الوصول إلى البيانات، تذكر استخدام قاعدة البيانات الصحيحة، وليس قاعدة البيانات المحددة في PHPLIB. يمكنك إنشاء وظيفة مجمعة لقاعدة البيانات، أو تغيير الوظيفة التي تستخدمها. إذا كنت تستخدم mysql_query()، فيمكنك استخدام db_database() أولاً، ويمكنك استخدام
<? PHP
$result = mysql_db_query(db_database("bookcatalogue"), "select * from؟",
db_connect());
؟ > الذي يقترح الدالة: <? PHP
الدالة db_query($db_query_database, $db_query_sql) {
العودة (mysql_db_query(db_database($db_query_database), $db_query_sql,
db_connect());
}
؟ >
بدلاً من
<؟ PHP
db_database("كتالوج الكتب");
$result = mysql_query("اختر * من؟", db_connect());
؟
يمكنك
الآن
القيام بذلكباستخدام PHPLIB (أو برنامج مشابه) للوصول إلى قواعد بيانات متعددة
.تمديد الفئة/الكائن
.أدخل الاختبارات التشخيصية
.إنشاء ملفات السجل