ملاحظات دراسة PHPPDO lib.culog.cn 13 نوفمبر 2007 09:36 المؤلف: Liu Shui Meng Chun [كبير، متوسط، صغير]
■ ما هو PDO؟
تمت إضافة ملحق POD (كائن بيانات PHP) في PHP5. في PHP6، سيتم استخدام PDO افتراضيًا للاتصال بقاعدة البيانات. ستتم إزالة جميع الامتدادات غير PDO من الامتداد في PHP6. يوفر هذا الامتداد PHP فئة PDO مدمجة للوصول إلى قاعدة البيانات. تستخدم قواعد البيانات المختلفة نفس اسم الطريقة لحل مشكلة اتصالات قاعدة البيانات غير المتسقة.
لقد قمت بتكوينه للتطوير تحت النوافذ.
■هدف شركة تنمية نفط عمان هو توفير واجهة برمجة تطبيقات (API) خفيفة الوزن وواضحة ومريحة تعمل على توحيد الميزات المشتركة لمكتبات RDBMS المختلفة، ولكنها لا تستبعد المزيد من الميزات المتقدمة. يوفر درجة اختيارية أكبر من التجريد/التوافق عبر نصوص PHP النصية.
■ مميزات شركة تنمية نفط عمان:
أداء. لقد تعلمت شركة تنمية نفط عُمان منذ البداية عن النجاحات والإخفاقات في توسيع نطاق قواعد البيانات الحالية. نظرًا لأن كود PDO جديد تمامًا، لدينا الفرصة لإعادة تصميم الأداء من الألف إلى الياء للاستفادة من أحدث ميزات PHP 5. قدرة. تم تصميم PDO لتوفير وظائف قاعدة البيانات المشتركة كأساس مع توفير سهولة الوصول إلى الميزات الفريدة لنظام RDBMS. بسيط. تم تصميم PDO لتسهيل العمل مع قواعد البيانات بالنسبة لك. لا تشق واجهة برمجة التطبيقات طريقها إلى التعليمات البرمجية الخاصة بك وتوضح ما يفعله كل استدعاء دالة. قابلة للتوسعة في وقت التشغيل. يعد امتداد PDO معياريًا، مما يتيح لك تحميل برامج التشغيل للواجهة الخلفية لقاعدة البيانات الخاصة بك في وقت التشغيل دون الحاجة إلى إعادة ترجمة أو إعادة تثبيت برنامج PHP بالكامل. على سبيل المثال، يقوم امتداد PDO_OCI بتنفيذ واجهة برمجة تطبيقات قاعدة بيانات Oracle بدلاً من امتداد PDO. هناك أيضًا برامج تشغيل لـ MySQL، وPostgreSQL، وODBC، وFirebird، وهناك المزيد قيد التطوير.
■ تثبيت شركة تنمية نفط عمان
ما لدي هنا هو امتداد PDO للتطوير ضمن WINDOWS. إذا كنت تريد تثبيته وتكوينه ضمن Linux، فيرجى البحث في مكان آخر.
متطلبات الإصدار:
لقد تم تضمينه بالفعل في حزمة برنامج php5.1 والإصدارات الأحدث؛
بالنسبة إلى php5.0.x، تحتاج إلى تنزيله من pecl.php.net ووضعه في مكتبة الملحقات الخاصة بك، وهو المجلد ext للمجلد الذي يوجد به PHP؛
يقول الدليل أن الإصدارات السابقة للإصدار 5.0 لا يمكنها تشغيل ملحقات PDO.
إعدادات:
قم بتعديل ملف التكوين php.ini الخاص بك بحيث يدعم pdo (إذا كنت لا تفهم php.ini، فاكتشف أولاً أنك بحاجة إلى تعديل php.ini الذي يتم عرضه عند استدعاء وظيفة phpinfo() الخاصة بك).
باقة
قم بإزالة الفاصلة المنقوطة الموجودة أمام الامتداد = php_pdo.dll. الفاصلة المنقوطة هي رمز التعليق على ملف تكوين php. هذا الامتداد ضروري.
هناك المزيد
;الامتداد=php_pdo.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_informix.dll
;الامتداد=php_pdo_mssql.dll
;الامتداد=php_pdo_mysql.dll
;الامتداد=php_pdo_oci.dll
;الامتداد=php_pdo_oci8.dll
;الامتداد=php_pdo_odbc.dll
;الامتداد=php_pdo_pgsql.dll
;extension=php_pdo_sqlite.dll
قاعدة البيانات المقابلة لكل ملحق هي:
اسم برنامج التشغيل قواعد البيانات المدعومةPDO_DBLIBFreeTDS / Microsoft SQL Server / SybasePDO_FIREBIRDFirebird/Interbase 6PDO_INFORMIXIBM Informix Dynamic ServerPDO_MYSQLMySQL 3.x/4.xPDO_OCIORacle Call InterfacePDO_ODBCODBC v3 (IBM DB2 وunixODBC وwin32)PDO_PGSQLPostgreSQLPDO_SQLITESQL ite 3 وSQLite 2
ما هي قاعدة البيانات التي تريد استخدامها، فقط ضع ما يقابلها ما عليك سوى إزالة رمز التعليق "؛" قبل التوسيع.
■استخدام شركة تنمية نفط عمان
أفترض هنا أنك قمت بتثبيت mysql. إذا لم يكن الأمر كذلك، فيرجى العثور على طريقة لتثبيته أولاً. Mysql5.0.22، ويمكن للآخرين الذين يستخدمون MySQL 4.0.26 استخدامه أيضًا.
★اتصال بقاعدة البيانات:
نستخدم المثال التالي لتحليل قاعدة بيانات اتصال PDO،
<?php
$dbms='mysql'; // نوع قاعدة البيانات يستخدم Oracle ODI. بالنسبة للمطورين، إذا كنت تستخدم قواعد بيانات مختلفة، فأنت بحاجة فقط إلى تغيير هذا، ولن تحتاج إلى تذكر الكثير من الوظائف.
$host='localhost';// اسم مضيف قاعدة البيانات
$dbName='test'; //قاعدة البيانات المستخدمة
$user='root'; // اسم مستخدم اتصال قاعدة البيانات
$pass='';//كلمة المرور المقابلة
$dsn="$dbms:host=$host;dbname=$dbName";
//
يحاول{
$dbh=newPDO($dsn,$user,$pass);// تهيئة كائن PDO تعني إنشاء كائن اتصال قاعدة البيانات $dbh
صدى "تم الاتصال بنجاح<br/>";
/*يمكنك أيضًا إجراء عملية بحث
foreach($dbh->query('SELECT * from FOO')as$row){
print_r($row);// يمكنك استخدام echo($GLOBAL);
}
*/
$dbh=null;
}قبض(PDOException$e){
يموت("خطأ!: ".$e->getMessage()."<br/>");
}
// افتراضيًا، هذا ليس اتصالاً طويلًا. إذا كنت بحاجة إلى اتصال طويل بقاعدة البيانات، فأنت بحاجة إلى إضافة معلمة في النهاية: array(PDO::ATTR_PERSISTENT => true).
$db=newPDO($dsn,$user,$pass,array(PDO::ATTR_PERSISTENT=>true))
;
★استعلام قاعدة البيانات:
لقد قمنا بالفعل بإجراء استعلام أعلاه، ويمكننا أيضًا استخدام الاستعلام التالي:
<?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::setAttribute():
PDO::ATTR_CASE: فرض اسم العمود بالتنسيق، كما هو مفصل أدناه (المعلمة الثانية):
PDO::CASE_LOWER: فرض اسم العمود على أحرف صغيرة
PDO : :CASE_NATURAL: تتبع أسماء الأعمدة الطريقة الأصلية
PDO::CASE_UPPER: فرض كتابة أسماء الأعمدة بأحرف كبيرة.
PDO::ATTR_ERRMODE: رسالة الخطأ
PDO::ERRMODE_SILENT: لا يعرض معلومات الخطأ، رمز الخطأ فقط
PDO::ERRMODE_WARNING:
يعرض خطأ تحذيري.
PDO::ATTR_ORACLE_NULLS (صالح ليس فقط لـ ORACLE، ولكن أيضًا لقواعد البيانات الأخرى): ) يحدد القيمة المقابلة في php للقيمة NULL التي ترجعها قاعدة البيانات.
PDO::NULL_NATURAL: بدون تغيير
PDO::NULL_EMPTY_STRING: يتم تحويل السلسلة الفارغة إلى
NULL.
PDO::ATTR_STRINGIFY_FETCHES: تحويل القيم الرقمية إلى سلاسل عند الجلب. يتطلب bool.PDO
::ATTR_STATEMENT_CLASS: تعيين فئة العبارة المقدمة من المستخدم والمشتقة من PDOStatement )) .
PDO::ATTR_AUTOCOMMIT(متوفر في OCI وFirebird وMySQL): ما إذا كان سيتم تنفيذ كل عبارة تلقائيًا أم لا.
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY(متوفر في MySQL): استخدم الاستعلامات المخزنة مؤقتًا.
$rs->setFetchMode(PDO::FETCH_ASSOC); في المثال هو PDOStatement::setFetchMode()، وهو إعلان لنوع الإرجاع.
هناك على النحو التالي:
PDO::FETCH_ASSOC-- نموذج المصفوفة النقابية
PDO::FETCH_NUM - نموذج مصفوفة الفهرس الرقمي
PDO::FETCH_BOTH -- كلاهما متاح في شكل مصفوفة، وهو الوضع الافتراضي
PDO::FETCH_OBJ - في شكل كائن، مشابه لـ mysql_fetch_object() السابق
لمزيد من إعلانات نوع الإرجاع (PDOStatement::method name)، راجع الدليل.
★إدراج، تحديث، حذف البيانات،
$db->exec("حذف من `xxxx_menu` حيث منتصف=43");
لتلخيص العمليات المذكورة أعلاه بإيجاز:
عمليات الاستعلام هي بشكل أساسي 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() وعمليات التحديد.
★المعاملات والتقديم التلقائي
عند هذه النقطة، لقد قمت بالاتصال بـ mysql من خلال شركة تنمية نفط عمان قبل إصدار الاستعلامات، يجب أن تفهم كيفية إدارة شركة تنمية نفط عمان للمعاملات. إذا لم تكن قد تعرضت للمعاملات من قبل، فيجب عليك أولاً معرفة الخصائص الأربع للمعاملات: الذرية والاتساق والعزل والمتانة، أي ACID. بعبارات الشخص العادي، بالنسبة لأي عمل يتم تنفيذه ضمن معاملة، حتى لو تم تنفيذها على مراحل، هناك ضمان بأن العمل سيتم تطبيقه بأمان على قاعدة البيانات ولن يتأثر بالطلبات الواردة من اتصالات أخرى أثناء تقديم العمل . تأثير. يمكن التراجع عن عمل المعاملات تلقائيًا عند الطلب (على افتراض أنك لم تقم بذلك بعد)، مما يجعل معالجة الأخطاء في البرامج النصية أسهل بكثير.
يتم تنفيذ المعاملات عادةً من خلال تجميع مجموعة من التغييرات وجعلها فعالة في نفس الوقت. وتتمثل ميزة ذلك في أنه يمكنه تحسين كفاءة هذه التحديثات بشكل كبير. بمعنى آخر، يمكن للمعاملات أن تجعل البرامج النصية أسرع وربما أكثر قوة (على الرغم من ضرورة استخدام المعاملات بشكل صحيح للحصول على مثل هذه الفوائد).
لسوء الحظ، لا تدعم كل قاعدة بيانات المعاملات (يدعم Mysql5 المعاملات، ولا أعرف mysql4)، لذلك عند فتح الاتصال لأول مرة، تحتاج شركة PDO إلى التشغيل في ما يسمى بوضع "الالتزام التلقائي". يعني وضع الالتزام التلقائي أنه إذا كانت قاعدة البيانات تدعم المعاملات، فإن كل استعلام تقوم بتشغيله له معاملة ضمنية خاصة به، وإذا كانت قاعدة البيانات لا تدعم المعاملات، فلن يحتوي كل استعلام على مثل هذه المعاملة. إذا كنت بحاجة إلى معاملة، فيجب عليك استخدام طريقة PDO::beginTransaction() لبدء المعاملة. إذا كان برنامج التشغيل الأساسي لا يدعم المعاملات، فسيتم طرح PDOException (بغض النظر عن إعدادات معالجة الأخطاء: هذه دائمًا حالة خطأ فادحة). ضمن المعاملة، يمكنك استخدام PDO::commit() أو PDO::rollBack() لإنهاء المعاملة، اعتمادًا على ما إذا كان الكود الذي يتم تشغيله في المعاملة ناجحًا.
عندما ينتهي البرنامج النصي، أو عندما يكون الاتصال على وشك الإغلاق، إذا كانت هناك معاملة معلقة، فسوف تقوم شركة تنمية نفط عمان بإرجاع المعاملة تلقائيًا. يعد هذا إجراءً أمنيًا للمساعدة في تجنب التناقضات إذا انتهى البرنامج النصي بشكل غير طبيعي - إذا لم يتم الالتزام بالمعاملة بشكل صريح، فمن المفترض أنه سيكون هناك عدم اتساق في مكان ما، لذلك سيتم إجراء التراجع للحفاظ على أمان البيانات.
//مثال من http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0505furlong/index.html
يحاول{
$dbh=new PDO('odbc:SAMPLE','db2inst1','ibmdb2',
array(PDO_ATTR_PERSISTENT=>true));
echo"متصلn";
$dbh->setAttribute(PDO_ATTR_ERRMODE,PDO_ERRMODE_EXCEPTION);
$dbh->beginTransaction();
$dbh->exec("أدخل في قيم الموظفين (المعرف، الأول، الأخير) (23، 'Joe'، 'Bloggs')");
$dbh->exec("أدخل في تغيير الراتب (المعرف، المبلغ، التغيير)"
القيم (23، 50000، NOW ())")؛
$dbh->commit();
}قبض(استثناء $e){
$dbh->rollBack();
echo"Failed: ".$e->getMessage();
}
في المثال أعلاه، لنفترض أننا قمنا بإنشاء مجموعة من الإدخالات لموظف جديد برقم معرف، وهو 23. بالإضافة إلى إدخال البيانات الأساسية للشخص، نحتاج أيضًا إلى تسجيل راتب الموظف. من السهل إجراء كلا التحديثين بشكل منفصل، ولكن من خلال تضمين كلا التحديثين في استدعاءات beginTransaction() وcommit()، فإنك تضمن عدم تمكن أي شخص آخر من رؤية التغييرات حتى تكتمل. في حالة حدوث خطأ، يمكن لكتلة الالتقاط التراجع عن جميع التغييرات التي حدثت منذ بداية المعاملة وطباعة رسالة خطأ.
ليس من الضروري إجراء التحديثات ضمن المعاملة. يمكنك أيضًا إصدار استعلامات معقدة لاستخراج البيانات وإنشاء المزيد من التحديثات والاستعلامات باستخدام تلك المعلومات. عندما تكون المعاملة نشطة، فمن المؤكد أنه لا يمكن للآخرين إجراء تغييرات أثناء تقدم العمل. في الواقع، هذا ليس صحيحًا بنسبة 100%، ولكنه مقدمة جيدة إذا لم تكن قد سمعت عن المعاملات من قبل.
★البيانات المعدة والإجراءات المخزنة تدعم العديد من قواعد البيانات الأكثر نضجًا مفهوم البيانات المعدة. ما هي البيانات المعدة؟ يمكنك التفكير في البيانات المعدة كقالب مجمع لـ SQL الذي تريد تشغيله، والذي يمكن تخصيصه باستخدام معلمات متغيرة. توفر البيانات المعدة فائدتين رئيسيتين:
يحتاج الاستعلام إلى التحليل (أو التحضير) مرة واحدة فقط، ولكن يمكن تنفيذه عدة مرات باستخدام نفس المعلمات أو معلمات مختلفة. عندما يكون الاستعلام جاهزًا، تقوم قاعدة البيانات بتحليل وتجميع وتحسين خطة تنفيذ الاستعلام. تستغرق هذه العملية وقتًا أطول بالنسبة للاستعلامات المعقدة ويمكن أن تبطئ تطبيقك بشكل كبير إذا كنت بحاجة إلى تكرار نفس الاستعلام عدة مرات باستخدام معلمات مختلفة. باستخدام البيانات المعدة، يمكنك تجنب دورات التحليل/التجميع/التحسين المتكررة. ببساطة، تستخدم البيانات المعدة موارد أقل وبالتالي تعمل بشكل أسرع.
المعلمات المتوفرة للبيانات المعدة لا تحتاج إلى أن تكون محاطة بعلامات اقتباس؛ يقوم برنامج التشغيل بمعالجتها. إذا كان التطبيق الخاص بك يستخدم البيانات المعدة بشكل حصري، فيمكنك التأكد من عدم حدوث أي عمليات اقتحام لـ SQL. (ومع ذلك، لا تزال هناك مخاطرة إذا كنت لا تزال تعتمد أجزاء أخرى من الاستعلام على مدخلات غير موثوقة).
تعد البيانات المعدة مفيدة جدًا لدرجة أن شركة تنمية نفط عمان تكسر فعليًا القاعدة المحددة في الهدف 4: إذا كان السائق لا يدعم البيانات المعدة، فستقوم شركة تنمية نفط عمان بمحاكاة البيانات المعدة.
مثال: مثال تطبيق PDO:
<?php
'
mysql';// نوع قاعدة البيانات يستخدم Oracle ODI. بالنسبة للمطورين، الذين يستخدمون قواعد بيانات مختلفة، طالما قمت بتغيير ذلك، فلن تضطر إلى تذكر الكثير من الوظائف
اسم المضيف
$dbName='test';// قاعدة البيانات المستخدمة
$user='root';// اسم مستخدم اتصال قاعدة البيانات
$pass='';// كلمة المرور المقابلة
$dsn="$dbms:host=$host;dbname= $dbName";
كلاسدبيكستيندزPDO{
الوظيفة العامة __ بناء () {
يحاول{
parent::__construct("$GLOBALS[dsn]",$GLOBALS['user'],$GLOBALS['pass']);
}قبض(PDOException$e){
يموت("خطأ: ".$e->__toString()."<br/>");
}
}
publicfinalfunctionquery($sql){
يحاول{
returnparent::query($this->setString($sql));
}قبض(PDOException$e){
يموت("خطأ: ".$e->__toString()."<br/>");
}
}
مجموعة الوظائف النهائية الخاصة($sql){
صدى "أريد معالجة $sql";
إرجاع $sql؛
}
}
$db=newdb();
$db->setAttribute(PDO::ATTR_CASE,PDO::CASE_UPPER);
foreach($db->query('SELECT * from xxxx_menu')as$row){
print_r($row);
}
$db->exec('حذف من `xxxx_menu` حيث منتصف=43');
?>