صفحة 1 من 2 12 الأخيرةالأخيرة
النتائج 1 إلى 15 من 26

الموضوع: شرح قصير للتعامل مع مكتبة PDO

  1. #1
    عضو نشيط جدا
    تاريخ التسجيل
    Jan 2008
    المشاركات
    512

    شرح التعامل مع مكتبة PDO [الجزء الأول]



    صراحة حسيت انها غير واضحة لدى البعض .. أيضا لم اجد شرح وافي لها باللغة العربية .. فأردت اعطاء مدخل للتعامل مع اكثر الخصائص استعمالا بها .. وباذن الله اذا كان تجاوب نشرحها كاملة ..
    وياليت اي اخ يجد شيء غير واضح من الكلام أو سؤال يحدده ويضعه وباذن الله نجتهد فيه.




    نبذة:
    هي مكتبة تستخدم للتعامل مع عدة أنواع من قواعد البيانات حيث توفر واجهة يمكن ان يستخدمها المبرمج في برامجه بسلاسة وخفة.
    هناك عدة مكتبات مشابهة لكني أفضل هذه المكتبة .. لمعلومات أكثر عن هذه المكتبة يرجى زيارة 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(); 


    = اغلاق الاتصال:


    كود PHP:
    $SQL null
    ------------------------------------------------------------------------------------------------------
    تحديث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 الا اذا كنا على دراية بما نفعله

    ------------------------------------------------------------------------------------------------------


    أخيرا .. هذا ما لدي الآن .. فان اخطأن فمن نفسي ومن الشيطان وان أصبت فمن الله..
    اذا كان هناك اية ملاحظات او اخطاء بالكلام يرجى وضعها لاصلاحها .
    أرحب بأي اسئلة خاصة بالموضوع .. وأرجو منكم دعوة بظهر الغيب.

    يتبع،،





    التعديل الأخير تم بواسطة mr_m ; 30-03-2009 الساعة 02:50 PM
    __________________
    محمد حمود.


  2. #2
    عضو فعال
    تاريخ التسجيل
    Jul 2008
    المشاركات
    1,109


    جزاك الله خيرا اخي الكريم





    __________________
    ســـــــبحان الله وبـــــــــحمده *سبـــــــــــحان الله العظيم
    لطلب البرمجة فقط
    helal-egypt@hotmail.com

  3. #3
    عضو نشيط
    تاريخ التسجيل
    Jan 2008
    المشاركات
    213


    ما شاء الله عليك
    من زمان منتظرين هيك شرح
    مشكور والله يعطيك الف عافيه






  4. #4
    عضو نشيط
    تاريخ التسجيل
    Jan 2008
    المشاركات
    213


    يا شباب الي عنده خبره في قواعد البيانات اوراكل
    يا ريت يعطيني قاعدة بيانات صغيره عشان اجرب عليها ويعطيني بعض المعلومات عنها
    ومشكورين






  5. #5


    ينصح بشدة أستخدام try || catch
    فالمكتبة تعرض بيانات قاعدة البيانات علي المتصفح لو حدث خطأ ومنها يوزر وباس قاعدة البيانات تعرضهم كتابتاً !!
    وهم نفسهم كتبوا هذا الكلام في الموقع

    وألف شكر علي الشرح أخي





    __________________
    السيف أصدق أنباء من الكتب

  6. #6
    عضو نشيط جدا
    تاريخ التسجيل
    Jan 2008
    المشاركات
    512


    وجزاك اخي محمد هلال
    --
    اخي فارس فقط اعمل schema جديدة و نفذ استعلام الجدول بداخلها
    او اذا كنت تريد التجربة على شيء واقعي فستجده في جوجل بالبحث في "Oracle sample schemas"
    --
    اهلا بك اخي المجروح فعلا try و catch ينصح بشدة ومهمتين .. حقيقة كنت مركز على الشرح وتبسيط الكود بحيث يتفهم وبعدها افرد شرح مفصل اكثر وبشكل اكثر حرفية..

    لكن فعلا هذا توجيه سليم ساضيفها في الموضوع.





    __________________
    محمد حمود.

  7. #7


    رائع تسلم أخي

    وممكن بدلاً من echo $e->getMessage(); أن تستخدم دالة mail لإرسال الخطأ علي بريدك لمتابعة كل أخطاء الداتا بيز التي تواجه زوارك والتي قد لا تواجهك أنت ( كما يحدث مع الفيبولتن )





    __________________
    السيف أصدق أنباء من الكتب

  8. #8
    عضو فعال
    تاريخ التسجيل
    Jul 2008
    المشاركات
    1,109


    اخي المكتبة مش عندي مع اني محمل اخر نسخة من الاباتشي





    __________________
    ســـــــبحان الله وبـــــــــحمده *سبـــــــــــحان الله العظيم
    لطلب البرمجة فقط
    helal-egypt@hotmail.com

  9. #9
    عضو نشيط جدا
    تاريخ التسجيل
    Jan 2008
    المشاركات
    512


    المجروح: فكرة جميلة ..وايضا للاضافة هناك بعض يقوم بعمل log للموقع يكون عبارة عن ملفين او ثلاثة
    الأول يحتوي على تسجيل لكل محاولات الاختراق للموقع وبيان الاجراء الذي اتخذه ضدها
    والثاني كل الاخطاء التقنية التي تحدث في الموقع .. وبالتطبيق على مثالين:

    - عند حدوث خطأ في الاتصال بقاعدة البيانات .. فسوف يتم تسجيله بملف الخطأ الخاص بالاخطاء التقنية
    لأن السبب الأرجح هو توقف السيرفر الذي يستضيف القاعدة

    - عند حدوث خطأ مثلا عامود غير موجود أو شيء من هذا القبيل فان الخطأ في اغلب الحالات يسجل في ال security log
    وهذا لأنه سيكون ناتج في اغلب الاحوال عن SQL injection وهكذا

    --------
    اخ محمد: تم اضافة طريقة تفعيلها في اول الموضوع شكرا لك.





    __________________
    محمد حمود.

  10. #10
    عضو فعال
    تاريخ التسجيل
    Jul 2008
    المشاركات
    1,109


    المجروح: فكرة جميلة ..وايضا للاضافة هناك بعض يقوم بعمل log للموقع يكون عبارة عن ملفين او ثلاثة
    الأول يحتوي على تسجيل لكل محاولات الاختراق للموقع وبيان الاجراء الذي اتخذه ضدها
    والثاني كل الاخطاء التقنية التي تحدث في الموقع .. وبالتطبيق على مثالين:

    - عند حدوث خطأ في الاتصال بقاعدة البيانات .. فسوف يتم تسجيله بملف الخطأ الخاص بالاخطاء التقنية
    لأن السبب الأرجح هو توقف السيرفر الذي يستضيف القاعدة

    - عند حدوث خطأ مثلا عامود غير موجود أو شيء من هذا القبيل فان الخطأ في اغلب الحالات يسجل في ال security log
    وهذا لأنه سيكون ناتج في اغلب الاحوال عن SQL injection وهكذا

    --------
    اخ محمد: تم اضافة طريقة تفعيلها في اول الموضوع شكرا لك.
    انا مش لقي الكود ده خالص

    كود PHP:
    extension=php_pdo_mysql.dll 
    جزاك الله الف خيرا اخي الكريم
    بس بعد اذنك انك تكتب الي الي نحذف من امامة العلامة يعني مثلا هنستخدم قاعدة البيانات mysql





    التعديل الأخير تم بواسطة محمدهلال ; 30-03-2009 الساعة 11:15 AM
    __________________
    ســـــــبحان الله وبـــــــــحمده *سبـــــــــــحان الله العظيم
    لطلب البرمجة فقط
    helal-egypt@hotmail.com

  11. #11
    عضو نشيط جدا
    تاريخ التسجيل
    Jan 2008
    المشاركات
    512


    نبحث عن هذا السطر extension=php_pdo_mysql.dll ونحذف علامة الفاصلة المنقوطة semi colon التي في أول السطر
    ثم نحفظ الملف وريستارت للاباتشي





    __________________
    محمد حمود.

  12. #12
    عضو فعال
    تاريخ التسجيل
    Jul 2008
    المشاركات
    1,109


    نبحث عن هذا السطر extension=php_pdo_mysql.dll ونحذف علامة الفاصلة المنقوطة semi colon التي في أول السطر
    ثم نحفظ الملف وريستارت للاباتشي
    انا مشلقية خالص

    وده الكود كلة

    كود PHP:

    ;extension=php_mbstring.dll
    ;extension=php_bz2.dll
    extension
    =php_curl.dll
    ;extension=php_dba.dll
    extension
    =php_dbase.dll
    ;extension=php_exif.dll
    ;extension=php_fdf.dll
    ;extension=php_filepro.dll
    extension
    =php_gd2.dll
    ;extension=php_gettext.dll
    ;extension=php_ifx.dll
    ;extension=php_imap.dll
    ;extension=php_interbase.dll
    ;extension=php_ldap.dll
    extension
    =php_mbstring.dll
    ;extension=php_mcrypt.dll
    ;extension=php_mhash.dll
    ;extension=php_mime_magic.dll
    ;extension=php_ming.dll
    ;extension=php_mssql.dll
    ;extension=php_msql.dll
    extension
    =php_mysql.dll
    extension
    =php_mysqli.dll
    ;extension=php_oci8.dll
    ;extension=php_openssl.dll
    ;extension=php_oracle.dll
    ;extension=php_pgsql.dll
    ;extension=php_shmop.dll
    ;extension=php_snmp.dll
    extension
    =php_sockets.dll
    ;extension=php_sqlite.dll
    ;extension=php_sybase_ct.dll
    ;extension=php_tidy.dll
    ;extension=php_xmlrpc.dll
    ;extension=php_xsl.dll
    ;extension=php_pdo.dll
    ;extension=php_pdo_sqlite.dll
    ;extension=php_winbinder.dll 






    __________________
    ســـــــبحان الله وبـــــــــحمده *سبـــــــــــحان الله العظيم
    لطلب البرمجة فقط
    helal-egypt@hotmail.com

  13. #13
    عضو نشيط جدا
    تاريخ التسجيل
    Jan 2008
    المشاركات
    512


    طيب ضيف السطر في اخر الملف اذا ظهر خطأ تكون المكتبة غير موجودة ونضع طريقة تركيبها لكن 90% ستكون موجودة





    __________________
    محمد حمود.

  14. #14
    عضو فعال
    تاريخ التسجيل
    Jul 2008
    المشاركات
    1,109


    طيب ضيف السطر في اخر الملف اذا ظهر خطأ تكون المكتبة غير موجودة ونضع طريقة تركيبها لكن 90% ستكون موجودة
    اخي بطلع الكلاس مش موجود دية ارساله اية


    كود PHP:

    Fatal error
    : Class 'PDO' not found in C:\AppServ\www\test\config.php on line 37 






    __________________
    ســـــــبحان الله وبـــــــــحمده *سبـــــــــــحان الله العظيم
    لطلب البرمجة فقط
    helal-egypt@hotmail.com

  15. #15
    عضو نشيط جدا
    تاريخ التسجيل
    Jan 2008
    المشاركات
    512


    طيب اخي عفوا ضع ملف php.ini وما هو السيرفر الشخصي الذي تستعمله؟





    __________________
    محمد حمود.





ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •  

أضف موقعك هنا| اخبار السيارات | حراج | شقق للايجار في الكويت | بيوت للبيع في الكويت | شركة كشف تسربات المياه | شركة عزل اسطح بالرياض | عزل فوم بالرياض| عزل اسطح بالرياض | كشف تسربات المياة بالرياض | شركة عزل اسطح بالرياض