PDO (كائن بيانات PHP) هو شيء جديد في PHP 5. عندما يكون PHP 6 على وشك الإصدار، يستخدم PHP 6 PDO فقط لمعالجة قاعدة البيانات بشكل افتراضي، وسينقل جميع امتدادات قاعدة البيانات إلى PECL، لذلك لم يعد الافتراضي هو php_mysql.dll وما شابه، ماذا علي أن أفعل؟ لا يمكننا سوى مواكبة العصر، لذلك قمت بتجربة PDO. (هذه المقالة للمبتدئين فقط، يمكن للخبراء تخطيها، هاها)
[ما هو PDO]
PDO هي ميزة جديدة رئيسية تمت إضافتها إلى PHP 5، لأنه قبل PHP 5، كان لدى php4/php3 مجموعة من امتدادات قاعدة البيانات للتواصل مع كل منها. اتصال ومعالجة قاعدة البيانات، php_mysql.dll، php_pgsql.dll، php_mssql.dll، php_sqlite.dll وامتدادات أخرى لتوصيل MySQL، PostgreSQL، MS SQL Server، SQLite، بالمثل، يجب علينا استخدام ADOdb، PEAR::DB، PHPlib : : تعتبر الفئات المجردة لقاعدة البيانات مثل DB مرهقة للغاية وغير فعالة لمساعدتنا، فكيف يمكن أن تكون كفاءة كود PHP عالية جدًا بحيث يمكننا كتابتها مباشرة في C/C++؟ لذلك، فإن ظهور PDO أمر لا مفر منه، ويجب على الجميع قبول استخدامه بموقف تعليمي هادئ. ربما ستجد أنه يمكن أن يوفر عليك الكثير من الجهد.
[تثبيت PDO]
أستخدم نظام التشغيل Windows XP SP2، لذا يتم تنفيذ العملية بأكملها على نظام التشغيل Windows، أما بالنسبة لنظام التشغيل Linux/FreeBSD والأنظمة الأساسية الأخرى، فيرجى العثور على المعلومات وإعداد التثبيت بنفسك.
إصداري هو PHP 5.1.4، والذي يأتي بالفعل بامتداد php_pdo.dll، ولكنه يتطلب القليل من الإعداد قبل أن يمكن استخدامه.
افتح c:windowsphp.ini، وهو ملف تكوين PHP الخاص بي، وابحث عن السطر التالي:
Extension_dir
هذا هو الدليل الذي يوجد به ملحق PHP 5 الخاص بي: C:php5ext، ثم سأفعل ذلك قم بتغيير هذا السطر إلى:
Extension_dir = "C:/php5/ext"
ثم ابحث عنه ضمن php.ini:
;;;;;;;;;;;;;;;;;;;;;;;
ملحقات ديناميكية ;
;;;;;;;;;;;;;;;;;;;;;;
هناك مجموعة من الأشياء المشابهة لـ ;extension=php_mbstring.dll فيما يلي تكوين تحميل ملحق PHP أضفه في النهاية إلى ملحق PDO الخاص بنا:
الامتداد=php_pdo.dll
ملحق=php_pdo_mysql.dll
ملحق=php_pdo_pgsql.dll
ملحق=php_pdo_sqlite.dll
ملحق=php_pdo_mssql.dll
ملحق=php_pdo_odbc.dll
Extension=php_pdo_firebird.dll
;extension=php_pdo_oci8.dll
يمكن إضافة العديد من برامج تشغيل PDO، لكن php_pdo_oci8.dll التالي، لأنني لم أقم بتثبيت قاعدة بيانات Oralce، لا يحتوي على هذا، لذا أستخدم فاصلة منقوطة للتعليق عليها. ثم أعد تشغيل خادم الويب الخاص بنا، IIS/Apache، خادم الويب الخاص بي هو IIS، انظر إلي بازدراء، على نظام Windows، الأمر سهل.
بعد إعادة التشغيل، اكتب ملف phpinfo.php في دليل المستندات لخادم الويب الخاص بنا وأضف ما يلي:
<?
phpinfo();
>
ثم افتح متصفحنا الجميل: IE/FireFox، متصفحي هو FireFox 2.0، لقد قمت بتنزيله للتو، إنه رائع، لست خائفًا من البرامج المارقة، هاها.
أدخل في المتصفح: http://localhost/phpinfo.php إذا كان المسار الخاص بك إلى هذه الصفحة غير متسق، فيرجى إدخاله بنفسك.
في محتوى الإخراج، إذا كان بإمكانك رؤيته بنجاح:
PDO
تم تمكين دعم PDO
توجد تعليمات مختلفة لبرنامج التشغيل في الخلف: PDO_Firebird، pdo_mssql، pdo_mysql، PDO_ODBC، pdo_pgsql
،
pdo_sqlite
.
[اختبار سريع]
أنا أستخدم MySQL 4.0.26، لكنني شخصيًا أوصي الجميع باستخدام MySQL 4.1.x أو MySQL 5.0.x، لأن هذه الإصدارات تحتوي على الكثير من الأشياء المثيرة للاهتمام التي تستحق التعلم. ما يحتاج PDO الخاص بنا إلى الاتصال به هو MySQL 4.0. إذا لم تقم بتثبيت MySQL، فيرجى تثبيته بنفسك. لقد أنشأنا MySQL وأضفنا table foo إلى مكتبة الاختبار، بما في ذلك أربعة حقول مثل المعرف والاسم والجنس والوقت.
لقد بدأنا في إنشاء أول تطبيق PDO وأنشأنا ملف pdo.php في دليل مستندات الويب:
<?php
$dsn = "mysql:host=localhost;dbname=test";
$db = new PDO($dsn, 'root', '');
$count = $db->exec("INSERT INTO foo SET name = 'heiyeluren',gender='male',time=NOW()");
صدى $ العد؛
$db = null;
>
لم أفهم ماذا يعني ذلك، فلنشرحه ببطء. هذا السطر:
$dsn = "mysql:host=localhost;dbname=test";
مخصص لإنشاء DSN (مصدر البيانات) الخاص بنا. انظر إلى المعلومات الموجودة بالداخل: نوع قاعدة البيانات هو mysql، وعنوان المضيف هو المضيف المحلي، واسم قاعدة البيانات هو مجرد عدد قليل من المعلومات. تختلف طرق إنشاء مصدر البيانات لقواعد البيانات المختلفة.
$db = new PDO($dsn, 'root', '');
المعلمة الأولى للمنشئ هي مصدر البيانات لدينا، والثانية هي اتصال المستخدم بخادم قاعدة البيانات، والمعلمة الثالثة هي كلمة المرور. . لا يمكننا ضمان نجاح الاتصال، وسنتحدث عن الاستثناءات لاحقًا.
$count = $db->exec("INSERT INTO foo SET name = 'heiyeluren',gender='male',time=NOW()");
echo $count;
يستدعي كائن PDO المتصل بنجاح لتنفيذ استعلام. هذا الاستعلام هو عملية لإدراج سجل. سيؤدي استخدام طريقة PDO::exec() إلى إرجاع نتيجة تؤثر على السجل، لذلك نقوم بإخراج هذه النتيجة. أخيرًا، لا تزال بحاجة إلى إنهاء مورد الكائن:
$db = null؛
هذا ليس اتصالًا طويلًا بشكل افتراضي. إذا كنت بحاجة إلى اتصال طويل بقاعدة البيانات، فأنت بحاجة إلى إضافة معلمة أخيرة: array(PDO::ATTR_PERSISTENT). => true) يصبح الأمر على النحو التالي:
$db = new PDO( $dsn, 'root', '', array(PDO::ATTR_PERSISTENT => true));
إنها عملية بسيطة قد لا تكون مختلفة كثيرًا من السابق، لكنه يشبه إلى حد ما ADOdb.
[تابع التعلم]
إذا أردنا استخراج البيانات، فيجب علينا استخدام وظيفة الحصول على البيانات. ($db المستخدم أدناه هو كل الكائنات المتصلة أعلاه)
<?php
foreach($db->query("SELECT * FROM foo")){
print_r($row);
}
>
يمكننا أيضًا استخدام طريقة الاكتساب هذه:
<?php
$rs = $db->query("SELECT * FROM foo");
بينما($row = $rs->fetch()){
print_r($row);
}
?>
إذا كنت تريد إدخال كافة البيانات في المصفوفة مرة واحدة، فيمكنك القيام بذلك:
<?php
$rs = $db->query("SELECT * FROM foo");
$result_arr = $rs->fetchAll();
print_r($result_arr);
>
المصفوفة
([0] => المصفوفة(
[المعرف] => 1
[0] => 1
[الاسم] => هييلورين
[1] =>هييلورين
[الجنس] =>ذكر[2] =>ذكر[الوقت] =>2006-10-28 23:14:23
[3] => 2006-10-28 23:14:23
)
}
دعونا نلقي نظرة على السجلات الموجودة بالداخل. هناك فهارس رقمية وفهارس مرتبطة بها، وهو ما يعد مضيعة للموارد. نحتاج فقط إلى الفهرس المرتبط:
<?php
$db->setAttribute(PDO::ATTR_CASE, PDO::CASE_UPPER);
$rs = $db->query("SELECT * FROM foo");
$rs->setFetchMode(PDO::FETCH_ASSOC);
$result_arr = $rs->fetchAll();
print_r($result_arr);
?>
انظر إلى الكود أعلاه، طريقة setAttribute() هي تعيين بعض السمات، السمات الرئيسية هي: PDO::ATTR_CASE، PDO::ATTR_ERRMODE، وما إلى ذلك. ما نحتاج إلى تعيينه هنا هو PDO::ATTR_CASE، أي. ، نستخدم الفهرس المرتبط للحصول على البيانات عند الإعداد، هناك عدة خيارات لمعرفة ما إذا كان الفهرس المرتبط أحرفًا كبيرة أو صغيرة:
PDO::CASE_LOWER - فرض أن يكون اسم العمود صغيرًا PDO::CASE_NATURAL - سيكون اسم العمود بالطريقة الأصلية PDO::CASE_UPPER - فرض أن يكون اسم العمود بأحرف كبيرة.
نستخدم طريقة setFetchMode لتعيين نوع قيمة الإرجاع للحصول على مجموعة النتائج. نفس الأنواع هي:
PDO::FETCH_ASSOC - نموذج المصفوفة النقابية PDO ::FETCH_NUM - شكل مصفوفة الفهرس الرقمي PDO::FETCH_BOTH - كلا نموذجي المصفوفة نعم، هذا هو PDO::FETCH_OBJ الافتراضي - في شكل كائن، مشابه لـ mysql_fetch_object()
السابق استخدم PDO::FETCH_ASSOC ما يجب استخدامه يعتمد على احتياجاتك الخاصة.
بالإضافة إلى الطريقة المذكورة أعلاه للحصول على البيانات، هناك أيضًا هذه الطريقة:
<?php
$rs = $db->prepare("SELECT * FROM foo");
$rs->تنفيذ();
بينما($row = $rs->fetch()){
print_r($row);
}
>
في الواقع، إنه نفس الشيء تقريبًا. إذا كنت تريد الحصول على نتائج حقل في سجل محدد، فيمكنك استخدام PDOSTatement::fetchColumn():
<?php
$rs = $db->query("SELECT COUNT(*) FROM foo");
$col = $rs->fetchColumn();
صدى $col;
?>
بشكل عام، يتم استخدام fetchColumn() لإجراء إحصائيات العد أو أن بعض السجلات التي تتطلب حقلاً واحدًا فقط يسهل تشغيلها.
لتلخيص العمليات المذكورة أعلاه بإيجاز:
عمليات الاستعلام هي بشكل أساسي PDO::query() وPDO::exec() وPDO::prepare(). يتم استخدام PDO::query() بشكل أساسي للعمليات التي تُرجع النتائج المسجلة، خاصة عمليات SELECT. تُستخدم PDO::exec() بشكل أساسي للعمليات التي لا تُرجع مجموعة نتائج، مثل INSERT وUPDATE وDELETE وغيرها من العمليات. تقوم بإرجاع النتيجة هي عدد الأعمدة المتأثرة بالعملية الحالية. PDO::prepare() هي في الأساس عملية معالجة مسبقة. تحتاج إلى استخدام $rs->execute() لتنفيذ عبارة SQL في المعالجة المسبقة. يمكن لهذه الطريقة ربط المعلمات وهي قوية نسبيًا، ولا يمكن شرحها ببساطة في هذه المقالة الجميع يمكنك الرجوع إلى الأدلة والوثائق الأخرى. العمليات الرئيسية للحصول على مجموعة النتائج هي: PDOStatement::fetchColumn(), PDOStatement::fetch(), PDOStatement::fetchALL(). PDOStatement::fetchColumn() هو حقل السجل الأول المحدد في نتيجة الجلب. الافتراضي هو الحقل الأول. يتم استخدام PDOStatement::fetch() للحصول على سجل، ويتم استخدام PDOStatement::fetchAll() للحصول على كافة مجموعات السجلات في مجموعة واحدة. للحصول على النتائج، يمكنك تعيين نوع مجموعة النتائج المطلوبة من خلال PDOStatement::setFetchMode .
هناك أيضًا عمليتان محيطتان، إحداهما هي PDO::lastInsertId() وPDOStatement::rowCount(). تقوم PDO::lastInsertId() بإرجاع آخر عملية إدراج، ونوع عمود المفتاح الأساسي هو آخر معرف زيادة تلقائية. يُستخدم PDOStatement::rowCount() بشكل أساسي لمجموعة النتائج المتأثرة بعمليات DELETE وINSERT وUPDATE الخاصة بـ PDO::query() وPDO::prepare()، وهو غير صالح للأسلوب PDO::exec() وعمليات التحديد.
[معالجة الأخطاء]
ماذا يجب عليك فعله إذا واجهك خطأ في البرنامج؟ نوضح هنا معلومات الخطأ ومعالجة الاستثناءات لفئة PDO.
1.
دعونا نلقي نظرة أولاً على كيفية التعامل مع أخطاء الاتصال، وما إلى ذلك، ونستخدم النهج الموجه للكائنات للتعامل معها:
<?php.
يحاول {
$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$db = null;
} التقاط (PDOException $e) {
طباعة "خطأ: " $e->getMessage() "<br/>";
يموت();
}
>
هنا نستخدم ميزة معالجة الاستثناءات الموجهة للكائنات في PHP 5. إذا كان هناك استثناء، فسنقوم بتهيئته عن طريق استدعاء PDOException لتهيئة فئة الاستثناء.
بنية السمة لفئة الاستثناء PDOException:
<?php
فئة PDOException تمتد الاستثناء
{
public $errorInfo = null; // للحصول على معلومات الخطأ، يمكنك الاتصال بـ PDO::errorInfo() أو PDOStatement::errorInfo() للوصول إلى رسالة $ المحمية; // للحصول على معلومات الاستثناء، يمكنك تجربة Exception::getMessage() الوصول إلى كود $ المحمي // رمز خطأ حالة SQL، والذي يمكن الوصول إليه باستخدام Exception::getCode();
}
>
تم دمج فئة معالجة الاستثناءات هذه مع فئة معالجة الاستثناءات المضمنة في PHP 5. دعنا نلقي نظرة سريعة على بنية فئة معالجة الاستثناءات المضمنة في PHP 5:
<?php
classException
{
// الخاصية محمية $message = 'استثناء غير معروف'; // رسالة الاستثناء protected $code = 0; // رمز الاستثناء المحدد من قبل المستخدم protected $file; مكان حدوث الاستثناء رقم السطر
// الوظيفة النهائية للطريقة getMessage(); // إرجاع معلومات الاستثناء الوظيفة النهائية getCode(); ()؛
}
?>
في المقابل، يمكن استدعاء getFile() و getLine() بشكل مناسب في التعليمات البرمجية لتحديد الأخطاء وجعل تصحيح الأخطاء أكثر ملاءمة.
2. استخدم المنهج الموجه نحو العملية
لإلقاء نظرة على الكود أولاً:
<؟
$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$rs = $db->query("SELECT aa,bb,cc FROM foo");
إذا ($db->errorCode()!= '00000'){
print_r($db->errorInfo());
مخرج؛
}
$arr = $rs->fetchAll();
print_r($arr);
$db = null;
?>
تحتوي كائنات PDO وPDOSTatement على طريقتي errorCode() وerrorInfo() إذا لم تكن هناك أخطاء، فسترجع errorCode(): 00000، وإلا فسيتم إرجاع بعض رموز الأخطاء. تقوم ErrorInfo() بإرجاع مصفوفة، بما في ذلك رموز الأخطاء المحددة بواسطة PHP وMySQL ومعلومات الخطأ. بنية المصفوفة هي كما يلي:
Array
(
[0] => 42S22
[1] => 1054
[2] => عمود "aaa" غير معروف في "قائمة الحقول"
)
بعد تنفيذ كل استعلام، تكون نتيجة errorCode() هي الأحدث، حتى نتمكن بسهولة من التحكم في عرض رسالة الخطأ بأنفسنا.
[ملخص بسيط]
من الاستخدام أعلاه، يمكننا أن نرى أن PDO قوية بالفعل. وهناك أيضًا بعض الأشياء الأخرى التي لم أذكرها، مثل معلمات الربط والمعالجة المسبقة والإجراءات المخزنة ومعالجة المعاملات والوظائف الأخرى. بالإضافة إلى ذلك، هناك هياكل DSN مختلفة لتوسيع البيانات. تحتوي قاعدة بيانات Oracle نفسها على العديد من الأشياء الخاصة التي تتطلب دراسة وفهمًا متعمقين. تصف هذه المقالة فقط بإيجاز بعض المعرفة التمهيدية، والتي يمكن اعتبارها فهمًا بسيطًا لشركة PDO.