صراحة حسيت انها غير واضحة لدى البعض .. أيضا لم اجد شرح وافي لها باللغة العربية .. فأردت اعطاء مدخل للتعامل مع اكثر الخصائص استعمالا بها .. وباذن الله اذا كان تجاوب نشرحها كاملة ..
وياليت اي اخ يجد شيء غير واضح من الكلام أو سؤال يحدده ويضعه وباذن الله نجتهد فيه.
نبذة: هي مكتبة تستخدم للتعامل مع عدة أنواع من قواعد البيانات حيث توفر واجهة يمكن ان يستخدمها المبرمج في برامجه بسلاسة وخفة.
هناك عدة مكتبات مشابهة لكني أفضل هذه المكتبة .. لمعلومات أكثر عن هذه المكتبة يرجى زيارة PHP: PDO - Manual
قواعد البيانات المدعومة:
كود:
Microsoft SQL Server and Sybase (PDO_DBLIB)
Firebird/Interbase (PDO_FIREBIRD)
IBM (PDO_IBM)
Informix (PDO_INFORMIX)
MySQL (PDO_MYSQL)
Oracle (PDO_OCI)
ODBC and DB2 (PDO_ODBC)
PostgreSQL (PDO_PGSQL)
SQLite (PDO_SQLITE)
* وتكون طريقة التعامل واحدة مع أي من قواعد البيانات المذكورة باستثناء طريقة الاتصال
* لكي تعرف هل السيرفر يدعم الdriver المطلوب أم لا قم بطباعة phpinfo ثم ابحث عن قسم PDO وستجد فيه الانواع التي يدعمها السيرفر
= ولتفعيل المكتبة في السيرفر الشخصي على الويندوز:
نفتح ملف php.ini ونحذف ال ; التي في اول السطر الذي نحتاجه
والبحث يكون عن php_pdo_ ثم اختيار المراد منه مثلا
كود:
;extension=php_pdo_firebird.dll
;extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll
extension=php_pdo_oci.dll
extension=php_pdo_oci8.dll
;extension=php_pdo_odbc.dll
extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll
* ثم حفظ الملف وعمل ريستارت للاباتشي
= وللتفعيل على السيرفر الشخصي في لينكس:
نضيف سطر جديد في php.ini يحتوي على الامتداد المطلوب ويمكن الاستعانة بالقائمة السابقة
لتحديد الامتداد المناسب..
واذا كانت هناك مشاكل في التركيب او الdriver غير موجود ممكن نركبه مع بعض.
= اسم قاعدة البيانات test . و لنبدأ بعمل جدول بسيط
كود:
CREATE TABLE `article` (
`id` int(11) NOT NULL auto_increment,
`title` varchar(200) NOT NULL,
`body` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
INSERT INTO `articles` VALUES (1, 'title1', 'Some body description for article 1');
INSERT INTO `articles` VALUES (2, 'title2', 'Some body description for article 2');
= الاتصال بقاعدة البيانات: سأتناول ال3 أنواع الاكثر استخداما بشكل فردي وأوضح طريقة العمل للبقية .. اذا كان هناك اية صعوبة اخبرني لاعطاء مثال مفصل.
MySQL
كود PHP:
$hostname = 'localhost';
$username = 'root';
$password = '123456';
$database = 'test';
$SQL = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
SQLite
كود PHP:
$db_path = '/path/test.sdb';
$SQL = new PDO("sqlite:$db_path");
ما غير ذلك من أنواع.. نضع جملة الاتصال في العنصر الأول من الدالة وممكن تفصل اليوزر والباسورد عن الجملة وتضعهم كعنصرين اضافيين في الدالة .. مثال
PgSQL
كود PHP:
$hostname = 'localhost';
$username = 'root';
$password = '123456';
$database = 'test';
$SQL = new PDO("pgsql:host=$hostname dbname=$database",$username,$password);
// OR
$SQL = new PDO("pgsql:host=$hostname dbname=$database user=$username password=$password");
= عمل اتصال دائم (لا يحتاج اغلاق) Persistent يكون كالتالي:
كود PHP:
$hostname = 'localhost';
$username = 'root';
$password = '123456';
$database = 'test';
$SQL = new PDO("mysql:host=$hostname;dbname=$database", $username, $password, array(PDO::ATTR_PERSISTENT => true));
= جلب البيانات من الجدول SELECT: وهنا يتشابه الجميع
كود PHP:
foreach($SQL->query("SELECT * FROM article") as $row){
$title = $row['title'];
$body = $row['body'];
}
// OR
$res = $SQL->query("SELECT * FROM article");
if($res->rowCount > 0){
while($row = $res->fetch(PDO::FETCH_ASSOC)){
$title = $row['title'];
$body = $row['body'];
}
}else{
//echo 'no articles found';
}
* طبعا الكود يشرح نفسه لكن افسر عدة أشياء جديدة:
- استعمال rowCount لمعرفة عدد الصفوف التي تم جلبها
- PDO::FETCH_ASSOC ربما لا تكون مألوفة عند البعض .. تستخدم لجلب النتيجة على شكل مصفوفة تحتوي فقط على مفاتيح نصية.
* هناك عدة أنواع لطريقة الجلب منها:
كود PHP:
while($row = $res->fetch(PDO::FETCH_BOTH)){
var_dump($row);
}
while($row = $res->fetch(PDO::FETCH_NUM)){
var_dump($row);
}
وهناك المزيد من أنواع الجلب لكني اخترت أكثرها استخداما للايجاز.
= الادخال INSERT + التعديل UPDATE + الحذف DELETE + التعديل ALTER:
كلهم مشتركين في طريقة التنفيذ.. مثال
كود PHP:
$affected = $SQL->exec('DELETE FROM article WHERE id=1');
* رقم الادخال insert
كود PHP:
$last_insert_id = $SQL->lastInsertId();
= اغلاق الاتصال:
------------------------------------------------------------------------------------------------------
تحديث1 -شكرا لاخي المجروح على التنبيه
= تتبع الاخطاء Error Handling:
من الجدير بالذكر أن PDO لها نظام عرض اخطاء خاص بها .. والأخطاء التي ترجعها تعتبر غير حكيمة
بمعنى ممكن عند فشل الاتصال بقاعدة البيانات تظهر رسالة خطأ تحمل معلومات السيرفر واسم المستخدم وكلمة المرور
المستخدمين في الاتصال . مثال
كود:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[28000] [1045] Access denied for user 'root'@'localhost' (using password: YES)' in ****\index.php:34 Stack trace: #0 ****\index.php(34): PDO->__construct('mysql:host=loca...', 'root', '12345')
ولتفادي ذلك نقوم بتصيد catching هذا الخطأ ومنعه من الظهور .. ثم استخدامه اذا اردنا ذلك.
مثال لكود سليم:
كود PHP:
try{
$hostname = 'localhost';
$username = 'root';
$password = '123456';
$database = 'test';
$SQL = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
$affected = $SQL->exec("DELETE FROM articles WHERE article = 2");
$SQL = null;
}catch(PDOException $e){
echo $e->getMessage();
}
وللتجربة مثلا نغير معلومات الاتصال (حذفنا رقم 6 من كلمة المرور)
كود PHP:
try{
$hostname = 'localhost';
$username = 'root';
$password = '12345';
$database = 'test';
$SQL = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
$affected = $SQL->exec("DELETE FROM articles WHERE article = 2");
$SQL = null;
}catch(PDOException $e){
echo $e->getMessage();
}
اكرر ثانية لا نستغني عن تصيد الاخطاء من الكود عند استعمال PDO الا اذا كنا على دراية بما نفعله
------------------------------------------------------------------------------------------------------
أخيرا .. هذا ما لدي الآن .. فان اخطأن فمن نفسي ومن الشيطان وان أصبت فمن الله..
اذا كان هناك اية ملاحظات او اخطاء بالكلام يرجى وضعها لاصلاحها .
أرحب بأي اسئلة خاصة بالموضوع .. وأرجو منكم دعوة بظهر الغيب.
يتبع،،