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

الموضوع: [درس البرمجة الكائنية] تسهيل عمليات قواعد البيانات - لنرتقي الى مستوى اعلى من البرمجة

  1. [درس البرمجة الكائنية] تسهيل عمليات قواعد البيانات - لنرتقي الى مستوى اعلى من البرمجة



    كما نعلم ان البرمجة الكائنية لها مميزات كثيرة، خصوصا بعد التغيرات التي حصلت مع الاصدار الخامس من PHP.
    الدرس سيتكلم عن اساسيات و طرق التطوير. برامج ذات هذه الخصائص.

    في البدايه لماذا لا نبدء بكتابه قواعد البيانات. لنسمية tutorial ونضع الجداول التالي فيه
    كود:
    CREATE TABLE IF NOT EXISTS `users` (
    	`id` int(11) NOT NULL auto_increment,
    	`name` varchar(50) NOT NULL,
    	`username` varchar(50) NOT NULL,
    	`password` varchar(50) NOT NULL,
    	`email` varchar(50) NOT NULL,
    	`created` datetime NOT NULL,
    	`updated` datetime NOT NULL,
    	PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM;
    
    
    CREATE TABLE IF NOT EXISTS `articles` (
    	`id` int( 11 ) NOT NULL AUTO_INCREMENT ,
    	`name` varchar( 50 ) NOT NULL ,
    	`user_id` int( 11 ) NOT NULL ,
    	`body` varchar( 50 ) NOT NULL ,
    	`created` datetime NOT NULL ,
    	`updated` datetime NOT NULL ,
    	PRIMARY KEY ( `id` )
    ) ENGINE = MYISAM;
    تصميم الجدو جدا سهل. ولكن الفرق هو انني استخدمت احد المعاير القياسية المتبعه من قبل مبرمجي لغة الRuby وهي الان من احدى المعاير المشهورة التي يتبعها اكثر المبرمجين المحترفين. الشروط هي:

    1- ان تسمي الجداول باسماء واضحه والاسم يجب ان يكون جمع، فمثلا لا نسمي الجدول car لانه فردي فنسميه cars لاننا كما نعلم ان الجداول سيحتوى على اكثر من سجل.
    2- ان تضع المفتاح باسم id، لا تسميه اسماء اخرى، لا جدوى في ذالك!
    3- ان تضع في كل جدول name بدون استسناء، حاول ان تبحث لي جدول فيه سجل بدون اسم؟ حتى المواضيع يمكن ان يكون له name بدلا من title، هذا الشرط يأخذه المبرمجون كالمُسلمه، "اما في جداول التي هي مجموعة مفاتيح، فلا تستخدم name"
    4- ان تضع created و updated كاسماء للحقول التي ستتعامل مع الزمن، في بعض الاحيان ستلاحض انك تريد حقول اخرى غير created و updated .. في هذه الحاله اضمن انها اسم ماضي، فلا تكتب publish اكتبها published لان عند زيارتها ستكون دائما في الماضي، اما الحقول التي ستكون في المستقبل، لم يتوافق الجميع على المعاير، ولكن الاكثريه ومازالو يستخدمونها في الصيغه الماضيه.
    5- المفاتيح الاجنبيه Forign Keys يستعمل اسم الجدول بالصيغه المفردة وتضاف id_ في المؤخرة، في مثالي ستجد user_id
    6- الجداول تي تتكون من مفاتيح فقط "هذه الجداو تستخدم في ربط عدة سجلات من جدول بعدة سجلات من جداول اخرى"، اسم الجدول يكون كالتاي .. اسم الجدول الاول زائد اسم الجدول الثاني مفصول ب "_" ويكون اسم الجدول الاول هو الجدول الاول ابجديا.. مثال "articles_tags" او "apartments_owners"

    ================

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

    كود PHP:
    <?php
    // config.php

    $dbUsername 'root';
    $dbPasswor '';
    $dbHost 'localhost';
    $dbDatabase 'tutorial';

    $db mysql_connect($dbHost,$dbUsername,$dbPasswor);
    mysql_select_db($dbDatabase,$db);

    ?>
    وبعدها نكتب ملف الmysql.php سيحتوي هذا الملف على كلاس الmysql الرئيسي.

    كود PHP:
    <?php
    //mysql.php

    class mysql{
        var 
    $tableName;
        
        function 
    find($rowId,$type MYSQL_ASSOC){
            
    $result mysql_query('select * from '.$this->tableName.' where id = '.$rowId.' LIMIT 1') or die(mysql_error());
            
    $row mysql_fetch_array($result,$type);
            return 
    $row;
        }
    }
    ?>
    الان لقد وضعت داله اسمها find في الكلاس، وذالك الكلاس يتطلب متغير tableName$ فيه. وهو بسيط. دعونا الان ينستفيد من هذا الكلاس بعمل توسعه له من ملف اخر، لنسمية user .. فالان في ملف الuser.php نضع

    كود PHP:
    <?php
    //user.php
    require_once 'mysql.php';

    class 
    user extends mysql{
        
        function 
    user(){
            
    $this->tableName 'users';
        }

    }

    ?>

    السحر كله في الكلمة extends وهي كلما معناها تقريبا توسعه، ... السحر يكمن في انني كتبت قليل ولكن لانني عملت توسعه للكلاس mysql فجعلت الكلاس user يمتلك خصائص الكلاس الاب mysql

    فالان في ملف الtest.php ممكن ان تكتب

    كود PHP:
    <?php
    //test.php

    require_once 'config.php';
    require_once 
    'user.php';

    $user = new user();
    print_r($user->find(1));


    ?>

    الان، ادخلت الملفين config.php و الملف user.php لانني ساستخدم الكلاس user. البرنامج الان يطبع السجل الاول من الجدول user .. لماذا نفعل نفس الشيء للجدول articles فنكتب.

    كود PHP:
    <?php
    //articles.php
    require_once 'mysql.php';

    class 
    article extends mysql{
        
        function 
    user(){
            
    $this->tableName 'articles';
        }

    }

    ?>
    فالان كتبت القليل ولكن لدي نفس الخصائص في الmysql وuser وarticles .. لماذا لا نعطي خاصيه جديده لجميع الكلاسات بدون ان اكتب في كل الملفات ... فالحل هو في وضع الخاصيه الجديده في الكلاس mysql ونسنرى ان جميع الكلاسات لديها تلك الخاصيه.. فمثلا. نريد ان نأخذ جميع المعلومات الاخرى من الحقول الاخرى ولكن نريد ان نبحث عن طريق الاسم وليس الid

    الحل.
    كود PHP:
    <?php
    //mysql.php

    class mysql{

        var 
    $tableName;
        
        function 
    find($rowId,$type MYSQL_ASSOC){
            
    $result mysql_query('select * from '.$this->tableName.' where id = '.$rowId.' LIMIT 1') or die(mysql_error());
            
    $row mysql_fetch_array($result,$type);
            return 
    $row;
        }
        
        function 
    findByName($name,$type MYSQL_ASSOC){
            
    $result mysql_query('select * from '.$this->tableName.' where name = "'.$name.'" LIMIT 1') or die(mysql_error());
            
    $row mysql_fetch_array($result,$type);
            return 
    $row;        
        }

    }
    ?>
    الان يمكننا فعل
    كود PHP:
    <?php
    //test.php

    require_once 'config.php';
    require_once 
    'user.php';

    $user = new user();

    print_r($user->findByName("khalid"));


    ?>
    فالان .. الكلاس mysql و user و article لديهم نفس الخصائص. ولكن .. لماذا لا نطور الكلاس user بنفسه؟ لاننا نريد مثلا ان نسجل دخول ونعلم ان تسجيل الدخول فقط من خصائص الكلاس user .. فنعمل التالي

    كود PHP:
    <?php
    //user.php
    require_once 'mysql.php';

    class 
    user extends mysql{
        
        function 
    user(){
            
    $this->tableName 'users';
        }
        
        function 
    login($userName,$passWord){
            
    $row $this->findByName($userName);
            if(
    $row['password'] == $passWord){
                return 
    true;
            }
            else{
                return 
    false;
            }
        }

    }

    ?>
    فالان لاننا فعلنا ذالك فيمكنني ان اكتب

    كود PHP:
    <?php
    //test.php

    require_once 'config.php';
    require_once 
    'user.php';

    $user = new user();

    if(
    $user->login("khalid","abc123")){
        echo 
    'You are successfully loged in';
    }
    else{
        echo 
    'Your password was not correct, please try again';
    }
    ?>
    الان عرفتم ان البرمجه الكائنيه اصلا سهله. ولا تريد ان تكون عبقرايا لكي تتعلمها، وايضا عرفتم ان البرمجه الكائنية هي برمجة تسهل عمليه التحديث وتصحيح الاخطاء لان الشفره لن تتكر كتابتها في امكان مختلفه، اي اذا كانت هناك عطل فستجد ان العطل موجود في ملف واحد، وتصحيح تلك الاخطاء سيصحح جميع الاخطاء في الاماكن الخرى. فهذه هي ميزه البرمجه الكائنية.

    الان اذا سئلت اي مبرمج محترف سيحاول ان يقول لك جملتين الاوله KISS وهي اختصار للجمله Keep It Simple Stupid اي حاول ان تعمل برنامج سهل الفهم والقرائه، فلذالك يستعملوا البرمجه الكائنية لانها سهل الفهم من قبل المبرمجين الاخرون
    الثانيه هي الجمله Do Not Repeat Yourself ومعناها ان لا تكرر ملفات الشفرات، اي ضع مكان واحد للخصائص، وجعل جميع الملفات يأخذ خصائصها من ملف واحد، اي اذا وجدت خظا ما. فحل الملف الرئيسي يغنيك عن فتح جميع الملفات الاخرى وتحديثهم

    =========
    ملاحظه: الدرس لا يتكلم عن الطرق الحقيقه في عمل برنامج محكم من الثغرات ولا يتطرق الى طرق تحيسن اداء البرنامج. الدرس فقط للتوضيح.
    الدرس القادم: استخدام الJquery انا اعرف ان الدرس ليس له دخل في PHP حاليها .. ولكن هو مقدمه جميله لكي ندخل في الدرس الاهم وهو كيفيه استخدام الZendFramework ففي تعلم هذا سيساعدك على كتابه برامج بسرعات لا تتخيلها.





    __________________
    هلابي افضل المواقع العربية تصميماً
    انصح باستخدام ابونتو


  2. #2
    عضو فعال
    تاريخ التسجيل
    Jun 2002
    المشاركات
    1,346


    بسم الله الرحمن الرحيم

    السلام عليكم ورحمة الله وبركاته


    درس جميل جدا..
    جزاك الله ألف خير أخي الكريم...


    في أمان الله






  3. #3
    عضو نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    32


    درس رائع جداً ، جزاك الله الف خيراختصرت عليّ كثير ..ألف شكر لك ،، وبإنتظار المزيدفي امان الكريم ،،






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


    بصراحة البرمجة الكائنية متعة كبيرة جدا والبرمجة تصير سهلة جدا جدا
    المشكلة البعض يستصغرها ويتجاهلها لأنه لم يصل لمرحلة انه يحتاج استخدامها، ويعتقد انها محفظة للدوال لا أكثر


    ملاحظة: مو شرط كل جدول يجب أن يكون له name مثلا جدول friends_list :
    id
    userid
    friendid

    وممكن الجدول يتطلب أكثر من اسم فــname مايوفي، على سبيل المثال firstname lastname





    التعديل الأخير تم بواسطة Foxhound ; 31-07-2008 الساعة 10:49 PM سبب آخر: إضافة الملاحظة الأخيرة



  5. شكرا لكم جميعا،
    الى الاخ Foxhound
    الاسم name ياخذه البعض كمسلمه، فاذا هناك مثلا الاسم الاول والاخير فسيكتب name و lastname .. اما في المثال التي كتبت عنه، وهو freinds_lists لن يكون هناك اسم مثل ما وضحت في الشرط الثالث من المعاير القياسيه لقواعد البيانات. ولكن لا تنسى الاسم الاول والثاني للجدول يجب ان يكون جمع، والحقول يفصل اسماء الجداول ب "_" اي اذا استخدمنا مثالك سيكوم
    id
    user_id
    friend_id





    __________________
    هلابي افضل المواقع العربية تصميماً
    انصح باستخدام ابونتو

  6. #6
    عضو فعال
    تاريخ التسجيل
    Nov 2005
    المشاركات
    1,390


    بارك الله فيك أخي العزيز
    درس جميل وممتع
    إستفدت فعلا من المعايير القياسية للقواعد البينات وسوف أعيد قرائة الدرس مرة اخرى كي أستوعب جيدا بقيته في البرمجة الكائنية
    أتمنى كذالك أن تتطرق للمعاير القياسية في البرمجة ب PHP والتي يستعملها محترفي اللغة

    تحديث : ظ…ط¹ط§ظٹظٹط± ط§ظ„ط´ظٹظپط±ط© ط§ظ„ظ…طµط¯ط±ظٹط© | ظ…ط¯ظˆظ†ط© ط§ظ„ظˆظٹط¨ 2.0





    __________________
    اللهم أنت ربي لا إله الا أنت،
    خلقتني وأنا عبدك وأنا على عهدك ووعدك ما استطعت،
    أعوذ بك من شر ما صنعت،
    أبوء لك بنعمتك عليّ وأبوء بذنبي،
    فاغفر لي، فإنه لا يغفر الذنوب إلا أنت

  7. #7
    عضو فعال جدا
    تاريخ التسجيل
    Jun 2003
    المشاركات
    2,123


    موضوع مفيد وخاصة المعايير القياسية لقواعد البيانات , نأمل وضع مصادر أكثر تفصيل لهذه المعايير بارك الله بكم .





    __________________
    htaccess بكل بساطة

    الشفرة الموحدة "يونِكود"

    (إن من مفاسد هذه الحضارة أنها تسمي الاحتيال ذكاءً، والانحلال حرية، و"الرذيلة فناً" والاستغلال معونة) - مصطفى السباعي

  8. #8
    عضو نشيط
    تاريخ التسجيل
    Nov 2005
    المشاركات
    73


    الله يعطيك ألف عافية يالغالي ..

    بس عندي ملاحظة على الكلام اللي كتبته وهي النقطة هذي :

    2- ان تضع المفتاح باسم id، لا تسميه اسماء اخرى، لا جدوى في ذالك!
    طيب افرض مثلاً أني استعلمت من جدولين بإستعلام واحد راح يكون عندك تكرار لإسم الحقل وبالتالي هو راح يجيب لك واحد منهم .. أو للوهلة الأولى إذا قرأت id يجب أن تنظر قبله لتعرف هو رقم لأي جدول ..؟؟

    من رأيي أنك تكتب قبله أي رمز يدل على اسم الجدول لأن تقريباً كل الجداول اللي راح تستخدمها فيها id فإذا كتبت قبله أي شي يدل على اسم الجدول سترى أنك منظم بشكل أفضل .. هذا من وجهة نظري .. وأرى أنها الأسرع لكي يفهم الآخرون ماتريد ..

    بل أني أفضل أن كل الحقول الموجودة في جدول المقالات مثلاً تكون مسبوقة بـ article_
    مثلاً article_name و article_userid وهكذا .. أولاً لتتجنب استخدام بعض الأسماء المحجوزة وثانياً يكون كل شي واضح اسمه قدامك ..


    وحبيت أضيف نقطة .. وهي ترتيب وتنظيم الكود، فالكود الغير منظم متعب ولايساعد على الفهم أو التطوير بشكل أسرع ...!!

    لذلك ترى كل مبرمج له طريقته في الترتيب

    شكراً لك ..






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


    بوركت أخي هيلابي.
    عمل مبارك.. جزاك الله خيراً.
    أنصح جميع الإخوة بالتوجه نحو Object Oriented Programming لأنها بسيطة وواقعية أيضاً.





    __________________
    لا إله الا الله محمد رسول الله

    فضائية الأقصى :: عينك على الوطن
    نيلسات: 10872 عمودي 27500
    عربسات: 12054 عمودي 27500


    إعلامنا.. إسلامي.. هادف.. مقاوم.. لتعلو الراية..

  10. #10


    مشكور كتير أخي hilaby في الحقيقه الدروس العربية في مجال الـ OOP تكاد تكون معدومة إلا من شرح الأساسيات فقط

    و منتظرين دروس الـ Zend Framework

    تحياتي





    __________________
    ahmed sliman .. Web Programmer
    ahmeds _ link @ hotmail . com

  11. #11
    عضو فعال
    تاريخ التسجيل
    Aug 2007
    المشاركات
    1,431

  12. #12
    عضو نشيط جدا
    تاريخ التسجيل
    Aug 2007
    المشاركات
    597


    مشكور اخي العزيز

    فعلا انا كنت محتاج لدروس في البرمجة الكائنية

    تقبل تحياتي وشكري الجزيل .








  13. لا هنت اخوي هيلابي

    يعطيك العافيه





    __________________
    -----------------------------------------------------------
    :: همـ المشاعر ــس :: عبد الله :: للتصميم و التطوير ::
    http://www.mr-sa.com
    -----------------------------------------------------------

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


    مشكور ياخي على الدرس
    لكن سوألي هو
    كود PHP:
       var $tableName
    هل يوجد فرق اذا ازلنا كلمة var






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


    إذا شلت ال var بيظهر خطأ





    __________________
    Google
    Firefox





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

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

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