معهد دعم اتش فى اى بى اس لحلول الويب - Powered by vBulletin


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

الموضوع: موسوعة دروس للغة الـــ php 2

  1. #1
    أدارى
    الصورة الرمزية HVIPS4


    تاريخ التسجيل: Jun 2011
    رقم العضوية: 6
    الدولة: Cairo
    المشاركات: 1,979
    HVIPS4 غير متواجد حالياً

    موسوعة دروس للغة الـــ php 2


    ::::دروس متقدمة::::

    المهام المجدولة باستخدام Cron ... : -



    مقدمة

    صبيحة كل يوم اتلقى في بريدي على العمل رسالة اليكترونية تحمل لي اخبار اليوم المهمة من موقع الجزيرة. لم اشترك في اي خدمة او موقع بل ان هذه الرسالة اتت من موقعي الخاص... كيف؟ ملف بي اتش بي لا يتعدى الثلاثين سطرا يقوم من النوم في السادسة تماما و يقرأ الاخبار من موقع الجزيرة ثم يرسل العنوانين بالروابط الى بريدي الخاص ....
    في هذا المقال سوف نرى كيف يمكنك ان تنفذ ملفات PHP في اوقات معينة دون ان تطلب من المتصفح باستخدام ميزة لأنظمة تشغيل المزودات تدعى Cron Jobs و التي سنترجمها الى "المهام المجدولة"

    في هذا الدرس سنرى النقاط التالية:


    - التنفيذ التلقائي للملفات على مزودات لينكس

    - كيف تصنع مهمة مجدولة على لينكس؟
    - موقعي لا يدعم المهام المجدولة... هل هنالك حل؟
    - تطبيق: اخبار موقع الجزيرة على بريدك كل صباح ...


    التنفيذ التلقائي للملفات على مزودات لينكس


    سؤال : ماهي الطرق التي يمكن ان تتنفذ بها صفحة بي اتش بي على الانترنت ؟


    - ان يطلبها المستخدم مباشرة عبر كتابة الرابط الى الصفحة في متصفح ما ...

    - ان يطلب المستخدم صفحة بي اتش بي تحتوي على تضمين include لتلك الصفحة...
    - ان يطلب المستخدم صفحة ما تقرأ تلك الصفحة عبر البرمجة : فمثلا يمكنك قراءة صفحة بي اتش بي من خلال صفحة اخرى باستخدام fread كما هو دارج في جوالب الاخبار ..كما في (الكود من الدليل):
    Code ..


    <?php

    $handle = fopen("http://www.example.com/MyPage.php", "rb");
    $contents = "";
    do {
    $data = fread($handle, 8192);
    if (strlen($data) == 0) {
    break;
    }
    $contents .= $data;
    } while (true);
    fclose($handle);
    ?>






    الملاحظ ان كل هذه الطرق تبدا في مرحلة ما من طلب المستخدم عبر متصفحه للصفحة مباشرة او لصفحة اخرى مرتبطة بها ...


    لو حذفنا المستخدم من المعادلة فان هنالك طرفا واحد يمكنه الوصول الى الصفحة ! و فوق ذلك لده القدرة على متابعة الزمن .... انه نظام التشغيل المنصب على المزود ... فهو الوحيد القادر على الوصول الى تلك الصفحة ...

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

    نظام التشغيل لينكس ,الذي يعد الخيار الافضل و الأكثر شهرة بين المواقع التي تعتمد على بي اتش بي, يحتوي على ميزة تدعى cron jobs او المهام المجدولة كما عربناها... و التي تعمل تماما مثل المهام المجدولة على الويندوز فهذه الميزة تتيح للمستخدم ان يطلب من النظام تنفيذ امر command معين في وقت معين بصفة دورية .... يعمل البرنامج cron باستمرار على نظام التشغيل و ينفذ المهام متى ما حان وقتها ...


    ملاحظة : اعتمادا على سياسات مقدم المساحة لموقعك فقد لا يكون لك الصلاحية بارسال المهام الى cron لتنفيذها .. قد تكون الميزة معطلة بشكل دائم و غير متوفرة مطلقا في عرض الاستضافة او يلزمك مخاطبة الدعم الفني و طلب اعداد تلك المهمة منهم ... لكن بعض المواقع تسمح لك باعداد المهام المجدولة من لوحة التحكم مثل Cpanel ... الطريق الوحيدة لتتأكد هي ان تخاطب الدعم الفني


    كيف سيمكننا ان ننفذ الكود باستخدام المهام المجدولة على لينكس ؟

    الجواب يعتمد على كيفية اعداد بي اتش بي على المزود ... ! انظر الى الشكل التالي :



    تركب بي اتش بي على مزود الويب اباشي على شكلين :

    الاول : بي اتش بي برنامج قائم بذاته
    الثاني: بي اتش بي مدمجة في اباشي

    الاول: ان تركب بي اتش بي مستقلة عن مزود الويب كبرنامج قائم بذاته لا يعتمد على غيره... و تضبط اعدادات مزود الويب "اباشي مثلا" بحيث يرسل كل الصفحات التي تنتهي بالامتداد php او phtml الى هذا البرنامج لكي ينفذها و يرجع النتيجة الى المستخدم ...

    في هذه الحالة الامر سهل فكل ما علينا هو ان نطلب من مدير المهام المجدولة ان ينفذ الملف التنفيذي ,عادة php.exe, و يرسل له الصفحة ... تماما كما لو كنت كتبت الامر على المحث command prombt (في نافذة الدوس على الويندوز مثلا) كالتالي :
    Code ..


    php c:\files\index.php






    طبعا مسار الملف سيكون مختلفا على اللينكس... لكن هذا يكفي ليقرب المعلومة ...


    الثاني : ان تركب بي اتش بي مدمجة في اباشي .. اي ان يكون كود بي اتش بي قد اضيف الى كود اباشي قبل عمل الملف التنفيذي لاباشي ... وبهذا تعمل بي اتش بي على المزود بمجرد تشغيل اباشي و تكون دوال بي اتش بي مجرد دوال في اباشي فمثلا الدالة mysql_connect عندما يراها مترجم بي اتش بي في الكود يقوم بمناداة الدالة php_mysql_connect ...

    و هنا مشكلة لان بي اتش بي الان لا يمكن الوصول لها الا عن طريق مزود الويب و مزود الويب لا يستمع الى الاوامر الا عن طريق منفذ معين على الجهاز و لا يمكننا ارسال الاوامر الى اباشي الا عن طريق ذلك المنفذ... اي ان الصفحة يجب ان تطلب من خلال بروتوكول HTTP .. بمعنى اخر : يجب ان تطلب الصفحة من خلال متصفح للانترنت ... فما العمل ؟

    اذهب الى ابدأ ثم اختر تشغيل و اكتب الامر التالي :

    Code ..


    explorer
    http://www.islamway.net





    ستجد ان متصفح الانترنت قد فتح نافذة جديدة و ذهب الى موقع اذاعة طريق الاسلام ... اذا لو وضعت هذا الامر "explorer


    http://www.islamway.net/index.php" كمهمة متكررة في مدير المهام المجدولة فانك ستنفذ الصفحة index.php بشكل مستمر ... !


    لتنفيذ نفس الفكرة على لينكس بامكانك استخدام متصفحات اخرى مثل lynx بالشكل التالي :

    Code ..


    lynx
    http://www.islamway.net/index.php






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


    كيف تعرف اي نسخة لديك؟

    اطبع معلومات بي اتش بي باستخدام phpinfo ... في السطر الثالث تقريبا قيمة الخاصية Server API تحدد ذلك : اذا كانت apache فنسختك مدمجة اما اذا كانت CGI فنسختك مستقلة عن مزود الويب ...

    دعنا نرى في القسم التالي كيف يمكننا ان نجعل لينكس ينفذ هذه الاوامر بشكل مستمر ...



    كيف تصنع مهمة مجدولة على لينكس؟


    كما اسلفنا فانه يوجد على نظام التشغيل لينكس برنامج يدير المهام المجدولة يدعى cron .. يصحو cron كل دقيقة لينفذ المهام الموجودة في ملفات تعليماته و التي تسمى crontabs ... تحتوي هذه الملفات على الاوامر التي يجب على مدير تنفيذها و على كيف سيتكرر تنفيذ هذه الاوامر... بشكل عام اكبر مدة يمكن ان تفصل بين تنفيذين للكود هي سنة ... دعنا نرى كيف نتخاطب مع مدير المهام المجدولة على لينكس :

    Code ..


    Minutes Hours Days Months WeekDay command






    لاحظ ان الفاصل بين مكونات الامر هو فراغ ... المكونات هي كالتالي :

    Minutes : الدقائق و هي من 00 الى 59
    Hours : الساعات من 0 الى 23 حيث 23 هي الحادية عشرة من الليل
    Days : الايام من 1 الى 31
    Months : الاشهر من 1 الى 12
    WeekDay : اليوم من الاسبوع وهي من 0 الى 6 حيث اليوم رقم 0 يرمز الى الاحد
    command : ما تود من نظام التشغيل تنفيذه ... لاحظ ان هذا امر نظام تشغيل و ليس جملة بي اتش بي ...

    اذا باستخدام اول خمس خانات نحدد لمدير المهام المجدولة الوقت الذي ينفذ فيه المهمة المعطاة في الخانة السادسة...


    ماذا تعني هذه الخانات ؟ تعني في اي شهر من السنة و اي يوم من ذلك الشهر و اي ساعة من ذلك اليوم ثم اي دقيقة من تلك الساعة تود ان ينفذ الامر المعطى ....

    قيمة هذه الخانات يمكن ان تكون :
    - رقما واحدا يدل على قيمة واحدة
    - علامة * لتدل على اي قيمة حسب التعاريف التي ذكرناها في الاعلى
    - مجموعة من الارقام مفصولة بفاصلة مثل 1,2,5,6 لتعني اي رقم فيها اي : 6 او 5 او 2 او 1
    - فترة من الارقام عبارة عن رقمين مفصولين بشرطة ... فلو كانت قيمة Days هي 9-11 فان هذا يعني اليوم التاسع و اليوم العاشر و اليوم الحادي عشر..

    مثال :

    التعليمة التالية :
    Code ..


    0 0 15 3 * myprogram






    ستنفذ البرنامج myprogram في الخامس عشر من شهر مارس (الشهر الثالث من السنة) عند الساعة الثانية عشرة من الليل تماما و ذلك في اي يوم من الاسبوع وافق ذلك ..

    الصفر الاول : يعني الدقيقة اللاولى في الساعة
    الصفر الثاني: يعني الساعة الثانية عشرة
    15 : تعني اليوم الخامس عشر من الشهر
    3: تعني الشهر الثالث من السنة اي مارس
    * : تعني اي يوم في الاسبوع

    لو عدلناه الى التالي :

    Code ..


    0 0 * * 1 myprogram






    فان البرنامج سينفذ كل يوم اثنين (تذكر ان صفر يعني يوم الاحد) من كل شهر في السنة عند الساعة الثانية عشرة تماما

    ولو عدلناه الى التالي فسينفذ الكود في تمام الساعة السابعة صباحا و الساعة السابعة مساء من كل يوم في شهر يناير و فبراير من كل سنة
    Code ..


    0 7,19 * 1,2 * myprogram






    ولو عدلناه الى التالي فسينفذ البرنامج كل نصف ساعة كل ثلاثاء من كل شهر في السنة

    Code ..


    0,29 * * * 2 myprogram







    لا تحتاج الى حفظ هذه الاشياء مع انها ليست صعبة ... فهنالك هذه الاداة التي تمكنك من صناعة هذه الجملة بسهولة على هذه الصفحة:

    http://www.mtsdev.com/opensource/phpcrontab.php
    و بامكانك الحصول على مصدره من:
    http://www.mtsdev.com/opensource/php...utorial.tar.gz

    سأعرب هذه الاداة الجميلة ان شاء الله و اضعها لاحقا في قسم التعليقات على هذا الدرس ....


    الان ... اذا وضعت اوامر البي اتش بي في ملف و ليكن MyCron.php و اردت ان تشغله كل يوم جمعة في تمام الساعة الحادية عشرة مساء من كل اسبوع فان الامر سيكون كالتالي :

    اذا كانت نسخة بي اتش بي مدمجة فان علينا كما سبق ان نستخدم اي متصفحا على لينكس كالتالي ..
    Code ..


    0 23 * * 5 lynx
    http://www.example.com/path/to/your/MyCron.php





    اذا كانت النسخة مستقلة فان بامكانك ايضا استعمال المترجم مباشرة كالتالي :

    Code ..


    0 23 * * 5 php /path/to/your/MyCron.php







    هذا كل ما هنالك ... الان اذا كنت ستنفذ هذه المهمة على موقعك على الويب فتأكد من وجود الخدمة لديك ... اتصل بالدعم الفني و اسألهم عن كيفية وضع اوامر cron ... اما اذا كنت تريد اختبار هذه الحركة على جهازك اولا .. فضعها في مهمة مجدولة باستخدام مدير المهام المجدولة على ويندوز..

    اذهب الى "ابدأ" ثم "تشغيل" و اكتب tasks ... ستظهر لك نافذة البرنامج المسؤول عن جدولة و تنفيذ المهام في ويندوز و اضف المهمة التالية
    Code ..


    explorer
    http://localhost/path/to/your/MyCron.php





    سنرى في القسم التالي ماذا تعمل لو اكتشفت ان مزود مساحتك على الانترنت لا يدعم او عطل هذه الميزة ..




    موقعي لا يدعم المهام المجدولة... هل هنالك حل؟


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


    الفكرة هي ان تضع الاوامر التي تريد تنفيذها في ملف و تضمه باستخدام include في احد الملفات التي تنفذ بشكل مستمر على الموقع.. مثللا الصفحة الرئيسية او صفحة المقدمة header او الذيل footer ومن احدى الحركات الجيدة في ان تضع صورة في الموقع بطول بكسل في عرض بكسل ويكون قيمة الخاصية src هو
    http://www.example.com/image.php و بذا لن تحتاج الى تعديل الى ملف من ملفات موقعك ...

    لنفرض اننا وضعنا الاوامر التي نريد تنفيذها في الملف cron.php وعملنا لها تضمين في احد الملفات التي يتكرر استخدامها

    Code ..


    <?

    include('cron.php');
    ?>





    الان سيتنفذ الكود كل مرة يطلب فيها ذلك الملف .... هذا جيد ..لكنه ليس ما نريد ... لاننا قد نرغب في تنفيذ الكود كل شهر مثلا !

    لذلك قام احد المبرمجين بكتابة برنامج يدعى Pseudo-cron تجده على الرابط
    http://www.bitfolge.de/?l=en&s=pseudocron

    يستخدم هذا البرنامج نفس الاوامر التي يستخدمها مدير المهام المجدولة cron .... و يقوم بتضمين الملفات متى اتى الوقت لذلك .. بينما انت تقوم بربط


    البرنامج باحد الملفات التي يكثر استخدامها على موقعك ...


    في القسم التالي سنرى تطبيقا عمليا ...



    تطبيق: اخبار موقع الجزيرة على بريدك كل صباح ...


    كما رأيت معنا في الاقسام السابقة فـ cron او المهام المجدولة لا تتطلب اوامرا خاصة في بي اتش بي ... انما هي عمليات اعداد للملفات على المزود ..

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

    طباعته الى المستخدم ...هذا هو:

    Code ..


    <?

    // News Grapper
    $url = "http://www.aljazeera.net/news/arabic/";
    $string = implode("\n", file($url));
    $string2 = explode("<!--start second News-->", $string);
    $string3 = explode("<!--end second News-->", $string2[1]);
    $news = str_replace('href="../../news/arabic/',"href=\"$url",$string3[0]);
    $news = str_replace('>- ',">",$news);

    preg_match_all("/href[[:space:]]*=[[:space:]]*"."[\"']{0,1}([^\"'> ]+)/i",

    $news,$arr,PREG_SET_ORDER);
    preg_match_all("|>([^<]*)</a|i",$news,$arr_text,PREG_SET_ORDER);

    نقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعي




    $HTML = "LATEST JAZIRAH NEWS @ YOUR BOX !<br>";

    for ($i=0;$i<count($arr);$i++)
    {
    if ($arr_text[$i][1]!="")
    {
    $HTML .= "- <a href='".$arr[$i][1]."'>".$arr_text[$i][1].'</a><br> \n';;
    }
    }


    /* recipients */

    $to = "alnutaifi@yahoo.com" ;
    /* subject */
    $subject = "Jazeera News Update...";

    /* message */

    $message = "
    <html>
    <head>
    <title>Jazeera News Update...</title>
    </head>
    <body>
    $HTML
    </body>
    </html>
    ";

    /* To send HTML mail, you can set the Content-type header. */

    $headers = "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/html; charset=windows-1256 \r\n";

    /* additional headers */


    $headers .= "Automated News <phpvillage@example.com>\r\n";


    echo $message;

    /* and now mail it */
    mail($to, $subject, $message, $headers);
    ?>





    كل ما عليك هو حفظ هذا الكود في ملف و اعداد موقعك لينفذه حسب المدة و التكرار الذي تريده بأي من الطرق التي رأيناها في هذا الدرس ...

  2. #2
    أدارى
    الصورة الرمزية HVIPS4


    تاريخ التسجيل: Jun 2011
    رقم العضوية: 6
    الدولة: Cairo
    المشاركات: 1,979
    HVIPS4 غير متواجد حالياً

    رد: موسوعة دروس للغة الـــ php 2


    1-2 طريقة استخدام القوالب مع SmarTemplates : -


    الدرس الأول - المتغيرات

    تمهيد:
    تعتبر هذه الدروس أن لديك خلفية معقولة عن كل من برمجة PHP و توصيف HTML، قم بالحصول على ملف محرك القوالب المتوفر مجاناً في الموقع http://smartemplates.php4arab.info، ضع الملف SmarTemplates.php داخل نفس المجلد الذي تعتزم كتابة برامجك فيه حتى يكون بالإمكان الوصول إليه من خلال الدالة include، استخدم المفكرة أو برنامجك المفضل لتحرير كل من ملفات php و ملفات القوالب على الشكل HTML.

    تمثيل المتغيرات:

    لنفترض أنه لديك المتغيرات التالية:
    Code ..


    <?

    $a = "هذا البرنامج هو تجربة";
    $b = 24500;
    $c = time();

    include "SmarTemplates.php";

    print $ST->STTransFile("template.html", compact('a', 'b', 'c'));
    ?>






    حيث يمثل $a متغيراً نصياً، ويمثل $b متغيراً عددياً، كما يمثل $c الوقت والتاريخ، فإن ملف القالب سيكون بالشكل التالي:


    Code ..



    <html>

    <body>
    a = <st-echo>$a</st-echo>
    <br>
    b = <st-echo>$b</st-echo>
    <br>
    c = <st-echo format="d-m-Y h:ia">$c</st-echo>
    </body>
    </html>






    حيث تستخدم الواصفة st-echo لتمثل قيم المتغيرات، يمكنك وضع الواصفة st-echo في أي مكان تريد، كما يمكنك تخصيص صفة خاصة لطريقة كتابة المتغير كما استخدمنا في المثال الصفة format لتحديد شكل ظهور الوقت والتاريخ، حيث تعني d-m-Y h:ia أن التاريخ سيظهر على الشكل يوم-شهر-سنة ثم الساعة:الدقيقة وصباحاً أو مساءً.

    لاحظ أن بإمكانك تغيير ملف القالب في أي وقت من خلال أي برنامج تصميم صفحات ويب، كما يمكنك نقل الواصفة من مكان إلى آخر وتكرارها وتغيير خصائصها، دون الحاجة إلى الرجوع إلى ملف البرمجة مرة أخرى.

    خصائص تمثيل المتغيرات:

    يمكنك استخدام العديد من خصائص الواصفة st-echo للحصول على إمكانية أخرى دون العودة إلى ملف البرمجة، تخيل مثلاً أنك تحتاج إلى عرض جزء من قيمة المتغير النصي إذا زاد عن طول معين فإنك عندئذ لا تحتاج إلا إلى إضافة الخاصية limit إلى الواصفة كما في المثال التالي:
    Code ..


    <st-echo limit="15">$a</st-echo>







    حيث ستقوم الواصفة تلقائياً بعرض 15 حرفاً فقط من قيمة المتغير $a

    توجد العديد من الخصائص للواصفة st-echo تعطيك إمكانيات عديدة يمكنك مراجعتها في الموقع http://smartemplates.php4arab.info/d...hp?lang=arabic

    الدعم للغة العربية:

    يمكن للخاصية format أن تجعل الواصفة st-echo تقوم بعرض تاريخ مترجم باللغة العربية، أو محول للتقويم الهجري تلقائياً بمجرد استخدام الرمز ar: أو hj: في بداية الخاصية كما في الأمثلة التالية:
    Code ..


    <st-echo format="ar:l, d-F-Y">$c</st-echo>

    <st-echo format="hj:l, d-F-Y">$c</st-echo>






    كما يمكن وبسهولة استخدام خاصية الكميات المعدودة لضبط التمثيل الصحيح للقيم المعدودة باللغة العربية، فبدلاً من الطريقة المستهجنة التي تجدها في العديد من المواقع العربية للعد على الشكل (2 عضو/عضواً) أو على الشكل (24 ملفات) والتي تبدو وكأنها لغة مكسرة، يمكنك باستخدام الخاصية countable جعل محرك القوالب يضبط الشكل الصحيح للكمية المعدودة كما في المثال التالي:

    Code ..


    عدد الأعضاء المتواجدين الآن:

    <st-echo countable="ar:لا أحد,عضو واحد,عضوان,أعضاء,عضواً">$X</st-echo>






    حيث يقوم المحرك وبناءً على القيمة العددية للمتغير $X في انتقاء الكلمة المناسبة من بين الكلمات التي ذكرتها.


    تمثيل قيم المصفوفات:

    يمكن بسهولة أيضاً تمثيل قيمة ضمن مصفوفة، فإذا كان المتغير $Y عبارة عن مصفوفة على الشكل:
    Code ..


    <?

    $Y = Array ('name'=>'Ahmad', 'telephone'=> 42399122);
    ?>





    فإنك تستطيع عرض القيم بالشكل التالي:

    Code ..


    <st-echo>$Y[name]</st-echo>







    الاختصارات:

    يمكن أيضاً استخدام الشكل المختصر:
    Code ..


    <$Y>

    بدلاً من
    <st-echo>$Y</st-echo>






    وذلك للاختصار أثناء الكتابة، كما يمكن أيضاً استخدام الشكل الثانوي للواصفات، عندما يحتاج الأمر إلى ذلك، ففي بعض الأحيان قد تحتاج إلى وضع قيمة متغير داخل واصفة HTML اعتيادية كما في المثال التالي:

    Code ..


    <font color="<$color>">

    </font>






    حيث لا تتقبل المحررات هذا الشكل وتعتبره خللاً في الهيكل لذلك يمكنك استخدام هذا الشكل:

    Code ..


    <font color="{$color}">

    </font>


    فالمحرك يعتبر أن الواصفات يمكنها أن تستخدم الأقواس { و } بدلاً من < و > إذا ما كانت داخل واصفة أخرى وذلك للتوافق مع محررات صفحات الويب

  3. #3
    أدارى
    الصورة الرمزية HVIPS4


    تاريخ التسجيل: Jun 2011
    رقم العضوية: 6
    الدولة: Cairo
    المشاركات: 1,979
    HVIPS4 غير متواجد حالياً

    رد: موسوعة دروس للغة الـــ php 2


    استخدام برمجة الكائنات OOP : -


    قبل OOP

    قبل الـ OOP كانت البرامج تبدو ضخمه وكبيره جدا وتحتاج الى معماريين ومهندسين لتطوير هذه البرامج، وتحتاج ال مزيد من الوقت والمال للصيانة.

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


    وعملية تتبع الاخطاء الموجوده في هذه التطبيقات هي مشكله بحد ذاتها، عندما نريد تتبع الدوال Functions الموجوده تأخذ وقت اطول من عملية اضافة دوال اخرى، ويصبح البرنامج ضخم جدا وايضا يلزم عدد اكبر من المبرمجين. لذا تم ايجاد الـ OOP.


    - الاختلاف بين Object Oriented Programs و Functional Programs :

    عملية الاختلاف هي عندما نقوم بتصميم برنامج باستخدام الـ functions يتوجب علينا تصميم هذا البرنامج بان تقوم دالة باستدعاء دالة اخرى، البيانات ترسل كبيانات ادخال ثم تقوم الدالة بمعالجة هذه البيانات او المدخلات واعطاء النتيجة كـ output . بعبارة صغيره هي ان الـ functional programs -> code-centric .

    الـ OOP تأخذ الطريقة العكسية وهي أن الـ objects التي تحتوي على البيانات تحتوي على دوال تسمى methods (الـ method شبيه بالـ Function).


    عندما يقوم الـ Object بطلب خدمه من Object اخر فانه يقوم بارسال رسالة ويستقبل الرد .


    رسمة توضح المقارنه بين الحالتين



    في الحالة الاولى (Functional Program :: code-centric) :

    1. يتم ادخال البيانات الى a()
    2. تقوم a() باستدعاء b() باستخدام نتائج a()
    3. b() تستدعي c() باستخدام نتائج b()
    4. c() تقوم بارسال النتائج الى b() وبدورها b() تقوم بارسال النتائج الى a()
    5. اظهار النتيجه النهائيه للبرنامج

    في الحالة الثانية (Object-Oriented Program :: data-centric) :

    Object1 يقوم بطلب الخدمه من object3 و هو بدوره يقوم بالطلب من object4 وهكذا حتى يقوم Object1 باستقبال الرد من object3 تحتوي على النتيجه النهائية.
    الاختلاف بين الحالتين هو ان الـ Objects تحتوي على البيانات ةطرق معالجتها.
    بينما تكون البيانات منفصله عن الـ functions هذا يجعل من OOP عملية سهله لتتبع البرنامج وسهولة عملية الصيانه والتحديث


    اهمية OOP


    ما هو مهم بالنسبه لك كمبرمج هو ان الـ OOP ليست الا تقنيه او طريقة ليست لغة برمجة.


    PHP,C++ and Java جميع هذه اللغات هي لغات OOP لانها تطبق نفس الهدف ولكن البرمجه باستعمال Java و C++ تختلف .


    يجب عليك كمبرمج ان تفهم مبدأ الـ OOP المشروح في الرسمه السابقه بشكل عام ثم تقوم بالتركيز على اللغة التي تنوي استعمالها. سنقوم في هذا الدرس بالتركيز على لغة PHP .


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

    Database access objects, search engines, security components .

    عند عملية التحديث للبرامج كوحدات صغيره ومجزئه تضمن ان التغييرات في Object معين لن تؤثر على بقية الـ Objects .



    - مكونات Object-Oriented Program :

    Classes : الـ class هو تعريف او عملية عرض لنوع معين من البيانات ، عندما نقوم بتعريف Object جديد يجب ان نستعمل كلمة class في PHP Scripts.
    توضيح بسيط بين object و class هو ان الـ classes تقوم بتعريف objects تقوم باستعمالها في تطبيقاتها .


    - مكونات الـ Class في PHP :

    اولاً : members .
    على سبيل المثال سنقوم بتصميم class يسمى User، فان الـ members لهذا الـ class (المتغيرات التي يتم تعريفها لاستخدامها لاحقا)
    Code ..


    Firstname, lastname, email, username and password

    var $firstname;
    var $lastname;
    var $email;
    var $username;
    var $password;





    ثانيا : methods

    الخدمات او الدوال الموجوده داخل الـ Object وهذه methods تقوم باستخدام الـ members او المتغيرات المعرفه سابقا.
    على سبيل المثال لدينا الـ class السابق وهو الـ User وهذا الكلاس يوجد به methods مثلا method للتأكد من صلاحية البريد الالكتروني emailالمعرف في الـ members و method اخر للتأكد من عدد الاحرف المدخله لاسم المستخدم username وهكذا .

    اخيرا : Constructor

    هذه طريقه خاصه لعملية انشاء الـ object ليصبح جاهزا للاستعمال، يوجد منشئ واحد فقط للـ object في ال PHP.
    على سبيل المثال class User من الضروري ان نقوم باخذ جميع المتغيرات التي تم تعريفها (members) سابقا.
    يجب ان يكون اسم الـ constructor مساوي لل className
    مثلا لدينا اسم class هو User يكون الـ constructorبالشكل التالي :
    Code ..


    <?

    Class User
    {
    …………….

    Void User() //constructor

    {
    …………..
    }
    ?>






    ملاحظة : الـ constructor يجي ان لا يعيد قيمة معينة هو فقط لجعل الـ class في مرحلة التشغيل(من غير المنطقي ان تجعل الـ class يعيد قيمة معينه return value).


    الصيغة العامة او الشكل العام لكتابة الـ Class :




    كما ترى أن الـ class ليس الا مجموعة من members (variables) و methods(functions) .

    الـ members اما ان تكون integers او strings او ان تكون array او objects اخرى .

    PHP لا يحتاج ان تقوم بتعريف انواع المتغيرات ما عليك سوى ان تقوم بعملية التسمية .



    تطبيق عملي


    ما رأيك ان نقوم بكتابة سكريبت صغير يشرح الـ class ؟


    قبل البدأ عليك مراعاة الامور التالية :

    - يجب ان يبدأ اسم الـ class بحرف كبير لعملية التفريق بين اسم الـ class و functions و variables .
    - من المفيد ايضا ان تقوم بحفظ الملف بنفس اسم الـ class مثلا لدينا class User يجب حفظ الملف باسم user.php .
    - الملف يجب ان يحتوي على class واحده وان كان لديك اكثر من ملف يفضل وضعهم في مكان واحد ونقوم باستدعاء الـ class من ملف اخر باستعمال include_once() او require_once() .
    - يجب كتابة $this-> قبل الـ member name او variable .

    والان لنحاول تطبيق المثال التالي .....


    سنبدأ اولا بتعريف الـ class وتعريف الـ members(variables) لهذا الـ class



    الان سنقوم بكتابة الـ constructor للـ class User

    وظيفة الـ constructor : هي عملية تهيئة (بدء) لجميع عناصر الـ object للتأكد من ان جميع الخدمات يمكن استخدامها متى يطلب منها ذلك.
    مثلا ..... لو لم نقم بكتابة الـ constructor لا نستطيع استخدام الدالة display() التي سنقوم بكتابتها.



    في لغتي الـ C++ و Java تكون الـ this اختياريه ليست اجباريه، بينما في لغة PHP فانها اجباريه لان PHP ضعيف في التعامل مع scope of variables .

    في لغة PHP 3 مستويات للـ namespace (مجموعه من variables names) مكان تخزيت الـ variables :

    - المستوى الادنى (lowest level) يستعمل للـ local variables أي المتغيرات التي يتم تعريفها داخل الدوال (functions or methods).اي متغير (variable) يتم تعريفه داخل هذا المستوى يضاف الى local namespace .


    - المستوى الثاني يتضمن جميع المتغيرات members للـ object .


    - المستوى الاعلى يستعمل لـ global variables .

    * $this تخبر الـ PHP انك تريد المتغير من المستوى الثاني.اذا لم تقم باضافة الـ $this فانك تود انشاء متغير جديد في local namespace كما تم الشرح سابقا.

    الان سنقوم بكتابة الدالة display()




    نلاحظ ايضا اننا قد اغلقنا الـ scope لل class ايضا ({) وبالتالي انتهينا من كتابة الـ class User .


    الان سنقوم بانشاء الـ object لل class User :




    هكذا نكون قد انتهينا من هذا الدرس وان شاء الله في الدرس القادم سأتناول مواضيع اخرى في OOP .ان شاء الله سنقوم بتغطية ...

    1. Encapsulation
    2. Inheritance
    3. Polymorphism

  4. #4
    أدارى
    الصورة الرمزية HVIPS4


    تاريخ التسجيل: Jun 2011
    رقم العضوية: 6
    الدولة: Cairo
    المشاركات: 1,979
    HVIPS4 غير متواجد حالياً

    رد: موسوعة دروس للغة الـــ php 2


    تعدد الصفحات ( ط 3 ) :-


    إستخراج المتغير من الـ DB
    هنا سوف نقوم بعرض كتل هذا السجل حسب عدد الاسطر
    وقد اثار الموضوع بعض الاخوة في قرية بي اتش بي وكان منهم من قسمها على أساس عدد الاحرف والبعض على عدد الكلمات ..

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

    في البداية سنجري الاتصال بقاعدة البينات لكي نتمكن من جلب الإستعلام .


    Code ..


    <?
    $result = mysql_query("SELECT * FROM rafia_forum
    WHERE id='$id'");
    ?>





    هذا الاستعلام يستخرج سجل من الجدول rafia_forum وهو الذي تمت التجربة عليه .

    يحدد هذا السجل رقمه التسلسلي وهو المتغير id ، لتجربة الإستعلام قم بتبديل هذا المتغير برقم احد السجلات الموجودة في قاعدة بياناتك وقم بتعديل إسم الجدول لما يناسبك .

    الان نقوم باستخراج كل الحقول الموجودة في هذا السجل
    كما يلي :
    Code ..


    <?
    $row = mysql_fetch_array($result);
    ?>





    - ملاحظة :
    لم نستخدم الحلقات في عملية استخراج النتيجة وهذا ما يقع فيه الكثير من الاخوة , لان الاستعلام على حقل واحد فقط , يكفي ان نضع الحقل في مصفوفة بشكل مباشر .

    قبل معالجة البينات نتأكد من أن القيمة لعدد الاسطر موجودة , إن لم تكن تاخذ القيمة صفر :
    Code ..


    <?
    if(!isset($line)){$line = 0;}
    ?>





    بعد ذلك نضع متغير يحمل قيمة عدد الاسطر في كل صفحة :

    Code ..


    <?
    $perpage = "10";
    ?>





    ثم نقوم بتحرير الحقل الذي نريد تقسيمه لعدة أسطر من المتغير row :

    Code ..


    <?
    $post = $row["post"];
    ?>



    عملية التقسيم

    الان نقوم بتقسيم المتغير post إلى اقسام بحسب عدد الاسطر :

    Code ..


    <?
    $expline = explode("\n",$post);
    ?>





    استخدمنا الدالة explode في التقسيم على أساس
    n \ حرف السطر الجديد هو غير مرئي لكنه يأتي في نهاية كل سطر معبراً عن بداية سطر جديد ،ووضعنا الناتج من التقسيم في مصفوفة : expline .

    تذكير :
    explode : تقوم بتقسيم السلسلة وتحويلها الى مصفوفة .

    الان نقوم بحساب عدد عناصر المصفوفة بستخدام الدالة
    count :

    Code ..


    <?
    $countlin = count($expline);
    ?>





    countlin هو المتغير الذي حفظنا فيه مجموع عدد الاسطر ، الان نقوم بتجهيز العملية الحسابية في تقسيم الصفحات ..

    ( راجع الدرس الاول )
    Code ..


    <?
    //تعيين رقم الصفحة السابقة بناء على عدد الاسطر
    $previouspage = $line - $perpage;
    //تعيين رقم الصفحة التالية
    $nextpage = $line + $perpage;
    ?>





    إلى هنا سنكون قد جهزنا جميع المتغيرات التي سوف تساعدنا في تقسيم العرض ولذلك سنبدأ في التقسيم .

    نقوم بعرض الاسطر انطلاقاً من نقطة معينة في المتغير line وحتى نقطة نهاية معينة في المتغير nextpage مستخدمين في ذلك حلقة التكرار for :

    Code ..


    <?
    for ( $i = $line; $i< $nextpage; $i++)
    {
    echo"$expline[$i]<br>";
    }
    ?>





    - ملاحظة :
    اثناء الطباعة ستجد <br> في النهاية وهي شرط اساسي لنجاح العملية اما في البداية او النهاية ، لن تضطر لإستخدام الدالة nl2br ، السبب لان التعامل مع مصفوفة ، اعني مقسمة في اسطر جاهزة .

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

    Code ..


    <?
    if(($line > 0) || ($countlin > ($line + $perpage)))
    {
    echo "<p align=center>";
    }
    if($line > 0)
    {
    echo "<a href=$PHP_SELF?line=$previouspage>
    <<السابق</a>\n";
    }
    if($countlin >($line + $perpage))
    {
    echo "<a href=$PHP_SELF?line=$nextpage>
    التالي>></a>\n";
    }
    if(($line > 0) || ($countlin > ($line + $perpage)))
    {
    echo "</p>";
    }
    ?>



    النتيجة النهائية

    أخيرا تفضلوا المثال الذي نجح في التجربة :
    Code ..


    <?
    $dbuser="";
    $dbpword="";
    $dbserver="localhost";
    $dbname="rafiaphp";
    echo "<HTML DIR=RTL LANG=AR-SA>";
    function dbconnect(){
    global $dbserver , $dbuser , $dbpword , $dbname ;
    $result = mysql_pconnect("$dbserver", "$dbuser", "$dbpword");
    if (!$result)
    return false;
    if (!mysql_select_db("$dbname"))
    return false;
    return $result;
    }
    dbconnect();
    $result = mysql_query("SELECT * FROM rafia_forum
    WHERE id='29'");
    $row = mysql_fetch_array($result);
    if(!isset($line)){$line = 0;}
    $perpage = "10";
    $post = $row["post"];
    $expline = explode("\n",$post);
    $countlin = count($expline);
    $previouspage = $line - $perpage;
    $nextpage = $line + $perpage;
    for ( $i = $line; $i< $nextpage; $i++)
    {
    echo"$expline[$i]<br>";
    }
    if(($line > 0) || ($countlin > ($line + $perpage)))
    {
    echo "<p align=center>";
    }
    if($line > 0)
    {
    echo "<a href=$PHP_SELF?line=$previouspage>
    <<السابق</a>\n";
    }
    if($countlin >($line + $perpage))
    {
    echo "<a href=$PHP_SELF?line=$nextpage>
    التالي>></a>\n";
    }
    if(($line > 0) || ($countlin > ($line + $perpage)))
    {
    echo "</p>";
    }
    ?>




    نقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعي

  5. #5
    أدارى
    الصورة الرمزية HVIPS4


    تاريخ التسجيل: Jun 2011
    رقم العضوية: 6
    الدولة: Cairo
    المشاركات: 1,979
    HVIPS4 غير متواجد حالياً

    رد: موسوعة دروس للغة الـــ php 2


    الفئات والكائنات : -


    المقدمة

    - التعريف للكائن ( Object ) باختصار :
    هي عملية إنشاء سمات وعمليات على فئات يتم تطبيقها بعد ذلك على البيانات ، ليقوم بمعالجتها ، ووظائف الكائن مربوطة بالبينات التي يستعملها .

    - توضيح لعمل الكائنات :

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


    بداية انشاء فئة


    بداية انشاء فئة نستخدم الكلمة الاساسية class ونمسي الفئة . على هذة الصورة :

    Code ..


    <?

    class MyClass
    {
    }
    ?>






    حيث MyClass اسم الفئة .


    حتى نقوم باجراء عمليات يجب تعريف متغيرات داخل الفئة بستخدام var مثال :

    Code ..


    <?

    var $a;
    ?>






    ولكي نستخدم هذه المتغيرات داخل الدوال في الفئات لدينا مؤشر للوصول له على سبيل المثال نصل الى المتغير السابق


    هذه المتغيرات نجري عليها العمليات المطلوبة وهي تعتبر البينات التي نطلب من الفئة ان تعالجها لاحقا

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


    مثال التطبيق


    مثال لتصريح متغير , ومثال بدون تصريح متغير كلاهما يقوم بنفس الوظيفة :


    مثال 1 ( اختبار البريد ) :

    Code ..


    <?

    class myclass
    {
    var $email;

    function check_email(){

    if(ereg("^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+
    \.[a-zA-Z0-9\-\.]+$",$this->email))
    return (true);
    else
    return (false);
    }
    }
    // أنشاء تواجد للفئة
    $newclass = new myclass;
    // الوصول للبريد الذ سوف نختبره
    $newclass->email = "you@hotmail.com";
    //وضع الدالة في متغير
    $check_email = $newclass->check_email();
    // شرط لاظهار نتيجة مختلفة عند اختبار البريد
    if(!$check_email){
    echo "البريد الاكتروني غير صحيح";
    } else {
    echo "البريد الاكتروني صحيح";
    }
    ?>






    مثال 2 ( اختبار البريد ) :

    Code ..


    <?

    class MyClass
    {
    function check_email($email){
    if(ereg("^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+
    \.[a-zA-Z0-9\-\.]+$", $email))
    return (true);
    else
    return (false);
    }
    }
    // أنشاء تواجد للفائة
    $newclass = new MyClass;
    // البريد الذي سوف نختبرة
    $email = "you@hotmail.com";
    // تمرير البريد على الدالة ثم حملها في متغير
    $check_email = $newclass->check_email($eamil);
    // شرط لاظهار نتيجة مختلفة عند اختبار البريد
    if(!$check_email){
    echo "البريد الاكتروني غير صحيح";
    } else {
    echo "البريد الاكتروني صحيح";
    }
    ?>






    ركز في الامثلة السابقة وتعرف على الفرق .


    لكي تتحقق من النتيجة قم بتغيير البريد مرة ضع بريد صحيح ومرة خطأ ..


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


    وفي الامثلة السابقة وصنا لهذه السمات بهذه الصورة :

    Code ..


    <?

    // الوصول لدالة الاختبار في المثال الاول
    $newclass->check_email();

    // الوصول لمتغير تم تصريحة في الفئة

    $newclass->email

    // الوصول لدالة وتمرير متغير في المثال الثاني

    $newclass->check_email($eamil);
    ?>



    دالة الوصول


    في بعض الاحيان نحتاج لانشاء دالة وصول داخل الفئة

    لمتغيرات تم تصريحها او لسمات معينة حتى نصل اليها بسهولة ، ولكي تساعد دالة الوصول اثناء انشاء التواجد .

    وهنا مثال لفئة تحتوي على دالة وصول وفئة لا تحتوي على دالة وصول :


    مثال 3 (الاتصال بقاعدة البينات ) بدون دالة وصول :

    Code ..


    <?

    class mysql
    {
    var $dbserver;
    var $dbuser;
    var $dbpword;
    var $dbname;
    var $link;

    // دالة الاتصال بالقاعدة

    function connect()
    {
    $this->link= mysql_pconnect($this->dbserver,
    $this->dbuser, $this->dbpword);
    if (!$this->link)
    die( "لايمكن الاتصال بقاعدة البينات" );
    $dbselect = mysql_select_db($this->dbname,$this->link);
    if (!$dbselect)
    die( "لايمكن تحديد قاعدة البينات");
    return $this->link;
    }
    } // نهاية الفائة

    // التطبيق . انشاء التواجد

    $db = new mysql;
    $db->dbserver = "localhost";
    $db->dbname = "dbrafia";
    $db->dbuser = "root";
    $db->dbpword = "";
    $db->connect();
    //بهذه الطريقة تمكنا من الاتصال
    ?>






    مثال 4 (الاتصال بقاعدة البينات ) باستخدام دالة وصول :

    Code ..


    <?

    class mysql
    {
    var $dbserver;
    var $dbuser;
    var $dbpword;
    var $dbname;
    var $link;

    // دالة الوصول

    function mysql($db_server,$db_name,$db_user,$db_pword)
    {
    $this->dbserver = $db_server;
    $this->dbname = $db_name;
    $this->dbuser = $db_user;
    $this->dbpword = $db_pword;

    }


    // دالة الاتصال بالقاعدة

    function connect()
    {
    $this->link= mysql_pconnect($this->dbserver,
    $this->dbuser, $this->dbpword);
    if (!$this->link)
    die( "لايمكن الاتصال بقاعدة البينات" );
    $dbselect = mysql_select_db($this->dbname,$this->link);
    if (!$dbselect)
    die( "لايمكن تحديد قاعدة البينات");
    return $this->link;
    }
    } // نهاية الفئة

    // التطبيق . انشاء التواجد

    $db = new mysql("localhost","dbrafia","root","dbpword");
    $db->connect();
    //بهذه الطريقة تمكنا من الاتصال
    ?>






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


    ما هو الجديد في المثال الرابع ؟

    تسمية دالة الوصول لاحظ انها بنفس اسم الفئة mysql ، التسمية غير الازامية لكن هنا كي يتم تطبيق الدالة عند انشاء الفئة تطبيق تلقائي ، مثال :
    Code ..


    <?

    $db = new mysql("localhost","dbrafia","root","dbpword");
    ?>






    بهذا يتم انشاء الفئة مع تطبيق دالة الوصول .




    كائن وأستخدامات متعددة


    تعال وأنظر الى هذا المثال البسيط للجدول ، وانظر كيف قمنا بانشاء اربع جداول تختلف عن بعضها لكي تعرف الفائدة من الفئات :


    Code ..



    <?

    class Table
    {
    // دالة الوان الصفوف
    function setGrid($rows, $columns)
    {
    $this->rows = $rows;
    $this->columns = $columns;
    }

    // دالة لون الخط

    function setInterface($bcolor, $fcolor, $font)
    {
    $this->bcolor = $bcolor;
    $this->fcolor = $fcolor;
    $this->font = $font;
    }

    // دالة انشاء الجدول

    function drawTable()
    {
    echo "<table border=1 bgcolor=" . $this->bcolor . ">";

    for ($x=1; $x<=$this->rows;$x++)

    {
    echo "<tr>";

    for ($y=1; $y<=$this->columns;$y++)

    {
    echo "<td><font face=\"" . $this->font . "\" color=" .
    $this->fcolor .
    ">" . $x . ", " . $y . "</font></td>";
    }
    echo "</tr>";
    }
    echo "</table>";
    }
    }
    ?>
    <html>
    <head>
    <basefont face=Arial>
    </head>
    <body>
    <?

    // الجدول الاول

    $alpha = new Table;
    $alpha->setGrid(4,4);
    $alpha->setInterface("green", "white", "Arial");
    $alpha->drawTable();

    ?>

    <p>
    <?

    // الجدول الثاني

    $beta = new Table;
    $beta->setGrid(1,9);
    $beta->setInterface("blue", "white", "Arial Black");
    $beta->drawTable();

    ?>

    <p>
    <?

    // الجدول الثالث

    $gamma = new Table;
    $gamma->setGrid(2,4);
    $gamma->setInterface("black", "white", "Verdana");
    $gamma->drawTable();

    // الجدول الرابع

    $omega = new Table;
    $omega->setGrid(4,2);
    $omega->setInterface("white", "black", "Trebuchet MS");
    $omega->drawTable();

    ?>

    </body>
    </html>

  6. #6
    أدارى
    الصورة الرمزية HVIPS4


    تاريخ التسجيل: Jun 2011
    رقم العضوية: 6
    الدولة: Cairo
    المشاركات: 1,979
    HVIPS4 غير متواجد حالياً

    رد: موسوعة دروس للغة الـــ php 2


    تعميم قواعد البيانات DataBase Abstraction : -


    مقدمة
    بسم الله الرحمن الرحيم ...

    تعتبر قواعد البيانات من مخازن المعلومات (Data Warehouses) المفضلة على مستوى تطبيقات الشبكة العنكبوتية و ذلك لفوائدها الواضحة في تخزين المعلومات بشكل منظم و تسهيل عمليات الادخال ، الاستعلام ، التعديل و الحذف عبر برامج أو أنظمة "إدارة قواعد البيانات" مثل MySql و Oracle و Microsoft SQLserver ....

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

    إذاً كمبرمج يطور برامجاً موجهة للشبكة العنكبوتية أنت لا تدري أين سينتهى المطاف ببرنامجك ، هل سيستخدم قاعدة بيانات من نوع MySql أم من نوع Access أم ... أم ؟ هذه هي ما يعرف بخاصية "قابيلة التلائم" أو Portability ... فالبرنامج الذي بامكانه العمل على أربعة
    من أنواع أنظمة قواعد البيانات مثلاً يقال عنه أنه أكثر قابلية للتلائم من برنامج كتب خصيصا لقواعد PostgreSQL ....

    إذا كنت تتوقع أن برنامجك سيطلب من أناس يتعاملون مع قواعد بيانات مختلفة و يطلب منه العمل على أكثر من نوع فهذا المقال سيشرح لك كيف تبني برنامجك ليحقق ذلك و الا فإن المقال لا يحتوي على مايفيدك في الوقت الحالي ، لكن ربما تحتاجه قريبا ...!


    ما هي مشكلتنا.. حلول اولية

    إذا برنامجك يجب ان يكون مهيئاً للعمل مع أي نوع من قواعد البيانات ... أنت محظوظ ...فـ PHP تدعم الكثير من أنظمة قواعد البيانات ...

    يبدو الامر سهلا !!

    فبدلاً من استخدام الدالة mysql_pconnect للاتصال بقاعدة البيانات من نوع mysql ... سأستعمل الدالة pg_pconnect إذا كان نوع قاعدة البيانات من نوع PostgreSQL ، و على هذا فقس .... في كل الاوامر مثل تنفيذ الاستعلامات ، استرجاع السجلات ، تعديل هيئة القاعدة ... الخ .

    سأترك تقرير نوع قاعدة البيانات للمستخدم و أجعل ذلك في ملف الاعدادات مثلاً ، و هذا بالضبط ما يعنيه "تعميم قواعد البيانات" ....

    فمثلا لتحقيق "تعميم قواعد البيانات" بالامكان استخدام الكود التالي :
    Code ..


    <?
    include('config.php');

    //انشاء اتصال بقاعدة البيانات
    switch($db_type)
    {
    case 'mysql':
    $connection = mysql_connect(.....);
    break;
    case 'postgreSQL' :
    $connection = pg_pconnect(.....);
    break;
    case 'mSQL':
    $connection = msql_pconnect(....);
    break;
    }
    .
    .
    .
    // و بعد مدة نقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعي
    .
    .
    .

    // استرجاع بعض المعلومات
    switch($db_type)
    {
    case 'mysql':
    $result = mysql_query(.....);
    break;
    case 'postgreSQL' :
    $result = pg_query(.....);
    break;
    case 'mSQL':
    $result = msql_query(....);
    break;
    }
    ?>






    و هكذا كل ما اردت التعامل مع قاعدة البيانات يتوجب عليك استخدام switch لتقرير أي دالة تستعمل ، طبعا كل دالة تستقبل مدخلات خاصة بها ، فلا يفكر احد في استخدام eval ;-) ...

    هذا كل شئ ..... لكن .....

    لن تحتاج الى طاهي فرنسي لكي يخبرك أن الكود السابق .... "غبي" ... فقد كتب لثلاثة أنواع من قواعد البيانات و هنالك الكثير منها ، لربما تعدى المجموع العشرة ، و هو أيضا يطول شفرة برنامجك بشكل كبير و يزيد من التكرار السمج فيه ... هب أنك ستنفذ عشرة استعلامات .. في كل واحد تريد التحقق من نوع القاعدة ... ستنتهي بمائة سطر !!!

    من الطرق لتفادي هذه الجمل المتكررة أن نجعلها في دالة و نطلب الدالة متى اردنا ... مثال :
    Code ..


    <?
    function bomuhammed_connect
    ($server='localhost',$user='root',$pass='',$db_typ e='mysql'){

    switch($db_type)
    {
    case 'mysql':
    $connection = mysql_connect(.....);
    break;
    case 'postgreSQL' :
    $connection = pg_pconnect(.....);
    break;
    case 'mSQL':
    $connection = msql_pconnect(....);
    break;
    }

    return $connection;
    }
    ?>






    كل ما علي هو أن أطلب هذه الدالة كلما اردت الاتصال بقاعدة البيانات ، نفس الكلام ينسحب على بقية التعاملات
    مثل الاستعلام ، جلب السجلات و جلب المعلومات عن هيئة قاعدة البيانات ... لكل واحدة منها دالة مهمتها تقرير نوع
    نظام القواعد و من ثم اختيار الدالة المناسبة .



    مرحبا بك في ADOdb

    دعونا نراجع ما يحصل لطلب اتصال بقاعدة بيانات من نوع mysql من بداية الحديث الى اخر ما توصلنا اليه :

    1- في البداية و قبل ان نتكلم عن اهمية "قابيلية التلائم" ، كان البرنامج يستخدم فقط الدالة mysql_pconnect ، وعندها يفتقد البرنامج قابيلة التلائم مع انظمة قواعد بيانات أخرى ... فسير العملية هو :

    طلب الاتصال ---> استخدم mysql_pconnect مباشرة .

    2- ثم قررنا ان قابلية التلائم مع اكثر انظمة قواعد البيانات (PostgreSQL, Oracle, Microzift, mSql) أمر مهم جداً
    عندها قررنا استخدام switch ، و كان سير العملية كالتالي :

    طلب الاتصال ---> استخدم switch لتقرير الدالة ---> استخدم الدالة المقررة .

    و قلنا أن هذه الطريق تطول الكود و في نفس الوقت تصعب التعديل .

    3- عندها قررنا أن نضع التقرير و الاتصال في داخل دالة و نناديها متى شئنا و يكون من مهام الدالة تقرير الدالة المناسبة و استخدامها ، و ارجاع الناتج ...

    طلب اتصال ---> اطلب الدالة bomuhammed_connect لتقرر نوع نظام قاعدة البيانات و القيام بالاتصال --> bomuhammed_connect ترجع قيمة الاتصال .

    ممتاز .......

    الكلام الان ... من منا لديه معرفة بجميع انواع انظمة قواعد البيانات لكي يقوم بكتابة الدوال الخاصة ؟ هنا يأتي دور ADOdb ....

    ADOdb إختصـار لـ (Active Data Objects DataBase) .. هذه الباقة من الكائنات objects تأتي لتسهل عليك أمر الاتصال بقاعدة البيانات و التعامل معها و أيضا تجعل برنامجك قابلاً للملائمة مع الانظمة التالية :
    Code ..


    MySQL, Oracle, Microsoft SQL Server,
    Sybase, Sybase SQL Anywhere,
    Informix, PostgreSQL, FrontBase,
    Interbase (Firebird and Borland variants),
    Foxpro, Access, ADO and ODBC



    ماذا تتوقع ان ترى في ADOdb

    الحقيقة لا شيء جديد .... ابداً ...

    فبدلاً من استخدام دالة معينة ستجد نفسك تستخدم دالة اخرى !! .... العمل الفعلى لـ ADOdb يتم في الخلفية دون أن تشعر ... وهذا ما يجعل الانتقال اليها لنا امر سهلاً جداً ...

    خطوات استخدام ADOdb :
    صفر : نزل ADOdb من php.weblog.com و فك ضغط الملف في مجلد مشروعك .

    اولاً : ضم الملف adodb.inc.php للملفات التي تريد استخدام ADOdb فيها كالتالي :
    Code ..


    <?
    include('./adodb/adodb.inc.php');
    // المسار قد يتغير تبعا لحالتك
    ?>






    هذا الملف يقوم بدوره بعمل تضمينات includes للملفات المهمة للكائن تلقائيا ...

    ثانياً : انشئ كائناً باستخدام الدالة NewADOConnection ، و هي دالة معرفة من قبل ADOdb ، تأخذ الدالة متغيراً واحداً هو نوع نظام قاعدة البيانات .
    Code ..


    <?
    $connection = NewADOConnection('mysql');
    ?>






    عندما تذكر للدالة نوع قاعدة البيانات فانها تقوم بتضمين ملف يدعى "المشغل" driver و هو الملف المسؤول عن التعامل مع قاعدة البيانات ، كل المشغلات موجودة تحت المجلد drivers ... فمثلاً مشغل قواعد البيانات من نوع Sybase هو adodb-sybase.inc.php .

    ثالثاً : اتصل بقاعدة البيانات باستخدام الكائن كالتالي :
    Code ..


    <?
    $connection->Connect('localhost','my_name',
    'my password','my database name');
    ?>






    أو استخدم الاتصال المستمر :
    Code ..


    <?
    $connection->PConnect('localhost','my_name',
    'my password','my database name');
    ?>






    او استخدم الدالة NConnect لفرض اتصال جديد ، بي اتش بي أحيانا تقوم باستعمال اتصالات سابقة حتى لو استخدمت connect .
    Code ..


    <?
    $connection->NConnect('localhost','my_name',
    'my password','my database name');
    ?>






    بعدها الكائن جاهز لاستقبال طلبات الاستعلامات باستخدام الامر Execute فيه ... كالتالي :
    Code ..


    <?
    $result = $connection->Execute('select * from bogus_table');
    ?>






    لاحظ أن نتيجة الاستعلام حفظت في المتغير result$ ، و ذلك على شكل كائن ايضا !!!

    بعدها يبدأ التفنن في عرض النتيجة ، أحب الطريقة التالية :
    Code ..


    <?
    $students = $connection->Execute("select name, email,
    parent_tel from student");
    if(!$students){die('لا يوجد طلاب');}

    while(@extract($students->FetchRow())){

    echo "the name is $name
    and the email is $email
    and his parent telephone # is $parent_tel <br>";

    }
    ?>






    أحياناً تريد قيمة واحدة مثل اسم الطالب إذا كان عندك رقمه في الجدول ... يمكنك إستخدام GetOne :
    Code ..


    <?
    $name = $connection->GetOne("select name from student
    where id=$id");
    ?>






    بامكانك معرفة عدد السجلات المرجعة باستخدام RecordCount :
    Code ..


    <?
    $students = $connection->Execute("select name, email,
    parent_tel from student ");
    if(!$student){die('لا يوجد طلاب');}
    echo 'عدد الطلاب'.$students->RecordCount();
    ?>






    هنالك ميزة جميلة جداً و هي قدرة هذا الكائن على إخراج السجلات كـقائمة منسدلة :
    Code ..


    <?
    $students = $db->Execute('select name,id from student');
    $menu= $students->GetMenu('stuid');

    $search_form = "
    <form name='search' method='post' action='stu_search.php'>
    ابحث عن <input name='search_for' value=\"$search_for\" >
    <input type='hidden' value='do_search' name='action'>
    <input type='submit' value='ابحث'>
    </form>
    <form name=select method='get' action='stu_log.php'>
    او اختر احد الطلبة
    $menu
    <input type=submit value='اعرض التقييمات '>
    </form>
    ";
    ?>






    أما إغلاق الاتصال يتم كالتالي :
    Code ..


    <?
    $connection->Close();
    ?>






    كما ترى ... لا شيء جديد ، و السبب ان كل العمل يتم في الخلفية ... و بالتحديد في المشغلات ...
    في النهاية أنت الرابح ... لأن كل ما عليك فعله لتجعل الكود السابق يعمل على قاعدة من نوع Oracle مثلاً هو تغيير سطر واحد ، اي :
    Code ..


    <?
    $connection = NewADOConnection('oracle');
    ?>






    هذه المشغلات ليست جاهزة كلها ، لكن الكثير منها مجرب و يمكن الاعتماد عليه و البقية مازال تحت التطوير ، راجع هذه الصفحة للمزيد :
    http://php.weblogs.com/adodb_manual#drivers

    سنعرّج على معظم الاشياء التي ذكرت بشيء من التفصيل ...



    عرض السجلات و الادوات الخدمية

    سنتكلم الان عن طرق عرض السجلات و عن بعض الادوات الخدمية ....

    هنالك عدة طرق لعرض السجلات و هي :
    1- استخدام المصفوفة fields في كائن الاستعلام .
    2- استخدام دوال جلب السجلات .
    3- جلب السجلات دفعة واحدة .

    و من الادوات الخدمية :
    1- الاستعلام المخزن Cached Query ؟
    2- انشاء ارقام الصفحات .
    3- عرض السجلات على شكل قائمة منسدلة .
    4- معرفة قيمة المعرف التلقائي Auto-increment feild .
    5- تصدير النتيجة باشكال مختلفة .

    سنفرض أننا انتجنا الكائن و اتصلنا بقاعدة البيانات كالتالي :
    Code ..


    <?
    $db = NewADOConnection($db_type);
    $db->PConnect($db_server,$db_user,$db_pass,$db_name)
    or display_error('مشكلة في مزود القاعدة');
    ?>






    طبعا قيم المتغيرات أتت من مكان ما ، مثل ملف إعدادات أو فورم .. الخ


    عرض النتائج : المصفوفة fields

    كما ذكرنا .. فانك عندما تقوم بعمل استعلام كالتالي :
    Code ..


    <?
    $students = $connection->Execute("select name, email,
    parent_tel from student ");
    if(!$students){die('لا يوجد طلاب');}
    ?>






    فإن النتيجة التي ترجع عبارة عن كائن ، يمكنك فوراً أن تري أول السجلات و ذلك بقراءة المصفوفة fields داخله :
    Code ..


    <?
    echo $students->fields;
    ?>






    كما هو معلوم فإن المصفوفات في الـ PHP إما أن تكون رقمية أو إسمية أو مختلطة ( أي إسمية و رقمية في نفس الوقت ) ، إذا أردنا أن تكون هذه المصفوفة رقمية فان علينا استخدام الدالة SetFetchMode في كائن الاتصال قبل عمل الاستعلام ... كالتالي :
    Code ..


    <?
    $db->SetFetchMode(ADODB_FETCH_NUM);
    ?>






    ثم القيام بالاستعلام :
    Code ..


    <?
    $students = $connection->Execute("select name, email,
    parent_tel from student ");
    if(!$students){die('لا يوجد طلاب');}
    ?>






    و يمكنك جلب عدد معين من السجلات تبدأ من موضع معين باستخدام SelectLimit فمثلاً لجلب عشرة سجلات بعد السجل الخامس .. استعمل :
    Code ..


    <?
    $students = $connection->SelectLimit("select name, email,
    parent_tel from student ",5,10);
    if(!$students){die('لا يوجد طلاب');}
    ?>






    ثم عرض النتائج :
    Code ..


    <?
    while(!$students->EOF){
    echo "
    الاسم ".$students->fields[0]."
    البريد ".$students->fields[1]."
    هاتف الاب".$students->fields[2];
    //هذه مهمة للانتقال الى السجل التالي
    $students->MoveNext();
    }
    ?>






    EOF تخبرنا هل وصلنا الى آخر سجل في سجلات النتائج أم لا ، عندما نصل الى آخر سجل فإن قيمته ستكون واحد .

    أما اذا أردنا أن تكون المصفوفة اسمية فعلينا التالي :
    Code ..


    <?
    $db->SetFetchMode(ADODB_FETCH_ASSOC);
    ?>






    ثم القيام بالاستعلام :
    Code ..


    <?
    $students = $connection->Execute("select name, email,
    parent_tel from student ");
    if(!$students){die('لا يوجد طلاب');}
    ?>






    و عرض النتائج :
    Code ..


    <?
    while(!$students->EOF){
    echo "
    الاسم ".$students->fields['name']."
    البريد ".$students->fields['email']."
    هاتف الاب".$students->fields['parent_tel'];
    //هذه مهمة للانتقال الى السجل التالي
    $students->MoveNext();
    }
    ?>






    أو طريقتي المفضلة :
    Code ..


    <?
    while(!$students->EOF){
    extract($students->fields);

    echo "
    الاسم : $name
    البريد : $email
    هاتف الاب : $parent_tel";

    //هذه مهمة للانتقال الى السجل التالي
    $students->MoveNext();
    }
    ?>






    بالامكان أيضاً أن تكون المصفوفة مختلطة يمكنك التعامل معها على أنها اسمية او رقمية .. كالتالي :
    Code ..


    <?
    $db->SetFetchMode(ADODB_FETCH_BOTH);
    ?>






    إذا لم تحدد نوع المصفوفة في سكربتك فإن نوع النتيجة سيعتمد على نوع نظام قواعد البيانات .. في MySql سيكون مصفوفة مختلطة .

    ينصح دليل هذا الكائن أن نستعمل ADODB_FETCH_ASSOC أو ADODB_FETCH_NUM لان الكثير من المشغلات لا تدعم ADODB_FETCH_BOTH .


    عرض النتائج : دوال جلب السجلات

    في الطريقة السابقة استخدمنا مصفوفة لجلب السجلات و اضطررنا الى استخدام الدالة MoveNext في كائن النتيجة للانتقال الى السجل التالي ، لكن في هذا القسم سنرى بعض الدوال التي تجلب سجلات النتيجة ، و سنرى أن بعضها يقوم بالانتقال تلقائيا ...

    1- الدالة : FetchRow .
    تقوم بارجاع السجل على شكل مصفوفة و الانتقال الى السجل الذي يليه ... ترجع صفراً إذا كانت عند نهاية السجلات :
    Code ..


    <?
    while($row = $students->FetchRow()){
    extract($students->fields);

    echo "
    الاسم : $name
    البريد : $email
    هاتف الاب : $parent_tel";
    }
    ?>






    هذه هي الطريقة المشهورة لاغلب المبرمجين .

    2- الدالة : FetchNextObject .
    ترجع الدالة السجل الحالي على شكل كائن و تنتقل الى السجل الذي يليه ... ترجع صفراً إذا كانت عند آخر سجل :
    Code ..


    <?
    while($row = $students->FetchNextObject()){

    echo "
    الاسم ".$row->name."
    البريد ".$row->email."
    هاتف الاب".$row->parent_tel;
    }
    ?>






    3- الدالة : CurrentRow .
    وهي ترجع رقم السجل الحالى :
    Code ..


    <?
    while($row = $students->FetchNextObject()){
    echo "رقم تسلسلي".$students->CurrentRow();
    //هذا ليس افضل استعمال :-)
    echo "
    الاسم ".$row->name."
    البريد ".$row->email."
    هاتف الاب".$row->parent_tel;
    }
    ?>



    عرض النتائج : جلب السجلات كاملة

    بامكانك جلب السجلات دفعة واحدة بطريقتين :
    الاولى : تنفيذ الاستعلام عن طريق الدالة GetAll في كائن الاتصال عوضا عن Execute :
    Code ..


    <?
    $students = $connection->GetAll("select name, email from student ");
    if(!$students){die('لا يوجد طلاب');}
    ?>






    هنا $students ليست كائناً كما سبق ، و إنما مصفوفة ذات بعدين ... مثل :
    Code ..


    <?
    array(2) {
    [0]=>
    array(2) {
    [0]=>
    string(5) "ahmad"
    [1]=>
    string(24) "ahmad@example.com"
    }
    [1]=>
    array(2) {
    [0]=>
    string(4) "ali"
    [1]=>
    string(10) "ali@example.com"
    }
    }
    ?>






    و بالامكان عرضها باستخدام foreach مع list كالتالي :
    Code ..


    <?
    $students=$db->GetAll('select name,address from student')
    or display_error('لا يوجد طلاب في الحلقة','طلاب الحلقة','لا يوجد طلاب');

    foreach ($students as $student){
    list($name,$email)=$student;
    echo "$name < $email > <br>";
    }
    ?>






    عندما تستخدم هذه الطريقة فإن الاستعلام يُلغى تلقائياً و تعاد اليك المصفوفة - أو صفر في حالة الخطأ - لذلك يجب ان تستعمل الدالة sizeof لمعرفة عدد السجلات المرجعة .

    الطريقة الثانية هي استخدام الدالة GetArray في كائن الاستعلام - انتبه ليس كائن الاتصال - و هي تعيد كذلك مصفوفة ذات بعدين ، الفرق أن كائن الاتصال مازال موجوداً و بامكانك استعماله ... كالتالي :
    Code ..


    <?
    $students=$db->Execute('select name,address from student')
    or display_error('لا يوجد طلاب في الحلقة','طلاب الحلقة','لا يوجد طلاب');

    $students_list = $students->GetArray();
    foreach ($students_list as $student){
    list($name,$email)=$student;
    echo "$name <$email> <br>";
    }
    echo "عدد الطلاب".$students->RecordCount();
    ?>






    بامكانك إرجاع عدد معين من الصفوف فقط :
    Code ..


    <?
    $students=$db->Execute('select name,address from student')
    or display_error('لا يوجد طلاب في الحلقة','طلاب الحلقة','لا يوجد طلاب');

    $students_list = $students->GetArray(2);
    foreach ($students_list as $student){
    list($name,$email)=$student;
    echo "$name <$email> <br>";
    }
    echo "عدد الطلاب".$students->RecordCount();
    ?>






    تطبع الدالة أول سجلين ... لاحظ ان RecordCount ستطبع العدد الكلي و ليس 2 .

  7. #7
    أدارى
    الصورة الرمزية HVIPS4


    تاريخ التسجيل: Jun 2011
    رقم العضوية: 6
    الدولة: Cairo
    المشاركات: 1,979
    HVIPS4 غير متواجد حالياً

    رد: موسوعة دروس للغة الـــ php 2


    الادوات الخدمية : الاستعلام المخزن

    بعض الاستعلامات نقوم بها كلما طلبت الصفحة مثل عدد الاعضاء في موقع معين ، كلما فتح أحدهم الموقع قام البرنامج بعمل الاستعلام ، مع أنه قد تمضي الساعات دون أن يسجل أحد جديد في الموقع ... اضرب هذا في عدد زوار الموقع .... لاشك إذاً أن تلك الاستعلامات كانت بلا فائدة لان عدد الاعضاء لم يتغير ..


    هنا تاتي فكرة تخزين قيمة الاستعلام لفترة معينة ... خلالها لن يقوم البرنامج بالاستعلام من المزود و إنما سيقرأ نتيجة الاستعلام من ملف على الموقع ، وبهذا نقلل من عدد الاستعلامات المنفذة .


    دعنا نفترض الان أن لدينا موقعا و نريد عرض الطلاب ... لنفرض انك يوميا تتلقى 12 عضواً أي بواقع نصف عضو تقريباً في الساعة
    نقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعي ، لكن الصفحة تطلب يوميا 5000 مرة ... إذاً دعنا نخزن قيمة الاستعلام لمدة مثلا 20 دقيقة ...

    كل ما عليك هو أمرين : أخبر ADOdb أين تخزن الملفات المؤقتة و استعمل الدالة CacheExecute بدلا من Execute و باقي السكربت يظل عادياً :

    Code ..


    <?

    $ADODB_CACHE_DIR="./cache/";
    $students=$db->CacheExecute(1200,'select name,address from student');

    while($row = $students->FetchRow()){

    extract($students->fields);
    echo "
    الاسم : $name
    البريد : $email
    هاتف الاب : $parent_tel";
    }
    ?>






    CacheExecute تاخذ قيميتين : الاولى عدد الثواني التي سنخزن نتيجة الاستعلام فيها ، والثاني هو الاستعلام نفسه ، كل اوامر الاستعلام التي مرت معنا مثل SelectLimit و GetAll لها دوال تخزن النتيجة مثل CacheGetAll و CacheSelectLimit .





    الادوات الخدمية : انشاء ارقام الصفحات


    بامكانك طبع النتائج مع أدوات للتنقل : "السجل التالي -السجل السابق - آخر سجل - أول سجل" ، فقط تحتاج إلى تضمين الملف adodb-pager.inc.php و إنشاء كائن منه و استعماله كالتالي :

    Code ..


    <?

    include('adodb.inc.php');
    include_once('adodb-pager.inc.php');

    $db = NewADOConnection($db_type);


    $db->PConnect($db_server,$db_user,$db_pass,$db_name)

    or display_error('مشكلة في مزود القاعدة');

    $result = new ADODB_Pager($db,'select name,address from student');


    $result->render(5);

    ?>






    و هذه تخرج النتائج على شكل جدول و في كل مرة تطبع خمسة سجلات كما هو واضح في مناداة الدالة render في الكائن result ، الحقيقة أن هذه الكلاس لا تعطيك التحكم الذي تريده مباشرة ...



    الادوات الخدمية : القائمة المنسدلة


    احيانا تحتاج ان تصنع قائمة منسدلة لكي يختار منها المستخدم مؤلفاً أو قسماً من أقسام موقعك ... عادة يظهر للمستخدم إسم المؤلف أو إسم القسم لكن النموذج يرجع رقم المؤلف أو القسم في الجدول ... ADOdb تعطيك القدرة على عمل ذلك كما مر معنا ...

    Code ..


    <?

    $students = $db->Execute('select name,id from student');
    $menu= $students->GetMenu('stuid');

    $search_form = "

    <form name='search' method='post' action='stu_search.php'>
    ابحث عن <input name='search_for' value=\"$search_for\" >
    <input type='hidden' value='do_search' name='action'>
    <input type='submit' value='ابحث'>
    </form>
    <form name=select method='get' action='stu_log.php'>
    او اختر احد الطلبة
    $menu
    <input type=submit value='اعرض التقييمات '>
    </form>
    ";
    ?>






    استخدمنا هنا الدالة GetMenu في كائن الاستعلام ... هذا هو التعريف الكامل لهذه الدالة مع شرح مدخلاتها :

    Code ..


    GetMenu($name, [$default_str=''],

    [$blank1stItem=true], [$multiple_select=false],
    [$size=0], [$moreAttr=''])







    name$ : اسم القائمة في النموذج أي <select name="?"> .

    default_str$ : العنصر الذي سيكون مظللا في البداية ... بامكانك ارسال مصفوفة و عندها يتم تظليل- اي اختيار - جميع عناصر المصفوفة .
    blank1stItem$ : هل تريد اول عنصر ان يكون فارغا .
    multiple_select$ : هل تسمح باختيار اكثر من قيمة .
    size$ : للقائمة HTML عدد العناصر المظهره ... هذه خاصية .
    moreAttr$ : خصائص اخرى للقائمة .

    كمثال :

    Code ..


    <?

    $menu= $students->GetMenu('stuid','ahmad',1,0,1,
    'style="background-color: Beige;"');
    ?>






    و النتيجة :

    Code ..


    <select name="stuid" size=1

    style="background-color: Beige;">
    <option></option>
    <option value="1">Ali</option>
    <option selected value="7">ahmad</option>
    <option value="13">Abdulaziz</option>
    <option value="14">Masoud Alhasan</option>
    <option value="8">Waleed</option>
    </select>


    الادوات الخدمية : المعرف التلقائي


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


    الدالة Insert_ID في كائن الاتصال تمكنك من معرفة قيمة اخر معرف استخدم ... مثال :

    Code ..


    <?

    $db = NewADOConnection($db_type);
    //$db_type = 'mysql' in this case ...
    $db->PConnect($db_server,$db_user,$db_pass,$db_name)
    or display_error('مشكلة في مزود القاعدة');

    $student = $db->Execute("insert into student

    (id,name)values (\"\",\"mahmood\")");
    echo "اخر معرف هو : ".$db->Insert_ID();
    ?>



    الادوات الخدمية : التصدير


    بامكانك تصدير نتيجة الاستعلام الى عدة انواع :

    1- القيم المفصولة بفاصلة CSV باستخدام الدالة rs2csv .
    2- القيم المفصولة بعلامة جدولة باستخدام الدالة rs2tab .
    3- جدول HTML باستخدام الدالة rs2html .

    هذه الدوال الاثنتين الأُول موجودات في الملف toexport.inc.php والاخيرة في tohtml.inc.php ، لذا يجب عليك تضمين هذه الملفات لتتمكن من استخدام الدوال ، كل ماعليك بعد ذالك هو القيام بالاستعلام و منادة الدالة المناسبة مع تمرير كائن النتيجة لها ...


    لنرى امثلة :


    التصدير الى CSV :

    Code ..


    <?

    include('adodb.inc.php');
    include_once('toexport.inc.php');
    $db = NewADOConnection($db_type);
    //$db_type = 'mysql' in this case ...
    $db->PConnect($db_server,$db_user,$db_pass,$db_name)
    or display_error('مشكلة في مزود القاعدة');

    $student = $db->Execute("select name, home_tel from student");


    echo rs2csv($student);

    ?>






    و النتيجة :

    Code ..


    name,home_tel

    ahmad,888
    Abdulaziz,777
    Masoud Alhasan,333
    Waleed,222






    بالامكان إلغاء السطر الأول بتعديل سطر مناداة الدالة الى :

    Code ..


    <?

    echo rs2csv($student,false);
    ?>






    و النتيجة :

    Code ..


    ahmad,888

    Abdulaziz,777
    Masoud Alhasan,333
    Waleed,222






    لمناداة الدالة rs2tab عوضاً عنها غير السطر ذاته الى :

    Code ..


    <?

    echo rs2tab($student,false);
    ?>






    و النتيجة :

    Code ..


    ahmad 888

    Abdulaziz 777
    Masoud Alhasan 333
    Waleed 222






    اخيراً يمكنك التصدير الى جدول HTML ، لكن يلزمك تضمين ملف اخر و هو tohtml.inc.php :

    Code ..


    <?

    include('adodb.inc.php');
    include_once('tohtml.inc.php');
    $db = NewADOConnection($db_type);
    //$db_type = 'mysql' in this case ...
    $db->PConnect($db_server,$db_user,$db_pass,$db_name)
    or display_error('مشكلة في مزود القاعدة');

    $student = $db->Execute("select name, home_tel from student");


    echo rs2html($student);

    ?>






    النتيجة :

    Code ..


    <TABLE COLS=2 BORDER='1' WIDTH='98%'>

    <TH>name</TH><TH>home_tel</TH>
    <TR valign=top>
    <TD>ahmad </TD>
    <TD>888 </TD>
    </TR>
    <TR valign=top>
    <TD>Abdulaziz </TD>
    <TD>777 </TD>
    </TR>
    <TR valign=top>
    <TD>Masoud Alhasan </TD>
    <TD>333 </TD>
    </TR>
    <TR valign=top>
    <TD>Waleed </TD>
    <TD>222 </TD>
    </TR>
    </TABLE>





    هنالك العديد من خيارات التصدير الاخرى الموجودة مع هذه الباقة ، اطلع عليها في هذين الملفين السابقين و في دليل الباقة .





    مثال عملي


    لا شئ يعدل مثال عملي :

    عندما أردت تعلم هذه الباقة ، قمت بانشاء سكربت صغير يقوم بحفظ التقييمات في حلق تحفيظ القران الكريم
    السكربت من جدولين : الاول للطلاب و الثاني للتقييمات و هي على شكل يومي ..

    خزنت للطالب : إسمه و رقم هاتف منزله و رقم هاتف أبيه و عنوانه .

    و للتقييم : رقم الطالب - موضع بداية الحفظ - موضع نهاية الحفظ - مستوى الحفظ - موضع بداية المراجعة - موضع نهاية المراجعة - مستوى المراجعة - تاريخ اليوم - ملاحظات .

    في السكربت خمسة ملفات :

    1- stu_list : قائمة الطلاب و معلوماتهم .
    2- stu_manage : إضافة - تعديل - حذف الطلاب .
    3- stu_log : التقييمات الخاصة بالطالب .
    4- log_manage : اضافة - تعديل - حذف التقييمات .
    5- stu_search : محرك بحث بالاسم .... استخدمت فيه كود القائمة المنسدلة الذي ذكرته سابقاً .

    يستخدم السكربت FastTemplate كنظام قوالب ... لكني لم استعمله في بعض الاحيان ...


    هيئة الجداول موجودة في ملف readme_dbSchema.txt ، و بالامكان تحميله من :

    http://www.phpvillage.com/scripts/tahfeez.zip




    في النهاية


    رأينا في هذا الدرس أهمية تعميم استخدام قواعد البيانات في التطبيقات التي تنشأها ... كما رأينا كيف سهلت لنا باقة ADOdb عمل ذلك ، أيضا رأينا كيف وفرت لنا هذه الباقة خواصاً أخرى مهمة مثل تخزين نتائج و بعض الخدمات الجميلة الاخرى .

  8. #8
    أدارى
    الصورة الرمزية HVIPS4


    تاريخ التسجيل: Jun 2011
    رقم العضوية: 6
    الدولة: Cairo
    المشاركات: 1,979
    HVIPS4 غير متواجد حالياً

    رد: موسوعة دروس للغة الـــ php 2


    دوال IMAP : -


    دوال الإتصـال 1

    1- الدالة imap_open :
    Code ..


    integer imap_open(string server, username,

    password, int flag);






    هذه الدالة تبدأ الاتصال بمزود البريد الإلكتروني وتعيد لك معرف الاتصال الذي ستستخدمه في الدوال الأخرى التي تتطلب معرف الاتصال.

    المعطى server هو مزود البريد الالكتروني كما يلي على سبيل المثال :
    Code ..


    {mail.server.com}INBOX







    السطر السابق يمثل الصورة الافتراضية وذلك باستخدام مزود IMAP والمنفذ 25 أما إذا كنت تستخدم منفذ آخر فإنك ستحتاج إلى كتابة رقم المنفذ كالتالي :

    Code ..


    {mail.server.com:143}INBOX







    أما إذا كنت تستخدم نظام آخر للبريد الالكتروني كنظام POP3 يجب عليك كتابته كالتالي :

    Code ..


    {mail.server.com/pop3:110}INBOX







    ومع مزود الأخبار NNTP كالتالي :

    Code ..


    {mail.server.com/nntp:199}INBOX







    أرجو أن يكون واضحاً. وبعد ذلك اسم المستخدم وكلمة السر ، أما المعطى الأخير flag اختياري ويستخدم لتحديد طريقة الاتصال .


    2- الدالة imap_popen :

    Code ..


    integer imap_popen(string server, username,

    password, int flag);






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



    دوال الإتصـال 2


    3- الدالة imap_reopen :

    Code ..


    integer imap_popen(integer streem, string username,

    password);






    هذه الدالة تعاود الاتصال في حالة قطع الاتصال في حالة بمزود البريد الالكتروني ، في هذه الدالة لن تكتب المزود ولكن ستمرر معرف الاتصال السابق .


    4- الدالة imap_ping :

    Code ..


    boolean imap_ping(integer streem);







    هذه الدالة تخبرك فيما إذا كانت الاتصال لازال موجوداً أم أته مقطوع .


    5- الدالة imap_close :

    Code ..


    boolean imap_close(integer streem);







    تستخدم هذه الدالة لقطع الاتصال بمزود البريد الالكتروني ، يجب أن تمرر معرف الاتصال الذي حصلت عليه من الدالة imap_open .


    هذه هي بعض الدوال التي تيسر ذكرها في هذا الدرس ، وفي نهاية السلسة التي سيتم وضع مثـال شـامل لاستخدام هذه الدوال أو الأهم منها

  9. #9
    أدارى
    الصورة الرمزية HVIPS4


    تاريخ التسجيل: Jun 2011
    رقم العضوية: 6
    الدولة: Cairo
    المشاركات: 1,979
    HVIPS4 غير متواجد حالياً

    رد: موسوعة دروس للغة الـــ php 2


    البريد الاليكتروني في الـ PHP : -


    مقدمة

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

    البريد الإلكتروني من اروع خدمات الانترنت, يمكنك بضغطة زر ان تراسل و تتواصل مع احباءك و لو كانوا في الطرف الاخر من الارض ...


    و لكن ليس هذا فقط : فالبريد الإلكتروني يعد من أهم الطرق - ان لم يكن الطريقة الوحيدة- التي يتواصل بها أي موقع مع زواره و مستخدميه .. لذلك سوف نرى في هذا الدرس كيف يمكنك تسخير هذه التقنية في مشروعك القادم ...


    سيتناول هذا الدرس الامور التالية :


    1- دالة ()mail .

    2- ارسال نص بسيط .
    3- واصفات البريد و وظائفها + زوائد البريد MIME
    4- ارسال بريد على هيئة HTML .
    5- ارسال رسالة بنسختين : نص و HTML .
    6- ارسال ملحقات


    الدالة ()mail


    تقوم هذه الدالة بارسال بريد الكتروني حسب التعريف التالي :

    Code ..


    bool mail ( string to, string subject, string message

    [, string additional_headers [, string additional_parameters]])






    أداء الدالة كالتالي :

    - ترسل الدالة الرسالة الموجودة في message الى العنوان او العناوين في to وموضوع البريد هو subject .
    - ترجع الدالة صفرا عند الفشل و واحد عند النجاح .
    - ترسل الدالة الى اكثر من بريد ... عندها فقط عليك ان تفصل البريد عن الاخر بفاصلة .
    - بامكانك ارسال نصوص بسيطة و رسائل اكثر تعقيدا باستخدام هذه الدالة و ايضا بامكانك ارسال ملفات على شكل ملحقات ...
    - لا حظ ان القيمة التي ترجعها الدالة لا تعكس هل وصل البريد او لا ... انما تعكس ان PHP استطاعت تمرير طلب الارسال الى مزودالبريد الموجود على الخادم ..

    مثال :

    Code ..


    <?

    $people = array('saadنقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعيbogus.com','aliنقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعيbogus.com',
    'mahmoodنقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعيbogus.com');
    $to= implode(',',$people);
    $subject="محاضرة مفيدة";
    $message="
    [الرافضة واليهود والواقع اليوم]
    للشيخ سعد البريك
    تجدها هنا في اذاعة طريق الاسلام
    http://www.islamway.com/bindex.php?section=lessons&

    lesson_id=14933&scholar_id=17";
    mail($to,$subject,$message);
    ?>


    ارسال نص بسيط


    ارسال نص خالي من التنسيق من ابسط الامور عند استخدام الدالة mail كل ما عليك هو وضع النص في متغير و ارساله ... و اليك المثال التالي :

    Code ..


    <?

    $subject='حكم الغناء';
    $message='
    السلام عليكم ...
    احمد ... وجدت فتوى الشيخ ابن باز رحمه الله في تحريم الغناء
    بعنوان : الأغاني هل هي حرام أم لا ،
    رغم أستماعها بقصد التسلية فقط

    راجعها على الرابط

    http://www.ibnbaz.com/display.asp?f=bz00500.htm


    اخوك مفلح

    ';

    mail('ahmad
    نقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعيislamway.net',$subject,$message);
    ?>






    لا حظ أني لم استخدم n\ لوضع سطر جديد ... كل ما عليك هو وضع سطر جديد كما في المثال فهذا يعطي شكلا افضل للكود ... لكن اذا اردت استخدام العلامة n\ تأكد من انك تستخدم علامتي التنصيص المزدوجة( " " ) لا الفردية ( ' ' ) .





    واصفات البريد و MIME


    واصفات البريد ( Mail Headers ) هي معلومات اضافية تصف البريد ، تعطيك بعض المعلومات عن مصدر البريد , مرسل البريد , إلى من يرسل الرد و غيرها ...

    يمكن أن نسميها تحسينات للخدمة الأساسية و التي لا يوجد بها سوى عنوان مرسل البريد , الموضوع , و البريد نفسه...

    ومن ذلك نستخلص أن أي بريد إليكتروني يتكون من قسمين :

    1) الواصفات . 2) نص الرسالة .

    هنالك الكثير من واصفات البريد و بامكانك مراجعة المرجع التالي :

    http://www.dsv.su.se/jpalme/ietf/mai...il-headers.txt


    دعنا نرى ما هي واصفات البريد الموجودة و المهمة بالنسبة لنا ...


    هذه هي الواصفات التي استقبلها عادة في بريد جواب من رسائل المنتدى :

    Code ..


    Received: (qmail 62927 invoked by uid 0); 28 Nov 2002 13:17:43 -0000

    Received: from nobodyنقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعيlinhost2.interservers.com by server1.gawab.com
    by uid 1004 with qmail-scanner-1.12 (. Clear:. Processed in
    0.154407 secs); 28 Nov 2002 13:17:43 -0000
    Received: from unknown (HELO linhost2.interservers.com) (209.166.169.200)
    by 209.61.185.20 with SMTP; 28 Nov 2002 13:17:42 -0000
    Received: from nobody by linhost2.interservers.com with local (Exim 3.36 #1)
    id 18HOXw-0000MJ-00 for abomuhammedنقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعيislamway.net;
    Thu, 28 Nov 2002 08:17:36 -0500
    To : abomuhammedنقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعيislamway.net
    From : supportنقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعيphpvillage.com
    Message-Id:
    X-Antiabuse: This header was added to track abuse, please include it
    with any abuse report
    X-Antiabuse: Primary Hostname - linhost2.interservers.com
    X-Antiabuse: Original Domain - islamway.net
    X-Antiabuse: Originator/Caller UID/GID - [99 99] / [99 99]
    X-Antiabuse: Sender Address Domain - linhost2.interservers.com
    Date : 28 Nov 2002, 03:17:36 PM
    Subject : التبليغ برد على موضوعك - ...........






    لاحظ ان الرسالة ليست جزءا من الواصفات ....


    أيضاً لاحظ ان شكل ( تركيب ) الواصفة هو : اسم الواصفة ثم ":" ثم القيمة ، إذا احتاجت القيمة لاكثر من سطر فيجب ان تبدأ الاسطر الاضافية بمسافة .

    بعض الاحيان قيمة الواصفة هي نص واحد مثل :

    Code ..



    Content-type : text/html







    و في بعض الاحيان أكثر من نص واحد و عندها يجب ان تفصل القيم بفاصلة منقوطة ، و لتصغير السطر يمكنك كتابته على سطرين كما قلنا و انتبه الى أن السطر الثاني يبدأ بفراغ :


    Code ..



    Content-Disposition : inline;filename=fatwa.gif,

    creation-date="Sat,8 Jan 1997 16:00:00";
    modification-date="Wed, 12 Feb 1997 16:29:51






    ايضا لاحظ أن كل واصفة على سطر لوحدها .


    ينتهي قسم الواصفات بسطر فارغ ... اي ان برنامج البريد يقرأ الواصفات بشكل متتالي و عندما يصادف سطراً فارغا فانه يعلم أن كل ما يأتي هو نص الرسالة ...


    كل واصفة لها دلالة :


    Recieved : تحمل هذه الواصفة معلومات عن النقاط في الشبكة التي مر بها البريد قبل ان يصل الى المكان النهائي ... لاحظ وجود اكثر من واصفة من هذا النوع لان البريد قد يمر باكثر من نقطة و كل نقطة تدون معلوماتها .

    To : البريد المراد ارسال الرسالة اليه .
    From : البريد المرسل .
    Message-Id : رمز تعريفي للرسالة يولده البرنامج المرسل و لا يتكرر مع اي رسالة اخرى .
    X-Antiabuse : مجموعة معلومات للحيلولة دون ارسال بريد مزعج .
    Date : يحدد هذا الواصف متى ارسلت الرسالة .
    Subject : يحدد هذا الواصف عنوان الرسالة .

    ومن الواصفات الاخرى :

    Reply-To : البريد الذي ترسل اليه الردود على هذه الرسالة .
    X-Mailer : اسم البرنامج الذي ارسل الرسالة .
    MIME-Version : رقم نسخة "امتدادات البريد الاليكتروني متعددة الاغراض" المستخدمة .
    Content-Type : النوع الرئيسي و النوع الفرعي للرسالة مثل : text/html الرئيسي هو text و الفرعي هو html .
    Content-Transfer_Encoding : الترميز المستخدم لارسال الرسالة .

    هنالك العديد من هذه الواصفات و معظمها متفق على معانيها ... لكن هنالك واصفات للاستخدام الخاص و هي التي تبدأ بـ -X ...


    عندما تستخدم الدالة mail فان بعض هذه الواصفات تولد تلقائيا مثل To اما الاخريات فان بامكانك تحديدها ... ارجع الى تعريف الدالة ستجد ان

    المدخل الرابع هو additional_headers وعن طريقه تستطيع تحديد ما يحلو لك من الواصفات ... فقط يجب الفصل بين كل واصفة و الاخرى بـ "n\" ( سطر جديد )
    كمثال دعنا نضيف حقلا لـ From و Reply-To في بريدنا السابق .

    Code ..



    <?

    $subject='حكم الغناء';
    $message='
    السلام عليكم ...

    احمد ... وجدت فتوى الشيخ ابن باز رحمه الله في تحريم الغناء

    بعنوان : الأغاني هل هي حرام أم لا، رغم أستماعها بقصد التسلية فقط

    راجعها على الرابط

    http://www.ibnbaz.com/display.asp?f=bz00500.htm


    اخوك مفلح

    ';
    $header="From: abomuhammed <abomuhammedنقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعيislamway.net> \n
    Reply-To: abomuhammedنقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعيislamway.net \n\n";
    mail('ahmadنقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعيislamway.net',$subject,$message,$heade r);
    ?>





    لاحظ استخدام علامة التنصيص المزدوجة و ليس الفردية لانها تتعرف على علامة السطر الجديد التي ذكرناها مسبقاً وهي n\ .


    اذا تعاملنا بشكل سليم مع هذه الواصفات فسوف نتمكن من ارسال رسالة منسقة على شكل HTML و أيضاً سنتمكن من ارسال ملحقات ...


    تابع القراءة .....



    ارسال نصوص بتنسيق HTML


    لكي نرسل رسالة بتنسيق HTML كل ماعلينا فعله هو أن نخبر البرنامج المستقبل أننا نستخدم امتدادت البريد ( أي أن هذا البريد ليس عادياً ) و أيضاً أن نخبره نوع محتوى الرسالة ...... كيف ؟!

    سنستخدم الواصفتين : MIME-Version و Content-type
    MIME-Version ستأخذ القيمة 1.0 لتخبر ابرنامج المستقبل للبريد اننا نستخدم امتددات البريد النسخة رقم 1.0 .
    Content-type ستأخذ القيمة : text/html و تخبر البرنامج ان الرسالة مكتوبة على شكل HTML .

    دعنا نعدل المثال السابق بحيث يصبح الارتباط الى موقع الشيخ ابن باز عبارة عن رابط تشعبي :

    Code ..


    <?

    $subject='حكم الغناء';
    $message='
    <html>
    <body dir=rtl>
    <h1>السلام عليكم ...</h1>
    <br>
    احمد ... وجدت فتوى الشيخ ابن باز رحمه الله في تحريم الغناء <br>
    بعنوان : <font color=red> الأغاني هل هي حرام أم لا ،
    رغم أستماعها بقصد التسلية فقط</font>
    <br>
    راجعها على الرابط
    <br>
    <a href="http://www.ibnbaz.com/display.asp?f=bz00500.htm">
    من موقع الشيخ ابن باز رحمه الله</a>
    <br>
    اخوك مفلح
    </body>
    </html>
    ';
    $header="From: abomuhammed <abomuhammedنقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعيislamway.net> \n".
    "Reply-To: abomuhammedنقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعيislamway.net \n".
    "MIME-Version : 1.0 \n".
    "Content-type: text/html ; charset=windows-1256 \n";
    mail('ahmadنقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعيislamway.net',$subject,$message,$heade r);
    ?>






    سهل ... أليس كذلك ؟!



    ارسال رسالة بأكثر من تنسيق


    يوجد العديد من برامج البريد غير قادرة على عرض نصوص HTML مثل برنامج pine على اليونكس ... لذلك قد يقال انه من الافضل ارسال رسائل

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

    لكي نتمكن من ذلك يجب ان نفصل الرسالتين (اي الرسالة النصية العادية و الرسالة بتنسيق HTML ) عن بعضهما و نخبر البرنامج المستقبل عن نوع كل رسالة ...


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


    اولا : الواصفات :


    Code ..



    To: ahmad

    From: abomuhammed
    Subject: Fatwa about Singing
    MIME-Version: 1.0
    Content-Type: multipart/alternative; boundary="Boundry==587r5rs"






    وهنـا بعض النقـاط الجديدة :

    Content-type قيمتها multipart/alternative و هذا يعني ان الرسالة مرسلة باكثر من صيغة كل واحده مفصولة عن الاخرى : alternative تعني انه في حال الفشل في عرض احدهما جرب عرض الاخر ... لكنهما لن يعرضا في الوقت نفسه !
    و من قيمة هذه الواصفة نرى ان اقسام الرسالة مفصولة بقيمة العنصر boundry و هي Boundry==587r5rs

    هذه القيمة لا تعني شيئا .. كل ماعليك هو ان تتأكد انها لا ترد في نص الرسالة ... بامكانك استخدام دوال العشوائية في PHP للحصول عى نتائج جيدة ...


    لنرى الان كيف نفصل الرسالتين :

    Code ..


    <?

    $message="
    mime message هذه الرسالة تأتيك باكثر من تنسيق او صيغة
    --Boundry==587r5rs
    Content-type : text/plain;charset=windows-1256
    Content-Transfer-Encoding : 7bit

    احمد راجع هذه الفتوى

    http://www.ibnbaz.com/display.asp?f=bz00500.htm

    --Boundry==587r5rs
    Content-type : text/html
    Content-Transfer-Encoding : 7bit

    <html>

    <body dir=rtl>
    <h1>السلام عليكم ...</h1>
    <br>
    احمد ... وجدت فتوى الشيخ ابن باز رحمه الله في تحريم الغناء <br>
    بعنوان : <font color=red> الأغاني هل هي حرام أم لا ،
    رغم أستماعها بقصد التسلية فقط</font>
    <br>
    راجعها على الرابط
    <br>
    <a href=http://www.ibnbaz.com/display.asp?f=bz00500.htm target=new>
    من موقع الشيخ ابن باز رحمه الله</a>
    <br>
    اخوك مفلح
    </body>
    </html>
    --Boundry==587r5rs--";
    ?>






    دعننا نفكك هذه الرسالة :

    - تبدأ الرسالة بالجملة التحذيرية "هذه الرسالة تأتيك باكثر من تنسيق او صيغة" و فائدتها انها تعلم المستقبل بان الرسالة في صيغتين في حال فشل برنامجه في عرضهما ... غالبا لن ترى هذه الجملة الا في برامج البريد الاليكتروني القديمة و التي تفشل في فهم آليات البريد الاليكتروني متعدد الاغراض MIME .

    - يأتي بعد ذلك الفاصل Boundry==587r5rs و لاحظ انه مسبوق بشرطتين .

    - ثم نخبر البرنامج عن نوع الرسالة التالية و طريقة نقلها : بدأنا بالرسالة النصية لذلك وضعنا النوع text/plain و تشفير النقل 7bit لاحظ السطر الفارغ بعد
    واصفات كل قسم .... مهمة جدا !
    - بعدها و ضعنا الرسالة .
    - ثم الفاصل مسبوقا بشرطتين (Boundry==587r5rs--) .
    - ثم اخبرنا البرنامج ان الرسالة التاليه من نوع HTML و ذلك باختيار النوع text/html و تشفير النقل 7bit .
    - و بعدها و ضعنا الرسالة .
    - ثم وضعنا الفاصل Boundry==587r5rs مسبوقا بشرطتين و منتهيا ايضا بشرطتين لكي نخبر البرنامج بانتهاء الرسالة المركبة من رسالتين .

    وهذا هو الكود كاملا :

    Code ..


    <?

    $subject='حكم الغناء';

    $header="To: ahmad <ahmad
    نقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعيacme.com>\n".
    "From: abomuhammed<abomuhammedنقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعيislamway.net>\n".
    "Subject: حكم الغناء\n".
    "MIME-Version: 1.0\n".
    "Content-Type: multipart/alternative; boundary=\"Boundry==587r5rs\"\n";

    $message="this is a mime message -هذه الرسالة تأتيك باكثر من تنسيق او صيغة

    --Boundry==587r5rs
    Content-type : text/plain
    Content-Transfer-Encoding : 7bit

    احمد راجع هذه الفتوى

    http://www.ibnbaz.com/display.asp?f=bz00500.htm

    --Boundry==587r5rs
    Content-type : text/html
    Content-Transfer-Encoding : 7bit

    <html>

    <body dir=rtl>
    <h1>السلام عليكم ...</h1>
    <br>
    احمد ... وجدت فتوى الشيخ ابن باز رحمه الله في تحريم الغناء <br>
    بعنوان : <font color=red> الأغاني هل هي حرام أم لا ،
    رغم أستماعها بقصد التسلية فقط</font>
    <br>
    راجعها على الرابط
    <br>
    <a href=\"http://www.ibnbaz.com/display.asp?f=bz00500.htm target=new\">
    من موقع الشيخ ابن باز رحمه الله</a>
    <br>
    اخوك مفلح
    </body>
    </html>
    --Boundry==587r5rs--";

    mail('ahmad
    نقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعيacme.com',$subject,$message,$header);
    ?>


    ارسال ملحقات مع البريد


    ارسال الملحقات مع البريد لا يختلف عن ارسال رسالة بصيغتين كما رأينا سابقا ... كل ما علينا عمله هو :

    - اخبار البرنامج المستقبل ان الرسالة تحتوي على اجزاء مختلفة النوع : افرض انك سترسل رسالة نصية مع صورة او مقطع صوتي أو ملف وورد ... كل واحد له نوعه الخاص.... و يتم ذلك باعطاء الواصفة Content-type القيمة multipart/mixed ... تذكر اننا اعطيناه القيمة multipart/alternative
    في الفقرة السابقة :
    - فصل الاقسام المختلفة عن بعضها البعض بفاصل كما مر معنا .
    - يجب ان نخبر البرنامج المستقبل كيف يتعامل مع الملحقات ... بعض الملحقات (مثل الصور) يمكن عرضها مع الرسالة و لايلزم ان تظهر كملحق و البعض الاخر يجب ان يعامل كملحق و لايمكن ان يظهر في الرسالة و لهذا سنستخدم واصفة الظهور (لانها تتحكم في ظهور الملحق) Content-Disposition ...
    هذا لايلزم البرنامج بان يظهرها كما نحدد انما هو اقتراح منا لكيفية تقديم الرسالة... قد يقبله البرنامج او يرفضه .

    شكل هذه الواصفة كالتالي :


    Code ..



    Content-Disposition ":" disposition-type *(";" disposition-parm)







    تمكننا هذه الواصفة من تحديد التالي :

    - كيفية التعامل : اظهار الملحق داخليا في الرسالة (dispostion-type قيمته inline) او ان يظهر كملحق عادي خارج الرسالة (dispostion-type قيمته attachment)
    - معلومات عن الملف ( disposition-parm ) مثل :
    filename : اسم الملف و فيه نقترح اسما للملف اذا اراد البرنامج تخزينه او كتابته لاي ملف و يجب ان يكون حاليا انجليزيا (راجع rfc2183 )
    creation-date : الوقت الذي انشء فيه الملف
    modification-date : اخر وقت عدل فيه الملف
    read-date : اخر وقت تمتفيه قراءة الملف (لاحظ ان المعلومات الثلاث الاخيرة تفقد عند ارسال ملف على الانترنت و هذه هي اهمية هذه الخيارات)
    size : حجم الملف

    كمثال عند ارسال صورة يمكن ان يكون واصفة الظهور كالتالي :


    Code ..



    Content-Disposition: attachment; filename=genome.jpeg;

    modification-date="Wed, 12 Feb 1997 16:29:51 -0500";






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


    Code ..



    Content-Disposition: attachment; filename=genome.jpeg;

    modification-date="Wed, 12 Feb 1997 16:29:51 -0500";






    هنالك امور يجب مراعاتها عند ارسال ملحقات و اهمها ان الملفات التي تحتوي بيانات ثنائية Binary Data يجب ان تشفر باستخدام الدالة base64_encode لكي نتمكن من ارسالها عبر الانترنت اما النصوص العادية فلايلزم تشفيرها ...


    لنرى الان كيف نرسل ملحقاً : في المثال الذي ذكرناه لنفرض اننا نريد ايضا ارسال صورة فتوى تحريم الغناء (ملف gif) و نصها (ملف وورد doc) الى احمد ...


    اريدك ان ترى انني لا أرسل له رابطا للصورة و لكن ارسل الصورة نفسها !!!


    الخطة :

    أولاً : نقرأ ملف الصورة و الوورد و نشفره باستخدام base64_encode و نقسمه الى اجزاء صغيرة باستخدام chunk_split ليوافق التعليمات في rfc 2045 .
    ثانياً : نولد فاصلا عشوائيا لكي نستخدمه لفصل الكلام عن الصورة في الرسالة .
    ثالثاً : ننشئ واصفات الرسالة العامة بحيث تبين اننا نرسل رسالة ذات انواع مختلفة ...
    رابعاً : نولد الرسالة ...

    تذكر : نوع mime لصور gif هو image/gif بينما لملفات الوورد هو application/octet-stream .


    بسم الله ..


    Code ..



    <?

    // general settings
    $gif_name="fatwa.gif";
    $doc_name="fatwa.doc";

    // قراءة الملفين

    $file=fopen($gif_name,'rb'); // لاننا نقرأ ملف ثنائي rb نستخدم
    $gif_data=fread($file,filesize($gif_name));
    fclose($file);

    $file=fopen($doc_name,'rb');

    $doc_data=fread($file,filesize($doc_name));
    fclose($file);

    // تشفير الملف و تقسيمه

    $gif_data = chunk_split(base64_encode($gif_data));
    $doc_data = chunk_split(base64_encode($doc_data));

    // توليد فاصل

    $random=md5(time());
    $boundry="Boundry==$random";

    // توليد واصفات الرسالة

    $headers="To: ahmad <ahmadنقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعيacme.com>\n".
    "From: abomuhammed<abomuhammedنقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعيislamway.net>\n".
    "Subject: حكم الغناء\n".
    "MIME-Version: 1.0\n".
    "Content-Type: multipart/mixed; boundary=\"$boundry\"\n";

    $message="

    this is a mime message -هذه الرسالة تأتيك باكثر من تنسيق او صيغة
    --$boundry
    Content-type : text/html
    Content-Transfer-Encoding : 7bit

    <html>

    <body dir=rtl>
    <h1>السلام عليكم ...</h1>
    <br>
    احمد ... وجدت فتوى الشيخ ابن باز رحمه الله في تحريم الغناء <br>
    بعنوان : <font color=red> الأغاني هل هي حرام أم لا ،
    رغم أستماعها بقصد التسلية فقط</font>
    <br>
    راجعها على الرابط
    <br>
    <a href=\"http://www.ibnbaz.com/display.asp?f=bz00500.htm target=new\">
    من موقع الشيخ ابن باز رحمه الله</a>
    <br>
    اخوك مفلح
    </body>
    </html>

    --$boundry

    Content-type: image/gif
    Content-Transfer-Encoding: base64
    Content-Disposition: inline;filename=\"fatwa.gif\"

    $gif_data


    --$boundry

    Content-type: application/octet-stream
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment;filename=\"fatwa.doc\"

    $doc_data


    --$boundry--";

    echo mail('ahmadنقره لتكبير أو تصغير الصورة ونقرتين لعرض الصورة في صفحة مستقلة بحجمها الطبيعيacme.com','حكم الغناء',$message,$headers);
    ?>





    جربت هذا الكود على بريدي هوتميل و جواب و أدى المطلوب

  10. #10
    أدارى
    الصورة الرمزية HVIPS4


    تاريخ التسجيل: Jun 2011
    رقم العضوية: 6
    الدولة: Cairo
    المشاركات: 1,979
    HVIPS4 غير متواجد حالياً

    رد: موسوعة دروس للغة الـــ php 2


    صمم موقعك بإستخدام القوالب : -


    مقدمة

    يعلم الجميع وخصوصاً مطوري المواقع أهمية نظام القوالب والذي أنتشر انتشاراً واسعاً لما له من فوائد كثيرة . حيث يتم باستخدام هذه الطريقة فصل الشفرة البرنامج عن شفرة HTML بمعنى آخر فصل البرنامج عن التصميم . وهذا بدورة يسهل عملية تغيير التصميم بدون المساس بمحتوى الشفرة . وكذلك يسهل هذه العملية عما لو كان التصميم مدمج مع شفرة البرنامج .
    لقد قرأت في هذا المنتدى موضوع عن كيفية استخدام القوالب في تصميم المواقع وقام بعض الأعضاء مشكورين بإفادة السائل واشاروا عليه بإستخدام كلاس خاص بهذه المهمة اسمه FastTemplate ، ولقد قمت شخصياً بتحميل هذا الكلاس ولكن لم استطع التعامل معه لتعقيده وبدأت بالبحث عن كلاسات أخرى ، حتى وجدت المطلوب وهو مجموعه تحتوي على ثلاث كلاسات أحدهم للتاريخ والآخر لإرسال البريد والثالث ( وهو موضوعنا هنا ) خاص بالقوالب .

    أولاً قم بتحميل الملف بزيارة الموقع الخاص به بالضغط هنا ، اسم الملف vLIB_3-0-10.zip .

    قم بفك ضغط الملفات بأي مجلد من اختيارك ، ستجد ملف بإسم vlibIni.php-dist قم بتغيير اسمه إلى vlibIni.php ، هذا الملف يحتوي على متغيرات خاصة بالقوالب وقيم إفتراضية لها ( لا تقم بتغيير أي من تلك المتغيرات ) .

    الآن لنقم بتصميم موقع بسيط يحتوي على نظام القوالب :

    1- انشئ مجلد جديد وليكن اسمه mysite .
    2- انسخ المجلد الخاص بالمجموعه ( Vlib ) داخل هذا المجلد بحيث يصبح عنوانه mysite/vilb .
    3- تأكد من ان المجلد السابق ( Vlib ) يحتوي على جميع المجلدات والملفات الخاصة بالمجموعه .
    4- انشئ مجلد جديد داخل مجلد mysite لحفظ القوالب به وليكن اسمه templates .


    إنشاء ملف القالب


    سنقوم الآن بإنشاء القالب للصفحة الرئيسية :

    1- انشئ ملف جديد بإسم mainpage.tbl ( يمكنك اختيار أي امتداد غير tbl ولكن يفضل استخدام الإمتداد اللذي تختاره لجميع ملفات القوالب حتى تتفادى المشاكل ) مع التأكد من حفظ الملف داخل المجلد templates .
    2- ضع هذه الشفرة داخل ملف القالب :
    Code ..


    <html dir=rtl>

    <head>
    <title><tmpl_var name='title'></title>
    </head>
    <body bgcolor="<tmpl_var name='bg'>">
    <tmpl_var name='msg'>
    <table border="1">
    <tr>
    <td>رقم المستخدم</td>
    <td>اسم المستخدم</td>
    </tr>
    <tmpl_loop name='loop1'>
    <tr>
    <td><tmpl_var name='userid'></td>
    <td><tmpl_var name='username'></td>
    </tr>
    </tmpl_loop>
    </body>
    </html>





    - شرح الكود السابق :

    كما تلاحظون بأن الكود السابق هو كود html عادي جداً ، ولكن هناك اوسمه tags جديده وهي :
    1- <tmpl_var naem='VAR_NAME'>
    2- <tmpl_loob name='LOOP_NAME'>
    3- </tmpl_loop>
    الوسم الأول خاص بالمتغيرات حيث سيتم إستبداله بقيمة معينه . مثل title سيتم إستبداله بقيمة title كما سنشاهده بعد قليل .

    الوسم الثاني خاص بإنشاء دورة تكرارية أما الوسم الثالث فهو لإنهاء الدورة التكرارية ، بمعنى أن ما يكتب بين الوسم الثاني والثالث سيتم تكرارهما على حسب عدد مرات التكرار المطلوبه ( في مثالنا هذا سيتم تكرار كتابة رقم المستخدم واسمه حتى تنتهي البيانات ) .




    إنشاء ملف PHP


    الآن لننشئ الصفحة الرئيسية وليكن اسمها index.php واحفظها في المجلد الرئيسي للموقع ( mysite ) ، بعد ذلك قم بفتح الملف index.php وضع هذه الشفرة بداخله :

    Code ..


    <?

    // إضافة ملف كلاس القوالب إلى هذا الملف
    include("vlib/vlibTemplate.php");
    // جلب ملف القالب المطلوب التعامل معه
    $tmpl = new vlibTemplate("templates/mainpage.tbl");

    // يقوم السطر التالي بتغيير وسم عنوان الصفحة إلى النص المحدد

    $tmpl->setVar('title', 'عنوان الصفحة');

    // إضافة رسالة إلى القالب

    $tmpl->setVar('msg', 'مرحباً بك، هذه معلومات اسماء المستخدمين');

    // لنفترض بأن لديك مصفوفه تحتوي على ارقام واسماء المستخدمين

    $rows = array();
    $rows[] = array('userid' => 1, 'username' => 'Mohammed');
    $rows[] = array('userid' => 2, 'username' => 'Ali');
    $rows[] = array('userid' => 3, 'username' => 'Khaled Al-Omar');
    $rows[] = array('userid' => 4, 'username' => 'Saud Ahmad');
    $rows[] = array('userid' => 5, 'username' => 'Mobarak');
    $rows[] = array('userid' => 6, 'username' => 'Hashem');

    // بدء الدورة مع تحديد الإسم الذي اخترناه في القالب

    $tmpl->newLoop('loop1');

    foreach ($rows as $row) {

    // إضافة بيان واحد إلى القالب
    // سيتم التكرار حتى تنتهي البيانات من المصفوفه
    $tmpl->addRow($row);
    }
    // إنهاء الدورة وإدخال البيانات إلى القالب
    $tmpl->addLoop();

    // طباعة القالب مع المحتويات الجديدة

    $tmpl->pparse();
    ?>





    - شرح الكود السابق :

    1- يتم في السطر الأول جلب ملف الكلاس الذي سيتم استخدامه في تغيير قيم المتغيرات في القالب .
    2- بعد ذلك يتم جلب ملف القالب المراد استخدامه .
    3- يتم تعيين قيمة "عنوان الصفحة" بدل الوسم <tmpl_var name='title'> .
    4- بـعد ذلـك يتـم تعيـين قيـمة "مرحباً بك ، هذه معلـومات اسماء المتسخدمين" بـدل الوسـم التالي <tmpl_var name='msg'> .
    5- يقوم النظام ببدء الدورة .
    6- يتم تعيين القيم المدرجة في المصفوفة داخل الدورة الموجودة في القالب بحيث تتكرر حتى نهاية البيانات .
    7- في السطر الأخير يتم طباعة القالب بعد تغيير قيم المتغيرات ليظهر بشكله النهائي .

    عند فتح الصفحة الرئيسية index.php سيتم جلب القالب وتغيير قيم المتغيرات وطباعة الشكل النهائي ( قم بفتح مصدر الملف الناتج واطلع على شكل شفرة html ، ستلاحظ بأنها نفس الموجودة بالقالب ما عدا تكرار الأوسمه الخاصة بالجدول بعدد ارقام واسماء المتسخدمين ) .


    يوجد عدة أمثله ( للتاريخ والبريد والقوالب ) مرفقه مع المجموع تجدونها في مجلد vlib/examles أرجو الإطلاع عليها ومحاولة فهمها وتطبيقها ( خصوصاً أمثلة القوالب ) ، كذلك يوجد شرح وافٍ لأنواع المتغيرات والخواص ( باللغة الإنجليزية ) في الموقع الرسمي للمجموعه وعنوانه هو
    http://vlib.activefish.com .

 
صفحة 1 من 2 12 الأخيرةالأخيرة

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

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