النتائج 1 إلى 9 من 9

الموضوع: [سجن البرمجة] قواعد البيانات ، تعامل من نوع آخر

  1. #1
    عضو نشيط
    تاريخ التسجيل
    Mar 2005
    المشاركات
    281

    [سجن البرمجة] قواعد البيانات ، تعامل من نوع آخر



    السلام عليكم ورحمة الله وبركاته
    كنت اليوم قد طرحت موضوعاً عن سجن البرمجة وجمعت كل الدروس السابقة فيه لمنع التشتت الكبير !
    وهذا هو رابط الموضوع
    http://www.swalif.net/softs/swalif45/softs216662/

    اليكم الدرس المذكور في بداية الموضوع السابق .

    أولا مرحباً بكم أعزائي سجناء البرمجة
    فليخرج جميع المساجين من زنزانتهم لأن السجّان php لديه الجديد لكي يقوله لنا !

    اليوم سنتكلم عزيزي السجين عن الـ sql وبالأصح Mysql و كيفية إستخدامها بطريقة أسرع مع الـ php
    عذراً عزيزي السجين لن أشرح كيفية إستخدام هذه الخاصية لأنه كثرت الدروس عن قواعد البيانات وكيفية الإتصال بها .
    ولكن سنتكلم عن طريقة التعامل معها بطريقة أفضل وأسرع بإذن الله .

    ولكن لي همسة صغيرة : هذا الدرس أتعبني لأنني جلست يومين أبحث عن مدى صحة المعلومات ووجدت أنها صحيحة بإذن الله
    هذا نظراً لغيابي الطويل عن البرمجة .


    حسنا عزيزي السجين الكريم ..
    أول ما يتبادر لذهنك حينما نتكلم عن الـ sql
    تتذكر هذا الأمر اللذيذ الجميل الذي لا غنى عنه
    كود PHP:
    $selecting mysql_query("select * from table"); 
    هذا الأمر جميل جداً ومريح والكل يستخدمه ولن تجد أي برنامج يستخدم قواعد البيانات دون إستخدام هذا الأمر
    ولكن تخيّل أنك تبرمج مثلاً برنامج منتديات أو أي برنامج شبيه وتريد عرض المواضيع في مكان واحد
    ما الذي ستحتاجه من الأمر السابق ؟
    ستحتاج عزيزي السجين id الموضوع
    وعنوانه هذا الموضوع فقط ! (بإعتبار أننا نتكلم أنك تبرمج برنامج منتديات)
    وبالطبع جدول هذا الموضوع يحتوي على حقول من نوع txt والتي أنت قمت بتحديدها أيضاُ من الأمر اللذيذ الذي كتبناه سابقاً
    أليس كذلك ؟

    حسنا عزيزي فإنك بهذه الطريقة تبطيء برنامجك بشكل ملحوظ !
    ممم ستقول لم أفهم المقصود !
    سأقول لك ! لماذا لا تقوم بجلب الحقول التي تريدها فقط كي تعرض جميع المواضيع مثلاً في صفحة واحدة
    والحقول التي تحتاجها - مبدأياً - حقل الـ id وحقل الـ title
    أليس كذلك ؟ لأنك لا تحتاج لحقل txt الموضوع في الصفحة التي تعرض فيها المواضيع

    حسناً السؤال المتوقع الآن ما الفرق ؟
    الجواب أنه في حالة select * تقوم بعمل بحث كامل في الجدوال بجميع الحقول و أيضا تطلب من القاعدة أن تقوم بجلب الحقول وأسمائها لوحدها
    ولكن حين تحدد الحقول المراد التحقق عنها فإنك تحدد أريد الاي دي والعنوان -- ولا تتعبيلي حالك يا داتا بيز زيادة عن اللزوم

    حسناً الناتج المترتب على هذا !
    انك حين تقوم بعمل mysql_num_rows ستجلب لك العدد بشكل أسرع و تخفف الضغط عن قاعدة البيانات

    وأيضاً نفس الموضوع مترتب على من يقوم بعمل count(*) التي تجلب عدد الـصفوف من قاعدة البيانات
    هكذا بالعادي
    كود PHP:
    $counting mysql_query("select count(*) from table");
    الأفضل أن يجلب العدد بهذا الشكل
    $counting 
    mysql_query("select count(id) from table"); 
    فهو الأسرع .. ولكن حين المقارنة بين mysql_num_rows و count
    تجد النتائج متضاربة مرة الأولى أسرع ومرة أخرى الثانية أسرع .. ولكن ينصح بإستخدام mysql_num_rows
    وهذه وجهة نظر كثير من المبرمجين الذي بحثت في مواقعهم ووجهة نظري خاصة (وهي تقبل الخطأ)

    حسناً فلنذهب عزيزي السجين إلى ساحة السجن العامة حتى نشم هواء نظيف ونتطرق لشيء آخر

    حسناً هل أنت مستعد ؟
    هنالك شيء آخر جميل ، حينما أقوم بإدراج أمر إلى قواعد البيانات أياً كان هذا الأمر .. وكان هنالك خطأ ما الحل ؟
    الحل عزيزي أن تقوم بإظهار رسالة خطأ
    وتدرج في هذه الرسالة الخطأ الذي حصل بواسطة mysql_error
    وتدرج رقم هذا الخطأ بواسطة mysql_errno
    وتدرج كل الأمر الذي طلبته
    مثلاً
    كود PHP:
    <?php
    $link 
    mysql_connect("localhost""mysql_user""mysql_password");

    if (!
    mysql_select_db("nonexistentdb"$link)) {
        echo 
    mysql_errno($link) . ": " mysql_error($link). "\n";
    }

    mysql_select_db("kossu"$link);
    if (!
    mysql_query("SELECT * FROM nonexistenttable"$link)) {
        echo 
    mysql_errno($link) . ": " mysql_error($link) . "\n";
        
    // هنا أضف الأمر الذي أخطأ ومن الممكن أن يكون متغير أو حسب رغبتك 
        
    echo "SELECT * FROM nonexistenttable";  
     
    }
    ?>
    الكود السابق من php.net



    حسناً عزيزي السجين الكريم لم ننته بعد !
    أتعرف امر mysql_result ؟
    إن لم تكن تعرفه فهذا أفضل فتغاضى عن الشرح الذي سأكتبه لمدى سرعته و إستخدامه

    هكذا يتم استخدامه
    كود PHP:
    $result mysql_query('SELECT name FROM table');
    if (!
    $result) {
        die(
    'Could not query:' mysql_error());
    }
    echo 
    mysql_result($result2); // بيطلع لي النتيجة الثالثة من الجدول 
    حسناً ولكن إن كنت في قاعدة بيانات كبيرة وتريد الرقم الثالث من الجدول فقط !
    فقم عزيزي السجين الكريم بإستخدام أمر
    كود PHP:
    $selecting mysql_query("select * from table where id=3"); 
    فهكذا عزيزي لا تحتاج لكي تطلب كل قاعدة البيانات وبعدها تيجي تتدلع وتطلب رقم ثلاثة فقط
    الأفضل أن تطلب من الأساس انك تريد عرض البيان الثالث

    وطبعاً الكود السابق بدائي جداُ فإنك طبعا ستطلب من المتصفح أن يعطيك مثلا رقم الموضوع ومن ثم تطلب من القاعدة رقم الموضوع
    هذا مثال فقط !


    عزيزي السجين هل مللت ؟ إذا أغلق صفحة الموضوع وستذهب للحبس الإنفرادي !
    لأنني لم انتهي بعد

    بالطبع عزيزي السجين تعرف ا لـ mysql_fetch_array و mysql_fetch_assoc وتتسائل ما الفرق بينهما ؟
    أن أقول لك أن الإثنيتن نفس السرعة تقريباً
    ولكن الثانية مثل استخدام الاولى مع MYSQL_ASSOC
    وهذا يعني حساسية جلب المعلومات بمعنى : في حالة حروف اللغة الانجليزية الحساسية في جلب كابيتل لتر وسمول لتر ..
    لا أريد الإطالة في شرح هذه ولمن يريد ان يتعلم المزيد فليذهب لهذا العنوان PHP: mysql_fetch_assoc - Manual
    وإن لم تفهم نقطة معينة فأضف رد بها وسأشرحها أنا أو أحد الإخوان لك عزيزي السجين

    هنالك شيء آخر
    mysql_free_result
    هذه الدالة لمن يقوم باستخدام query ضخم وكبير فهذا يستهلك الذاكرة بشكل كبير ولربما يظهر له خطأ في الاستعلام الذي بعده
    فإستخدم هذه الدالة ، ولكنها ليست بالدالة ذات الأهمية الكبيرة لأنه - للعلم بالشيء - أي query يتم تحريره عند نهاية البرنامج بشكل تلقائي


    وأخيراً دالة : mysql_close
    هنالك الكثير من يقع لأول مرة في استخدام هذه الدلة بعد أمر الاتصال بقاعدة البيانات .. وهذا خطأ كبير !
    لأنك تفقد الاتصال ولكن اعتقد ان كل من يتعامل مع قواعد البيانات يعرف هذا
    فإن كثرة استخدامها في السكريبت لا يفيدك بل يضر لأنك ستتضطر لإعادة الاتصال بقاعدة البيانات مرة اخرى حتى تقوم بعمل أي أمر تريد
    ولكن لا بأس من إستخدامها في آخر السكريبت ولكن للعلم
    أن mysql_connect تفقد إتصالها أصلاُ حين الانتهاء من عرض السكريبت
    ولكن أمر close لا ينطبق على mysql_pconnect

    هذا ما لديّ من سجن البرمجة في الوقت الحالي !
    والآن فليعود كل المبرمجين إلي سجنهم لأنني تحررت من السجن البرمجي لفترة بسيطة ولكن سرعان ما أعيد القبض عليّ

    ولتنقضى مدتنا على خير !

    ولنا أجمل لقاء







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


    رااااااائع أخي دكتور نبهان جزاك الله كل خير , بالفعل هذه اللغة بحر .

    شكراً لك .

    تحياتي
    فراس





    __________________
    مدونتي
    Www.AlMashroo.Com

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


    مشكور دكتور نبهان على الموضوع الاكثر من رائع


    ويا ترى ما موضوع السجن هذا






  4. #4
    عضو جديد
    تاريخ التسجيل
    Aug 2007
    المشاركات
    11


    اود ان اضيف ان بامكانك استخدام اي عمود للبحث فبدل استخدام
    كود PHP:
    $selecting mysql_query("select * from table where id=3"); 
    بامكانك البحث عن طريق عمود الاسم بالطريقه التاليه
    كود PHP:
    $selecting mysql_query("select * from table where name = 'name'"); 
    طبعا كون الاسم ليس primary key فعليك ان تجعل منه index لتسرع من عمليه البحث
    و بامكانك جعله index بالطريقه التاليه
    كود PHP:
    create index [col_nameon table_name(col_name); 






    __________________
    لكل من يحب ان يتعلم PHP Mysql
    و يجد صعوبه مع الكتب نقدم له
    تعليم بالفيديو
    تعلم PHP صوت و صوره

  5. #5


    درس وشرح اكثر من رائع

    بارك الله فيك





    __________________
    +======================+
    شبكة تصميم لتطوير المواقع
    www.tsmim.com
    سكربتات حصرية - وتصاميم مميزة لموقعك
    +======================+

  6. #6
    عضو نشيط
    تاريخ التسجيل
    Mar 2005
    المشاركات
    281


    شكراً لكم جميعاً على مروركم

    blackmanblack
    شكرا لإضافتك الجميلة


    ولنا لقاء








  7. الاخ Dr.Nabhan شكرا على شرحك المطول، انا اود ان الفت الانتباه لى الاستعلام select count(*) from xxx
    او الاستعلام select count(id) from xxx

    السرعة في هذا الاستعلام يعتمد كثيرا في نوعية الجداول، اذا كانت MyISAM ستكون اسرع بكثير من InnoDB، ولكن الInnoDB تدعم المفاتيح الاجنبية foreign keys، الامر count يذهب من اول الجدول الى اخره، وكل سجل يمرعلية المؤشر يزيد على الحساب واحد، وهذا في جميع الاحول بطيئة، وهذا يحصل مع جداول الInnoDB، اما جداول الMyISAM لن يعطي اي تحسن ملحوظ لانة اصلا سريع، فضلا لوجود ميتا تاج "اي ان للMyISAM ملف صغير يضع فية هذة البيانات"، والامرselect count(*) from table سيذهب فقط الى هذا الملف ويطبع قيمتة فقط، اما اذا استخدمت select count(id) from table سيطر لعمل بحث وعملي حسابية ليست بالمعقدة، فهو ابطء بقليل من ال(*)count





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

  8. #8
    عضو فعال
    تاريخ التسجيل
    Jun 2004
    المشاركات
    1,519


    بارك الله فيك واثابك

    بحق درس جميل وقيم





    __________________
    أحفظ الله في السر والعلن

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


    سلمت يالغالي ..

    مع التحية ..










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

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

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