+ الرد على الكتاب
صفحة 2 من 4 الأولىالأولى 1 2 3 4 الأخيرةالأخيرة
النتائج 11 إلى 20 من 36

الكتاب: لغة ( php )

  1. #11

    افتراضي دوال المصفوفات

    مثال :
    <form action = “list.php” method = post>
    ما هو مشروبك المفضل ؟
    <br>
    <select name = “s” >
    <?
    $shrab =array(“شاي”,”قهوة”,”كابتشينو”,”توت”,”برتقال”);
    For ($k=0;$k<4;$k++)
    {
    echo “<option>”.$shrab[$k].”</option>”;
    }
    ?>
    </select>
    </form>

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

    قم بحفظ التغييرات في ملف إمتداده php وقم بكتابة الملف list.php اعتمادا على معلوماتك السابقة في درس النماذج .

    دوال المصفوفات

    الدالة key
    لنفرض أن لدينا مصفوفة مكونة من عنصرين :
    مثال :
    $s= array (“على”,”محمد”);
    الآن لنضف إليها هذه السطور
    <?
    $s= array (“على”,”محمد”);
    $t=key ($s);
    echo $t;
    ?>
    يقوم الأمر key بإيجاد رقم الفهرسه (index) العنصر النشط حالياً .... وهو الرقم صفر حيث أننا لم نضع فهرسة وهذه هي الفهرسة التي وضعها الـPHP تلقائياً عندما لم نضع فهرسة ... قد تحيرك كلمة النشط لكن ستعرف أننا نستطيع التجول بين عناصر المصفوفة لاحقاً .

    قد يكون رقم الفهرسة حروف أو كلمات

    مثال :
    <?
    $s= array (“ع”=>“على”,”م”=>”محمد”);
    $t=key ($s);
    echo $t;
    ?>


    الدالة current()
    تقوم الدالة current بإيجاد القيمة لعنصر المصفوفة الحالى (index value) .
    مثال :
    <?
    $s= array (“ع”=>“على”,”م”=>”محمد”);
    $p=current ($s);
    echo $p;
    ?>
    في المثال السابق قمنا بإيجاد القيمة الحالية للعنصر النشط .... لاحظ أننا أوجدنا بالأمر key رقم الفهرسة بينما أوجدنا بالأمر current القيمة للعنصر المفهرس .

    كيف يمكننا تنشيط العناصر الاخري للمصفوفه ؟!
    يمكننا ذلك عن طريق الدالتين next() و prev اللتان تقومان بالتجول بين عناصر المصفوفة ..... لنفرض أن لدينا مصفوفة تتكون من ثلاثة عناصر
    مثال :
    <?
    $s= array (“ع”=>“على”,”م”=>”محمد”,”ا”=>”احمد”);
    echo key($s).”<br>”;
    echo current($s) .”<br>”;
    ?>
    لقد قمنا في هذا المثال بطباعة قيمة رقم الفهرسة للعنصر الحالى وقيمته ( اقصد برقم الفهرسة الحرف(ع) واقصد بالقيمة (على) .... لنقم الآن بالتجول بين عناصر المصفوفة ولنر نتيجة الطباعة .

    مثال :
    <?
    $s= array (“ع”=>“على”,”م”=>”محمد”,”ا”=>”احمد”);
    next($s);
    echo key($s).”<br>”;
    echo current($s) .”<br>”;
    ?>

    <?
    $s= array (“ع”=>“على”,”م”=>”محمد”,”ا”=>”احمد”);
    next($s);
    next($s);
    echo key($s).”<br>”;
    echo current($s) .”<br>”;
    ?>
    لاحظ أننا كتبنا الدالة next() قبل أن نقوم بالإنتقال لكي يتم تنشيط العنصر الثاني في أول مثال ولتنشيط العنصر الثالث في ثالث مثال (ولاحظ أننا كتبنا next() مرتين ) .

    يمكننا الرجوع لتنشيط العنصر السابق بوضع الدالة prev() فمثلاً يمكننا تعديل المثال التالى :
    <?
    $s= array (“ع”=>“على”,”م”=>”محمد”,”ا”=>”احمد”);
    next($s);
    next($s);
    prev($s);
    echo key($s).”<br>”;
    echo current($s) .”<br>”;
    ?>
    فسيقوم الـPHP في هذه الحاله طباعة العنصر الثاني وليس الثالث لأنه تم التراجع خطوه عن طريق prev()

    ماذا سيحصل إذا قمنا بإضافة عنصر على مصفوفة غير محدودة الفهرسة ؟!
    لنفرض أن لدينا مصفوفة وأضفنا إليها عنصر غير محدد الفهرسة . مثل :
    <?
    $s= array (12=>“على”,5=>”محمد”,44=>”احمد”);
    $s[ ]= “هشام”;
    Next($s);
    Next($s);
    Next($s);
    Echo key ($s).”<br>”;
    Echo current( $s ).”<br>”;
    ?>

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

    الدالة List و Each
    لنفرض أنك قد قمت بصنع مصفوفة غير مفهرسة بالترتيب
    مثال :
    <?
    $s= array (12=>“على”,5=>”محمد”,44=>”احمد”);
    ?>
    على ذلك دعنا نخبرك بخبر سار وهو أنك تستطيع أن تجعل حياتك مع PHP أسهل مع حياتك مع نفسك !
    While (list(ارقام الفهرسة Index,Element valueقيمة العنصر )=each (array)
    تستطيع بواسطة هذه الدالتين وعن طريق التكرار while استخراج جميع العناصر الموجودة في المصفوفة
    While (list($e,$r) = each ($s))
    {
    echo “<br> $e<br> $r”;
    }
    أولاً أنت تقوم بتسمية متغيرين واحد منهما لرقم الفهرسة ($e) والثاني للعنصر ($r) ويمكننا تسميتهما بأي اسم وفي حالة ما إذا أردنا عرض العنصر فقط أو معرفة العنصر فقط فيمكننا حذف ($e) ولكننا لانحذف الفاصلة
    While (list(,$r) = each ($s))
    {
    echo “<br> $e<br> $r”;
    }
    لنعد الى المثال الذي فيه رقم الفهرسة والعنصر ... سيقوم التكرار بوضع رقم الفهرسة (الذي قد يكون نصياً) في المتغير $e وسيضع قيمة العنصر الذي رقم الفهرسة له هو $e في المتغير $r ثم سيقوم بطباعة العناصر حتي ينتهي منها جميعها ...
    ملاحظة مهمة : إذا لم تقم بتعريف فهرسة للمصفوفة (حروف أو أرقام أيا كان) فسيتم استخدام العناصر عندما يطلب التكرار الفهارس .
    مثال :
    <?
    $e=array("fsda","terhfgfd","tewr");
    While (list ($I,$V)=each($e))
    {
    echo "<br>$e[$I]";
    }
    ?>

    لاحظ مع Hننا طلبنا طباعة الفهرسة (index) إلا أنه تم أخذ العناصر(elements) بدلاً من الفهرسة

    يمكننا بواسطة هذه الدالة صناعة أشياء مفيده وكمثال لذلك لنفرض أن لدينا مصفوفة أرقام هواتف ونريد أن نخرج هذه المصفوفة على جدول html فسنستطيع صناعة هذا الجدول عن طريق التكرار السابق بكل سهولة .
    مثال :
    <table align='center' dir = "rtl" border="1" width="100%" cellspacing="0" bordercolorlight="#000000" bordercolordark="#000000" bordercolor="#000000">
    <tr>
    <td align='center'>الاسم</td>
    <td align='center'>رقم التلفون</td>
    </tr>
    <?
    $s = array (658=>"عادل" ,456546=>"سالم" , 465873);
    While (list($e,$r) = each ($s))
    {
    echo "<tr><td align='center'>". $r . "</td><td align='center'>" .$e . "</td></tr>";
    }
    ?>
    </table>
    أرايت كيف استخرجنا جميع أرقام التلفونات في جدول بواسطه تكرار بسيط ، يمكنك صناعة الأكثر واختصار الكثير من الوقت على ذلك إذا كانت المصفوفة تحتوي على المئات من الأرقام بواسطة هذا الكود بدلاً من أن تكتب الكود على شكل html وتكتب البيانات وتتعب نفسك .

    يمكنك أيضا معرفة عدد العناصر في مصفوفة معينة إذا كنت تريد معرفة عددها وذلك بالطريقة التالية :
    <?
    $s= array (12=>“على”,5=>”محمد”,44=>”احمد”);
    $S=0;
    While (list($E,$r) = each ($s))
    {
    $S++;
    }
    ECHO “عدد عناصر المصفوفه ” . $S++;
    ?>

    فرز المصفوفات
    هناك العديد من الدوال التي يوفرها لنا الـPHP لفرز المصفوفات . نحن سنأخذ نظرة عن الخمسة دوال الأكثر استخداماً :

    الدالة Sort()
    هذه الدالة من أساسيات فرز المصفوفات وهي جداً أساسية وهي تقوم بأخذ محتويات المصفوفة ومن ثم تقوم بفرزها هجائياً اعتماداً على الأحرف الكبيرة أولا ثم الصغيرة .. تتطلب هذه الدالة اسم المصفوفة التي سيتم عليها الفرز

    Sort (ArrayName);









    إذا قمنا بإنشاء مصفوفة بالشكل التالى :
    $NaNo=array (“ali”,“salem”,“hythem”,“Khaled”,“Ammar”,“Hesham”( ;
    فإذا أردنا فرزها عن طريق الدالة sort() فإننا نقوم باستخدامها كالتالى :
    <?
    $NaNo=array (“ali”,“salem”,“hythem”,“Khaled”,“Ammar”,“Hesham”( ;
    sort($NaNo);
    While (list($e,$r) = each ($NaNo))
    {
    echo “<br> $e<br> $r”;
    }
    ?>

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

    الدالة Arsort()
    هذه الدالة تعمل نفس عملية الدالة sort() ولكن هناك اختلاف بسيط فمثلاً لو كتبنا المصفوفه كالتالى :
    $NaNo=array ( “ad”=>”ahmed”, “kh”=> “khaled”);
    وأردنا فرزها وطباعة الفهارس والقيم كما في المثال التالى :
    <?
    $NaNo=array ( “ad”=>”ahmed”, “kh”=> “khaled”);
    sort($NaNo);
    While (list($e,$r) = each ($NaNo))
    {
    echo “<br> $e<br> $r”;
    }
    ?>
    قارن ناتج المثال السابق مع هذا المثال :
    <?
    $NaNo=array ( “ad”=>”ahmed”, “kh”=> “khaled”);
    asort($NaNo);
    While (list($e,$r) = each ($NaNo))
    {
    echo “<br> $e<br> $r”;
    }
    ?>
    اعتقد انك قد عرفت الفرق ففي المثال الاول قامت الدالة sort باستبدال الحروف بأرقام في الفهرسة أما في المثال الثاني فقد تم وضع الحروف كما هي وتم فرزها كما تفعل الدالة sort في الفرز .
    باختصار لايوجد فرق بين sort و asort إلا في أن الدالة sort تستبدل فهرسة الحروف بأرقام .

    الدالة Rsort() و arsort
    تقوم بنفس عمل sort و asort ولكن بشكل عكسي جرب الأمثلة التالية :
    مثال :
    <?
    $NaNo=array ( “ad”=>”ahmed”, “kh”=> “khaled”);
    rsort($NaNo);
    While (list($e,$r) = each ($NaNo))
    {
    echo “<br> $e<br> $r”;
    }
    ?>

    مثال :
    <?
    $NaNo=array ( “ad”=>”ahmed”, “kh”=> “khaled”);
    arsort($NaNo);
    While (list($e,$r) = each ($NaNo))
    {
    echo “<br> $e<br> $r”;
    }
    ?>
    ستجد أن الدالة rsort تقوم بنفس عملية الدالة sort ولكن بشكل عكسي
    أيضاً الدالة arsort تقوم بنفس عملية asort ولكن بشكل عكسي .
    يمكنك استعمال كل هذه الدوال في الفرز مع الحروف العربية ( إذا كان السيرفر يدعم اللغة العربية )
    قم بتطبيق المثال التالى :
    RSORT()
    <?
    $NaNo=array ( "ad"=>"سالم", "kh"=> "احمد");
    rsort($NaNo);
    While (list($e,$r) = each ($NaNo))
    {
    echo "<br> $e<br> $r";
    }
    ?>
    <br>--------<br>
    ARSORT()
    <?
    $NaNo=array ( "ad"=>"احمد", "kh"=> "أحمد");
    arsort($NaNo);
    While (list($e,$r) = each ($NaNo))
    {
    echo "<br> $e<br> $r";
    }
    ?>
    <br>--------<br>
    ASORT()
    <?
    $NaNo=array ( "ad"=>"هاشم", "kh"=> "جمال");
    asort($NaNo);
    While (list($e,$r) = each ($NaNo))
    {
    echo "<br> $e<br> $r";
    }
    ?>
    <br>--------<br>
    SORT()
    <?
    $NaNo=array ( "ad"=>"هاشم", "kh"=> "جمال");
    sort($NaNo);
    While (list($e,$r) = each ($NaNo))
    {
    echo "<br> $e<br> $r";
    }
    ?>
    الدالة ksort
    تكلمنا سابقاً عن طريقة فرز المصفوفات ولكن نريد أن نلفت نظرك أننا كنا نعتمد على العنصر في الفرز (element) ولكن هذه الدالة تقوم بالاعتماد على رقم الفهرسه في الفرز (index)
    مثال : sort
    <br>--------<br>
    asort()
    <?
    $NaNo=array ( "ad"=>"هاشم", "kh"=> "جمال");
    asort($NaNo);
    While (list($e,$r) = each ($NaNo))
    {
    echo "<br> $e<br> $r";
    }
    ?>
    <br>--------<br>
    ksort()
    <?
    $NaNo=array ( "ad"=>"هاشم", "kh"=> "جمال");
    ksort($NaNo);
    While (list($e,$r) = each ($NaNo))
    {
    echo "<br> $e<br> $r";
    }
    ?>
    لقد اعتمد الـphp على index ولم يعتمد على الـelement في الفرز .

  2. #12

    افتراضي دوال المصفوفات الإضافيه

    دوال المصفوفات الإضافيه
    هناك الكثير من الدوال التي يمنحنا إياها الـPHP للتعامل مع المصفوفات والتي لايكفي الوقت لذكرها الآن سنقوم بشرح أهم دالتين والمستخدمة بكثره وهي array_push() و array_pop()

    لنفرض أننا قمنا بإنشاء مصفوفة بالشكل التالى :
    <?
    $saher[ 5]=”salem”;
    $saher[ 85]=”khaled”;
    $saher[ 35]=”mohmed”;
    $saher[ 19]=”hajeer”;
    ?>
    وأردنا أن نضيف عنصر جديد لها فقمنا بالتالى :
    <?
    $saher[ 5]=”salem”;
    $saher[ 85]=”khaled”;
    $saher[ 35]=”mohmed”;
    $saher[ 19]=”hajeer”;
    $saher[ ]=”Alfarees”;
    ?>

    انظر إلى العنصر الأخير الذي سيعطيه الـPHP رقم الفهرسة (index) وسيكون رقم فهرسته هو 86 .
    نريد أن نلفت نظرك بأننا نستطيع عمل إضافة لعنصر على المصفوفة بطريقة أخري وهي عن طريق الدالة array_push() كالتالى :

    array_push (ArrayNameاسم المصفوفه,Elemnt1, Elemnt2, Elemnt3,…..)
    نضع في القسم الأول من الدالة اسم المصفوفة التي نريد إضافة العنصر لها ونضع في القسم الثاني عنصر واحد أو أكثر وهي التي سيتم إضافتها للمصفوفة .
    مثال :
    <?
    $saher[ 5]=”salem”;
    $saher[ 85]=”khaled”;
    $saher[ 35]=”mohmed”;
    $saher[ 19]=”hajeer”;
    array_push ($saher,Alfarees)
    ?>
    مثال :
    <?
    $saher[ 5]=”salem”;
    $saher[ 85]=”khaled”;
    $saher[ 35]=”mohmed”;
    $saher[ 19]=”hajeer”;
    array_push ($saher,Alfarees,salem,sameer,thamer)
    ?>

    ولو أردنا حذف مثلاً عنصر من المصفوفة فإننا نقوم بتعريف المصفوفة من جديد أو يمكننا استخدام الدالة array_pop التي تقوم بحذف آخر عنصر من المصفوفة والتي تتطلب فقط اسم المصفوفة

    Array_pop(ArrayName اسم المصفوفه)

    مثال :
    <?
    $saher[ 5]=”salem”;
    $saher[ 85]=”khaled”;
    $saher[ 35]=”mohmed”;
    $saher[ 19]=”hajeer”;
    array_pop($saher)
    ?>
    سيتم حذف العنصر hajeer من المصفوفة ولن يكون في المصفوفة غير ثلاث عناصر .

    Implode و Explode
    تقوم هذه الدالتين باقتصاص قيمة معينة من مصفوفة أو نصوص وتقوم بإضافة قيمة معينة على مصفوفة أو نصوص .

    الدالة Implode
    تقوم بإضافة قيمة على بين عناصر المصفوفة .

    مثال :
    <?
    $stng =array ("ahmed", "salem", "ali", "alfarsi");
    $r =implode ("H",$stng);
    echo $r;
    ?>





    الدالة explode
    تقوم بحذف قيمة من مصفوفة وذلك لايعني حذف عناصر من المصفوفة .

    مثال :
    <?
    $stng =array ("ahmed", "salem", "ali", "alfarsi");
    $r =implode ("-",$stng);
    echo $r;
    $r= explode ("-",$stng);
    echo $r;
    ?>

    HTTP_GET_VARS و HTTP_POST_VARS
    هذه ليست متغيرات بل مصفوفات ، نعم هذه مصفوفات ولكن في ماذا نستخدمها ولماذا ؟
    في الواقع تحدثنا في الدرس السابق عن طريقة التعامل مع النماذج والحصول على البيانات من المستخدم وتكلمنا عن أسلوبين لنقل البيانات وهما GET و POST
    عندما تصل البيانات محفوظة في متغيرات إلى صفحة الـPHP فإنه يقوم بتعريفها تلقائياً ويمكنك طباعة المتغيرات وقيمها مباشرة من غير تعريف .... ولكن هذه الميزة في الـPHP يمكن إلغاؤها عن طريق الملف PHP.INI وذلك بإغلاق ميزة register_globals
    وذلك بوضع off بدلا من on

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

    لنفرض أنك اشتركت عند مزود ويب وكان قد أغلق ميزة (register_globals) حسناً لنفرض أنك قد صنعت نموذجاً يستخدم مربع نص ويحفظ قيمته في متغير اسمه Dorrah ثم بعد ذلك يقوم بإرسال هذه القيمة باستخدام الأسلوب GET إذاً سيكون جزء من الكود في الصفحة الأولى والتي تحتوي على النموذج كالتالى
    <form method =get action = “try.php”>
    ماهو اسم الطفل الذي استيقظ به العالم الاسلامي من غفلته قبل عده شهور !!
    <br>
    <input type=text name = “Dorrah”>
    <br>
    في الملف الثاني(try.php) سنقوم بكتابة الجزء الذي سيقوم بطباعة القيمة كالتالى
    <?
    Echo HTTP_GET_VARS[“Dorrah”];
    ?>
    لاحظ أننا لم نستخدم $ ولكن إذا أردنا الإحتفاظ بقيمة المتغير في متغير آخر فيمكننا ذلك بشكل عادي كالتالى :
    <?
    $Dorrah= HTTP_GET_VARS[“Dorrah”];
    ?>

    طريقه بسيطة .... أليس كذلك ولكن .... لنفترض أن مزود خدمة الويب لديك حريص جداً ولذلك فقد ألغي أيضا ميزة استقبال هذه القيم في المصفوفات .... يمكنه ذلك في ملف الـphp.ini في اعدادات الـtrack_vars الذي يقوم بمنع السيرفر من استخدام هذه المصفوفات (هذه الميزة يمكن إلغاؤها في php4 ) .... على ذلك انصحك بإرسال رسال تذمر وشكوي إلى مزود الخدمة لديك .. تعلن فيها أن الأمر اصبح لايحتمل .




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

    يمكننا كتابة مصفوفة متداخلة كالتالى :
    <?
    $mon= array (1=>array ("sharkeh al-jafali",154786) ,2 => array ("salem almazen",1257) );
    while (list($personnum) =each ($mon))
    {
    echo ("<br>$personnum<br>");

    while (list(,$phone)=each ($mon[$personnum]))
    {
    echo ("$phone");
    }
    }
    ?>

    الشرح
    هذا المثال قد يكون غامضاً جداً لكن فكرته بسيطة أولاً افترض أنك تعلم عن list..each جيداً وتعرف صيغة التكرار الذي يستخدمهما .
    الآن لدينا مصفوفة تتكون من رقمين للفهرسة هذين الرقمين كل واحد منهما عنصره عبارة عن مصفوفة هذه المصفوفة تحتوي على عنصرين ( ولنتناسي أنهما يحتويان على أرقام فهرسة ) وهما اسم شخص ورقم هاتفه .
    echo
    في أول خطوة :
    while (list($personnum) =each ($mon))
    {
    echo (“<br>$personnum”);
    قمنا بإخراج رقم الفهرسة الأساسي للمصفوفة والذي يعتبر هو الرقم التسلسلي للاشخاص أصحاب الهواتف ومن بعد ذلك يقوم بطباعة هذا الرقم التسلسلي ويبدأ من سطر جديد .

    في الخطوة الثانية :
    while (list(,$phone)=each ($mon[$personnum]))
    {
    echo ("$phone");
    }
    نقوم بإخبار الـPHP بطباعة العناصر الذي تحتويها المصفوفة التى تم طباعة رقم فهرستها ، ولاحظ (,$phone) أنها تشير إلى عناصر مصفوفة وليس فهارسها لأننا تجاهلنا فهارس المصفوفة الداخلية .
    لاتقلق الأمر سهل ولكنه يحتاج الى تدرب فقط ، وعليك أن تتدرب وصدقني أنني حاولت ان أبسط المثال من أجلك ... أتمني أن تكون قد فهمت .








    تطبيق عملي
    افتح محرر النصوص لديك واكتب الكود التالي :
    <?
    Echo "<form method =post action = 'exam2.php' " ;
    $boy=array ("أحمد" , "خالد", "سعد","حسن");
    while (list(,$Name) = each ($boy))
    {
    echo "ماهي السنة الدراسية لـ $Name ؟";
    Echo "<select name = 'school[]'>
    <option>اول ثانوي</option>
    <option>ثاني ثانوي</option>
    <option>ثالث ثانوي</option>
    </select>";
    echo "<br><br>";
    echo "<input type =hidden name =boy[] value ='$Name'>";
    }
    echo "<input type =submit ></form>";
    ?>
    احفظ الكود باسم exam.php
    افتح محرر النصوص واكتب الكود التالي واحفظه في ملف باسم exam2.php
    <html dir = "rtl">
    <?
    While (list($I,$V)=each($school))
    {
    $friendschool[] = $school[$I].$boy[$I];
    }
    asort ($friendschool);
    While (list ($I,$V)=each($friendschool))
    {
    echo "<br>$boy[$I]"." ".$school[$I];
    }
    ?>
    قم بتشغيله بعد نقله لمجلد السيرفر

    الشرح
    الذي قمنا به في المثال السابق هو أننا قمنا بإنشاء مصفوفة لعده أشخاص ($boy) ونريد أن نعرف مرحلهم الدراسية في الثانوية فأنشأنا لكل طالب قائمة منسدلة بواسطة التكرار (list-each) بصناعة قوائم منسدلة وحقول مخفية يتم تخزين قيم الحقول (التي تحتوي على أسماء الأشخاص) في المصفوفة ($boy) وسيتم تخزين نتائج كل القوائم في مصفوفة ($school) وبعد أن يختار المستخدم الإجابات التي تناسبه وارسال البيانات سيتم استقبال المصفوفة التي فيها نتائج القوائم المنسدلة ($school) واستقبال المصفوفة التي فيها أسماء الأشخاص ($boy) ومن ثم يتم إنشاء مصفوفة جديدة باسم $friendschool[] ويؤخذ منها معلومات المصفوفتين ويتم دمجها فيها ومن ثم يتم بتكرار آخر طباعة عناصر المصفوفتين $boy و$school .

    تكرار foreach
    هذا التكرار هو من الأشياء الجديدة في الـphp4 وهو يساعدك على معرفة عناصر مصفوفة معينة أو طباعة محتوياتها .
    Foreach ($ArrayName As $ArrayItem)
    {
    code شفره
    }
    مثال :
    <?
    $T= array (a=>”ahmed “ , b => “basem”, c=>”car”)

    Foreach ($T As $A => $r)
    {
    echo $A .”-----”. $r;
    }
    ?>

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

    مثال :
    <?
    $c=array("a","b","c");
    $v=count($c);
    echo $v;
    ?>

  3. #13

    افتراضي ترتيب الكود البرمجي

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

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

    Function
    الدالة هي جزء من كود البرنامج يتم تعريفه عن طريق المبرمج ليتم تنفيذ شي معين بواسطتها ، تقوم الدالة بأخذ قيم وتسمي (arguments معطيات ) كمدخلات ،، ثم تقوم بعمل بعض التعديلات على هذه المدخلات وتقوم بإخراج قيمة أخري في أكثر الأحيان تقوم الدالة بأخذ القيم ووضعها في متغيرات أخري تسمي بالـ(parameters) لكي يتم اجراء العمليات عليها داخل الدالة وهذه المتغيرات لاتعمل خارج الدالة أي أنها متغيرات خاصه بالدالة فقط ! ...في دروسنا السابقه قمنا باستخدام دوال عديده مثل دوال فرز المصفوفات ودوال ايجاد نوع البيانات ،،،، هذه المرة سنقوم ببناء دوالنا الخاصة بنا ،، ومن صنعنا نقوم باعطاءها المعلومات والبيانات وهي تقوم باجراء العمليات عليها ومن ثم اخراج الحلول ...

    تعريف واستدعاء الدوال
    لكي تقوم بتعريف دالة فإنك تقوم بكتابة الكلمة function متبوعة باسم الدالة والبارمترات الازمة والتي سيتم اجراء العمليات عليها بين قوسين ومن ثم تقوم بكتابة الكود الازم وسط { و }

    الصيغه :
    Function functionname (parameters)
    {
    function code
    }
    تقوم بكتابه اسم الدالة بدلاً من functionname ثم تقوم بتعريف المتحولات أو المتغيرات parameters ومن ثم تقوم بكتابه الكود الذي سوف يقوم بالمطلوب بين القوسين بدلاً من function code

    دعنا الآن نقوم بكتابة دالة من إنشاءنا والتي تقوم باجراء عملية الجمع على متغيرين وسنقوم بتسمية الدالة باسم sumnoraml وهو اسم من تأليفنا ويدل على وظيفة وهدف الدالة ويمكن أن تقوم بتمسية الدالة باي اسم تريده ولست مجيراً بكتابه اسم معين

    <?
    Function sumnormal($a)
    {
    $a = $a + 100 ;
    return $a;
    }
    ?>

    نقوم في هذه الدالة بإجراء عملية إضافة 100 على المتغير أو القيمة التي يتم تمريرها .

    Return
    يجب أن نضعها في نهاية كل دالة ، نستخدم هذه الكلمة لكي نقوم بإعلام الداله ان وظيفتها انتهت وايضا نستخدمها إذا كان لدينا أكثر من قيمة ونريد أن نقوم بإخبار الـPHP ماهي القيمة التي سيتم اعتمادها ففي مثالنا هذا أردنا إخبار الـPHP بأن يقوم بأخذ المتغير $a بانه هو القيمة النهائية مع أنه لو لم نضع المتغير فسيتم اعتباره هو الناتج النهائي لانه لايوجد متغير اخر تم عليه أي عمليات

    الذي اقصده أننا لو كتبنا الكود بالشكل التالى :
    <?
    Function sumnormal($a)
    {
    $a = $a + 100 ;
    return ;
    }
    ?>

    فإنه لاضرر من ذلك لأنه لا يوجد لدينا إلا قيمة واحدة لن يتم اعتماد قيمة غيرها ولكن لو افترضنا أنه لدينا أكثر من قيمة كما في المثال التالى :
    <?
    Function sul($a,$b)
    {
    $a = $a + 100 ;
    $b= $b*100;
    return $a ;
    }
    ?>
    هنا يجب تحديد أي المتغيرين سيكون هو القيمة النهائيه للدالة .

    شرح الداله (sumnormal)
    تقوم الدالة التي صنعناها بأخذ قيمتين ومن ثم فإنها تقوم بزياده العدد الذي يتم تمريره 100

    ولكي نقوم بإخراج نتيجة الدالة فإننا ببساطة نسطيع ذلك باجراء أحد الأمرين echo أو print .
    مثال :
    <?
    Function sumnormal($a)
    {
    $a = $a + 100 ;
    return ;
    }
    echo sumnormal(500);
    ?>
    لقد قمنا بتمرير رقم بدلاً من المتغير ويمكننا أيضا تمرير متغير بدلاً من الرقم
    مثال :
    <?
    Function sumnormal($a)
    {
    $a = $a + 100 ;
    return ;
    }
    $f=100;
    echo sumnormal($f);
    ?>
    لاحظ أننا استخدمنا متغير في الدالة (مما يثبت كلامنا في الأعلى أن للدالة متغيرات خاصة بها) وليس معني ذلك أننا لانستطيع استخدام متغيرات بنفس الاسم المذكور في الدالة فيمكننا مثلاً كتابة نفس اسم المتغير بدون حصول أي مشاكل كالتالى :
    <?
    Function sumnormal($a)
    {
    $a = $a + 100 ;
    return ;
    }
    $a=100;
    echo sumnormal($a);
    ?>
    يمكننا أيضا استدعاء دالة بشكل عادي إذا كانت هي تقوم بالطباعة
    مثال :
    <?
    Function sumnormal($a)
    {
    $a = $a + 100 ;
    print $a;
    return ;
    }

    $a=100;
    sumnormal($a);
    ?>

    print
    يقوم الأمر print بنفس عمل الدالة echo ولايوجد بينهما اختلاف سوى أن الدالة echo قديمة وهي الأصل أما الدالة print فقد تم إنشاؤها في php4 ولايوجد أي فرق بينهما اطلاقا .
    مثال :
    <?
    Print “احمد”;
    ?>
    ويمكننا بها إخراج نتيجة دالة
    <?
    Function sumnormal($a)
    {
    $a = $a + 100 ;
    return ;
    }
    $a=100;

    print sumnormal($a);
    ?>







    اين يتم وضع الداله ؟
    يمكنك وضع الدالة في أول الكود أو في آخرها أي أنه لافرق بين :
    <?
    //لاحظ اننا قمنا بتعريف الداله اولا ثم استدعاءها
    Function fares($d)
    {
    print “alfareees@hotmail.com”;
    }

    fares($d) ;
    ?>
    وبين :
    <?
    //لاحظ اننا قمنا باستدعاء الداله اولا ثم تعريفها
    fares($d) ;

    Function fares($d)
    {
    print “alfareees@hotmail.com”;
    }
    ?>
    يمكنك أيضا عدم وضع متغيرات في الدالة كالتالى :
    Html_header ()
    {
    Print “<html><head><title>alfareees</title></head>”;
    Return ;
    }
    هذه الدالة تقوم بكتابة الطور الأول من صفحة html لاحظ أننا لم نقم بوضع أي متغيرات او عوامل او متحولات (سمها كما شئت ) .

    تمرير القيم الى الدالة
    هناك نوعين من تمرير القيم

    1 - تمرير القيمه مباشره الى الداله (passing by value)
    وذلك أن نضع القيمة مباشرة بدون إدراجها في متغيرات .
    مثال :
    <?
    Function alfars ($f)
    {
    $f=$f+$f;
    return ;
    }
    echo alfars(100);
    ?>
    لاحظ أننا قمنا بإدراج القيمة مباشرة للدالة من غير وضعها في متغيرات .







    2 - تمرير القيمه عن طريق المرجع (passing by reference)
    نقصد بهذا أننا نقوم بوضع القمية في متغير أولا ثم نضع هذا المتغير في الدالة لكي يتم اجراء العمليات عليه مثال :
    <?
    Function alfars ($f)
    {
    $f=$f+$f;
    return ;
    }
    $r =1000;
    echo alfars($r);
    ?>

    اعداد قيمة افتراضيه للدالة
    تستطيع أن تجعل الـPHP4 يقوم بإدراج قيمة إفتراضية عند عدم تمرير متغيرات إليه
    مثال :
    <?
    Function alfars ($f=40)
    {
    $f=$f+$f;
    return ;
    }
    echo alfars();
    ?>
    إذا لم يتم إعطاء قيمة للدالة فإنها ستفترض أن القيمة هي 40 مباشرة .
    أما إذا تم تمرير قيمة أو متغير فإنه سيتم العمل بالقيمة التي تم تمريرها بدلاً من القيمة الإفتراضية
    مثال :
    <?
    Function alfars ($f=40)
    {
    $f=$f+$f;
    return ;
    }
    echo alfars(100);
    ?>

  4. #14

    افتراضي مدي المتغيرات (variable scope)

    مدي المتغيرات (variable scope)
    هناك متغيرات محلية (local) ومتغيرات عامة (global) ، نقصد بالمتغيرات المحلية التي تكون في داخل الدالة ونقصد بالعامة التي تكون في كود الـPHP بشكل عام
    مثال
    <?
    //هذا متغير عام
    $r= “salem”;
    function ala($s)
    {
    //هذا متغير محلى
    $s = “progrramer”;
    }
    echo $r ;
    ala($s);
    echo $s;
    ?>
    مثال :
    <?
    //هذا متغير عام
    $r= “salem”;
    function ala($s)
    {
    //هذا متغير محلى
    $s = “progrramer”;
    }
    echo $r ;
    $s=10;
    echo $s;
    ?>
    في المثال الأول استطعنا طباعة المتغير $r ولم نسطتع طباعة المتغير $s لأنه محلى (لايتم تنفيذه الا داخل الدالة ) وعندما نريد طباعته فإننا يجب أن نطبع ناتج الدالة لكي نحصل عليه (أي أننا لانستطيع طباعته بشكل مباشر )
    مثال :
    <?
    //هذا متغير عام
    $r = “salem”;
    function ala($s)
    {
    //هذا متغير محلى
    $s = “programmer”;
    }
    //استطعنا طباعته بشكل مباشر
    echo $r ;
    ala($s);
    //يجب استخدام الداله لكي يتم طباعته
    echo ala($s);
    ?>
    لاحظ أننا حتي لو قمنا بعملية طباعة المتغير من نفس الدالة فالناتج يكون مختلف لأن لكل متغير عالمه الخاص به
    لكي نقوم بجعل المتغير الذي بداخل الدالة متغيراً عاماً فيمكننا ذلك بإحدي الطريقيتن التاليتين :
    الطريقة الأولى :
    <?
    function ala($y)
    {
    echo $y. “<br>”;
    global $s;
    $s = "programmer";
    return ;
    }
    $f =10;
    ala($f);
    echo $s;
    ?>
    لاحظ أننا عندما استخدمنا global في داخل الدالة لكي يتم تعريف أن المتغير متغير عام وبعدما قمنا باستخدام الدالة قامت بطباعة المتغير المراد طباعته ومن ثم بعد ذلك قامت بتعريف متغير جديد ($s) وهذا المتغير متغير عام لأننا وضعنا قبله الكلمة global فاستطعنا طباعته بكل سهوله .


    الطريقة الثانيه : هي أن نستخدم المصفوفة $GLOBALS التي تستخدم في PHP لتعريف المتغيرات العامة أيضا
    مثال :
    <?
    function ala($y)
    {
    echo $y. “<br>”;
    $GLOBALS[“s”] ;
    $s = "programmer";
    return ;
    }
    $f =10;
    ala($f);
    echo $s;
    ?>

    المتغيرات المستقره (static variable)
    اقصد بالمتغيرات المستقرة هي التي تكون قيمتها ثابتة
    مثال :
    <?
    Function addfares($y)
    {
    $y;
    $y=$y+1 ;
    return $y;
    }
    echo addfares($y);
    echo addfares($y);
    echo addfares($y);
    echo addfares($y);
    ?>

    <?
    Function addfares($y)
    {
    static $y;
    $y=$y+1 ;
    return $y;
    }
    echo addfares($y);
    echo addfares($y);
    echo addfares($y);
    echo addfares($y);
    ?>
    لاحظ عندما عرفنا المتغير بأنه static فانه يحتفظ بقيمته حتي لو انتهت الدالة .







    دوال متداخلة
    يمكننا عمل تعشيش للدوال مثلما كنا نفعل مع بناء القرارات والتكرارات
    مثال :
    <?
    Function sum($sa)
    {
    $sa=$sa-1;
    function goadd ($r)
    {
    $r = $r+$r;
    return $r;
    }
    $sa= goadd ($sa);
    return $sa;
    }
    echo sum (15);
    ?>
    في مثالنا هذا لدينا دالتين الدالة الأولى هي sum والدالة الثانية هي goadd

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

    اشتمال الملفات (include files)
    قد يكون لديك في برنامجك متغير متكرر في أكثر من صفحة أو رسالة خطأ معينة أو تريد إدرج نص كبير الحجم في صفحات متعددة
    هنا يمكنك اشتمال ملفات في داخل ملفات الـPHP . هذه الملفات قد تحتوي على نصوص أو كود html أو كود PHP .

    إن الصيغة التي تستخدمها لاشتمال الملفات هي :
    Include (filename);

    مثال :

    قم بفتح ملف نصي واكتب فيه ماتشاء ثم احفظه باسم a.txt
    قم بانشاء ملف php واكتب فيه ومن ثم احفظه باسم b.php
    <?
    Include (“a.txt”);
    ?>
    انقلهما الى مجلد السيرفر .. شغل ملف الـ b.php وانظر النتيجة .
    يمكنك أن تقوم بإنشاء ملف PHP وتحتفظ فيه بجميع الـfunction المطلوبة لبرنامجك وعند إرادتك لاستخدام أي واحدة منها تقوم فقط باشتمال الملف ومن ثم استدعاءها .

    داله تلوين الكود
    هل رايت مواقع تقوم بتلوين الكود بشكل مذهل مثل موقع zend ؟.... الأمر بسيط كل ماعليك أولا
    قم بوضع الكود في ملف نصي وسمه باي اسم (مثلا file.txt ) وبعد ذلك قم باستخدام الدالة
    Show_source
    مثال :
    <?
    show_source ("file.txt");
    ?>

  5. #15

    افتراضي تتبع وتصيد ومنع الاخطاء

    تتبع وتصيد ومنع الاخطاء
    (avoiding and handling errors)
    إن مصطلح الـdebbug هو من المصطلحات الشائعة والشيقة في عالم البرمجة ، هذا المصطلح يشير إلى كيفية إصلاح أخطاء البرنامج وتوقعها قبل حدوثها ، هناك أنواع من الأخطاء تحدث بسبب المبرمج وهناك أنواع من الأخطاء تحصل بسبب المستخدم ، في العادة يجب أن يكون المبرمج متآلفاً مع مصطلح تتبع الأخطاء وإصلاحها .

    قد يكون من أهداف تتبع الأخطاء الحماية بقدر أهميه البرنامج الجاري العمل عليه أو الموقع فكلما كان الموقع مهماً كان وجوب حمايته أكبر .

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

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

    رسائل الخطا في الـPHP لها طريقتها وتقنيتها الخاصة التي تسير عليها فهي ليست مثل الجافا وليست مثل cgi
    فالـ PHP لا تقوم بإرسال الخطأ إلى السيرفر بل تقوم بكتابة رسالة خطأ في مكان الخطأ .

    قد يكون هناك أخطاء يصعب تتبعها أو معرفة مكانها في الأصل ، وقد يكون هذا بسبب أنك تستخدم الـPHP في صناعة موقع ديناميكي وتشرك معها الجافا سكربت وتضع علامات التعليق الخاصة التي تقوم بإخفاء الأخطاء في الجافا مما قد يجعلك تشعر بالحيره وتجن أين مكان الخطأ
    <!- -
    رساله الخطا
    - - >

    أنواع الأخطاء
    هناك أنواع من الأخطاء منها الإملائية (Syntax Error) ومنها المنطقية ومنها أخطاء تحدث في وقت التنفيذ

    ومثال الأخطاء الإملائية :
    <?
    Eco “1”;
    // من المفترض أن تكت التالي :
    Echo “1”;
    ?>
    هذا سيعطيك رسالة خطأ Parse error

    ومن الأخطاء الإملائية نسيان الفاصلة المنقوطة (semi-colon) في نهاية الدالة :
    <?
    Echo “hello”
    // من المفترض أن تكت التالي :
    Echo “hello”;
    ?>
    هنا سوف يعطيك الـPHP رسالة خطأ لكن العجيب أنه لن يعطيك إياها بشكل صحيح فرسالة الخطأ تشير إلى أن السطر الرابع يحتوي على الخطأ بينما الخطأ هو في السطر الثاني .

    وهناك خطأ آخر يحصل بسبب نسيان الـbrace ( وهي الاقواس ) :
    <? Php
    for ($loop = 0 ; $loop < 5 ; $loop ++ )
    {
    Echo “”;
    ?>
    اذا كنت قد نسيت إغلاق القوس فهذا من الأخطاء الشائعة ، والأخطاء الإملائية لايمكن حصرها ، إنها أشبه بقواعد اللغة ، لكن أكثر الأخطاء الإملائية الشائعة في برامج الـPHP

    1 – نسيان الأقواس . مثال :
    <?
    for ($loop = 0 ; $loop < 5 ; $loop ++ )
    {
    for ($loop1 = 0 ; $loop1 < 10 ; $loop1 ++ )
    {
    for ($loop = 0 ; $loop < 5 ; $loop ++ )
    {
    code ….
    }
    }
    في المثال السابق ينقصنا قوس إغلاق التكرار الأخير ( } )

    2 - نسيان الفاصلة المنقوطة . مثال :
    <?
    Echo 10
    <?

    3 - خطأ إملائي في اسم function . مثال :
    <?
    Htmlspecialchar($I);
    ?>
    سيعطيك رسالة خطأ :
    Fatal error : call to Undefined function : htmlspecialchar().
    وتصحيحها أن تكون :
    <?
    Htmlspecialchars($I);
    ?>

    4 - نسيان إغلاق النص . مثال :
    <?
    Echo “arabbuilder;
    ?>
    نسي الـ(")في نهاية الكلمة . وسيعطيك Parse error









    الأخطاء المنطقية (Logical Errors)
    إن الأخطاء المنطقية هي الأكثر صعوبة في التتتبع فقد تجد برنامجك يعمل بشكل صحيح وبكل سلامة ولكنه عند نقطة ما لايتم تنفيذها كما تريد أنت ، لنضرب مثلاً على خطأ منطقي بسيط جداً ، لنفرض أنك قمت بعمل نموذج مكون من مربع نص وزر ، عند ضغطك لهذا الزر فأنت تريد أن يتم كتابة كلمة كبير إذا كان الرقم أكبر من 30 وكلمة صغير إذا كان الرقم أصغر من 30 لنقم بكتابة الكود للمثال الأول :
    <?
    echo "ادخل عمرك :" ;
    echo '<br>
    <form method = "post" action = "age.php">
    <input type= "text" name = "age">
    <br>
    <input type= submit value = "هل أنا كبير أم صغير ؟" >
    </form>' ;
    ?>

    في ملف age.php اكتب الكود التالي :
    <?
    If ($age<30) echo “انت صغير”;
    If ($age>30) echo “انت كبير”;
    ?>
    سيعمل السيكريبت بشكل صحيح .. ولكن ربما تخطأ أنت في كتابة العلامات المنطقية ( التي باللون الأحمر ) فتأتي النتائج بشكا خاطئ .

    ومن الأخطاء المطنقية الأخطاء التي تقع في وقت التشغيل (Run times error) والتي تكون قد تقوم بإيقاف برنامجك بشكل كامل
    مثال :
    <?
    $t=0;
    $r=1;
    $f=$r/$t;
    ?>
    وعندها سينتج لك الرسالة التالية
    Warning : Division by zero in (path) on line (line number )

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

    اخطاء التكرارات
    قد يكون لديك أيضا تكرار فيه خطأ ولا يقوم بالتوقف نهائياً مثل هذا التكرار :
    $c=1;
    $t=true;
    while ($t=true)
    {
    $c++;
    }

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


    عدم ارجاع قيمه من function
    مثال :
    <?
    Function ($d)
    {
    $d =$d+$d;
    }
    الخطا هنا اننا لم نستخدم الـreturn لكي ننهي الدالة أو قد تكون الدالة تحتوي على أكثر من قيمة وننسي أن نقوم بتحديد القيمة النهائية للدالة

    الخلط في المعاملات الحسابية والمنطقية
    مثال :
    If ($y=10) echo 12 ;
    والمفترض أن تكون :
    If ($y= =10) echo 12 ;

    أفكار جيدة لتفادي الأخطاء
    التعليقات
    إن من الأفكار الجيدة للتقليل من الأماكن التي تبحث فيها عن الخطأ هو وضع تعليقات لوصف وظيفة دالة معينة . مثال :
    <?
    //هذه الكود يقوم بطباعة كلمة أحمد
    Echo “أحمد” ;
    ?>

    الدوال
    وأيضا من الأفكار الجيدة أن تقوم بتقسيم وظائف البرنامج على دوال بحيث أن لكل دالة وظيفتها المعينة :
    <?
    /*
    +- --------------------------------------------------------------+
    | هذه الداله تقوم بقسمه العدد علي 2 |
    +- --------------------------------------------------------------+
    * /
    function ($U)
    {
    $U=$U/2;
    return $U ;
    }
    ?>

    Regular Expressions
    هذه التقنية تساعدك على تفادي الأخطاء في صفحتك عند حدوثه مثل أن يقوم مستخدم ما بكتابة بريد الكتروني غير صحيح (مثال : a@y@.k.d) هذا البريد غير صحيح ولأجل أن تقوم بمنع حصول أي خطأ مثل ذلك وتقييد العبارات التي يدخلها المستخدم فإنك تقوم بإستخدام ال/RE (Regular Expressions) إنك بالأصح تجعل قواعد للكلمات التي يدخلها المستخدم فمثلاً تجعل المستخدم لايدخل سوي أرقام أو حروف فقط أو شكل معين من الكلمات ، تقوم أولاً بإنشاء نمط للكلمه التي تريد المستخدم أن يقوم بادخالها .






    النمط (pattren)
    ماهو النمط ؟ مارأيك إذا كتب المستخدم جملة في مربع نص تحتوي على عدة كلمات وتريد أن تتأكد من وجود كلمة معينة وسط هذه الجملة ، على حسب ما اخذناه من معلومات على المصفوفات سابقاً نستطيع فعل ذلك كالتالى :
    <?
    $words=”one, two, three, four, five,”;
    $ty =explode (“”,$ty);
    foreach ($ty as $w) {
    if ($w = = “six”) echo “found string ‘two’”;
    }
    ?>
    لقد كان المتغير $words يحتوي على جملة تتكون من عده كلمات وعندما أردنا فحصه قمنا باستخلاصه في مصفوفة ثم بعد ذلك قمنا بفحص المصفوفة باستخدام التكرار foreach ، ومع ذلك الذي فعلناه فإن هذا الاستخدام غير عملي بتاتاً وهنا تبرز قوه Regular Expressions لاحظ الآن كيف نستخرجه بواسطة الـ Regular Expressions :
    <?
    $words=”one, two, three, four, five,”;
    if (ereg(“one”,$words)) echo “لقد وجدت العدد ‘ one’ “ ;
    ?>
    في هذا المثال قمنا باستخدام الدالة (ereg) ووضعنا في خانتها الأولى النمط (pattern) الذي نريد أن نتأكد من وجوده (أوالكلمة المراد البحث عنها) ووضعنا في الخانة الثانية المتغير الذي سيتم البحث فيه عن الكلمة أو النمط .
    تقوم الدالة ereg بإعطاء القيمة true إذا تم العثور على الكلمة .
    في الواقع هناك استخدامات أكثر فعالية للأنماط .
    يمكننا مثلاً تخزين الكلمة إذا تم وجودها في مصفوفة خاصة كالتالى :
    <?
    $words=”one, two, one, four, five,”;
    if (ereg(“one”,$words,$rok)) ;
    echo $rok[0];
    echo $rok[1];
    ?>
    نقوم بوضع اسم المصفوفة التي نريد تخزين البيانات في الخانة الثالثة .. لاحظ مع أنه يوجد كلمتين في الجملة توافق النمط إلا انه أعطانا كلمة واحدة فقط إذ أن وظيفته أن يتأكد من وجود النمط في الجملة فقط فإذا تأكد من وجودها مرة واحدة استكفى واعتبر الموضوع قد انتهي .

    ماذا لو أردنا من التأكد من عدة كلمات ، عند ذلك فإننا نفعل التالى :
    <?
    $words=”one, two, one, four, five,”;
    if (ereg(“one”,$words,$rok)) echo $rok[0];
    if (ereg(“two”,$words,$rok)) echo $rok[0];
    ?>
    واريد أن أنبهك أن الـereg يقوم بإنشاء المصفوفة من جديد عند كل استعمال له فخذ حذرك من هذه النقط
    أيضا فإن الـereg حساس لحالة الأحرف لاحظ هذا المثال :
    <?
    $words="one, two, vcx, four, five,";
    if (ereg("One",$words,$rok)) echo $rok[0];
    ?>

    لن يقوم بإخراج أي شي فقط لأن حرف الـO مختلف .



    أيضا يمكنك البحث عن كلمة يسبقها فراغ مثلاً كالتالى :
    <?
    $words="one, two, vcxone, four, five,";
    if (ereg("one",$words,$rok)) echo $rok[0];
    ?>
    مثال آخر :
    <?
    $words="oned, two, vcxone, four, five,";
    if (ereg("one",$words,$rok)) echo $rok[0];
    ?>

  6. #16

    افتراضي تابع تتبع وتصيد ومنع الاخطاء

    لاحظ في هذين المثالين أنه مع أن كلمة one غير موجودة بمفردها إنما موجودة كجزء من vcxone و oned ورغم ذلك فإن الدالة لم تأخذ اعتبارا لذلك بينما لو كتبنا كالتالى :
    <?
    $words="oned, two, vcxone, four, five,";
    if (ereg(" one",$words,$rok)) echo $rok[0];
    ?>
    فإنه سيبحث عن الكلمة مفصولة عن أي حرف ولن يجد كلمة كذلك فلن يقوم بكتابة أي شي .

    يمكننا أن نفحص قيمة موجودة في متغير كالتالى :
    <?
    $reu = "one";
    $words="one, two, vcxone, four, five,";
    if (ereg($reu,$words,$rok)) echo $rok[0];
    ?>
    هل لاحظت أننا فحصنا قيمة المتغير $rue بواسطة ereg مع $word ولم يتطلب منا ذلك أي شي إضافي غير اسم المتغير المراد البحث عن قيمته في الجمله .

    يمكننا بالـ Regular Expression استعمال بعض الأحرف بشكل خاص التي لها استعمالها الخاص بواسطة الـ Regular Expressions

    الأحرف الخاصة في الـ Regular Expression هي كالتالى :
    . * ? + [ ] ( ) { } ^ $ | \
    هذه الأحرف لها معناها الخاص في الـ Regular Expression

    فقديماً مثلاً كنا نقول أنه لا يمكننا أن نستخدم علامتي تنصيص متداخلة من نفس النوع كالتالى :
    <?
    $r=”u\””;
    ?>
    ولكي يتجاهل الـPHP هذا المعني فإننا نقوم بوضع (\) قبل علامة التنصيص .
    ايضا مع الـ ereg فإن للـ(.) قداستها ولكي يتم تجاهلها فإننا نستخدم الـ(\)

    تقوم الـ(.) بأخذ مكان حرف أو فراغ فمثلاً لاحظ المثال التالى :
    <?
    $P="I love yamen";
    if (ereg ("love....",$P,$R)) echo $R[0];
    ?>
    هل لاحظت الناتج ؟؟





    ولكي يتم تجاهل قداسة الـ(.) في الـ Regular Expressions نقوم بوضع (\) قبلها . مثال :
    <?
    $P="I love yamen";
    if (ereg ("love\.\.\.\.",$P,$R)) echo $R[0];
    ?>
    في هذا المثال لن يتم طباعة أي شي لأنه لايوجد أي كلمة تطابق (love....) لأن الـ(.) فقدت قداستها وبدأ التدقيق في الكلمة حرفاً حرفاً .

    صناعة فئة حروف [xyz]
    أقصد بذلك أنني احدد نطاق معين من الكلمة من الممكن أن يكون في هذا النطاق أي حروف من الفئة التي أقوم بتحديدها أو الحروف التي أقوم بتحديدها .
    مثال :
    <?
    $y=”how are you ? “ ;
    if (ereg(“h[oe]” , $y)) echo “true”;
    ?>
    هنا قام الـregular expression بالبحث عن أي كلمة تبدأ بالحرف h ومن ثم يتبعها أحد الحرفين o أو e مثال هذه الكلمات :
    Hey – He – Hew - Homer
    ولكنها لاتطابق :
    Hty – Hnt - Hlay
    أتمني أن تكون فهمت ما أرمي إليه

    يمكننا أيضا أن نقوم بإخبار الـregular expression بأن لا يقوم باختيار كلمات تحتوي على حروف معينة وذلك فقط بإضافة ^
    <?
    $y=”how are you ? “ ;
    if (ereg(“h[^oe]” , $y)) echo “true”;
    ?>
    نقوم هنا بإخبار الـre بأن يقوم بفحص الجملة فإذا وجد أي كلمة تبدأ بـh ولاتحتوي على o أو e فإنه يقوم بإعطاء true وإذا لم يجد يقوم باعطاء false
    وهذا الكلام يطابق الكلمات التالية :
    Hay - Hana - Hkg
    ولايوافق هذه الكلمات :
    Home – Hore - Here

    يمكننا استعمال اختصارات لبعض الأمور فمثلاً إذا كنا نريد كلمة لاتحتوي على أي رقم كنا سنكتب كالتالى
    [^123456789]
    يمكننا أن نستعمل اختصار لهذا الموضوع كالتالى :
    [^0-9]
    وحتي إذا أردنا أن يتأكد من وجود رقم من واحد الى تسعه فقط علينا مسح الـ^
    [0-9]
    وأيضا الحروف الصغيرة من a الى z
    [a-z]
    وإذا نريد التأكد من عدم وجودها
    [^a-z]
    نفس القصة مع الحروف الكبيرة .





    هناك اختصارات اخري لهذا الموضوع كالتالى :

    الاختصار المطابق له معناه ووظيفته
    \d [0-9] أي رقم من 0 الى 9
    \D [^0-9] ممنوع الأرقام من 0 الى 9
    \w [0-9A-Za-z_] أي رقم من 1-9 أو حروف A-Z او احرف صغيره او_
    \W [^0-9A-Za-z_] عكس السابق
    \s [\t\n\r] يقبل مسافة أو سطر جديد أو علامة جدولة (tab)
    \S [^\t\n\r] عكس السابق

    تحديد مكان الكلمة
    يمكننا أن نقوم بتحديد مكان الكلمة ، اقصد بذلك أنه يمكنك تحديد مكان الكلمة إذا كانت في بداية أو نهاية النص ونستخد لهذا الأمر العلامتين (^)لتحديد المكان لبداية الجملة و ($) لنهاية الجمل .
    مثال :
    <?
    $y="how are you ? " ;
    if (ereg("^h",$y)) echo "true";
    ?>
    هنا سيقوم الـphp بالبحث عن في الحملة فإذا وجد الجملة تبدا بحرف h كانت قيمة الـereg تساوي true وإذا لم يجد كانت قيمة الـereg تساوي false
    <?
    $y="how gone?" ;
    if (ereg("^g",$y)) echo "true";
    ?>
    في هذا المثال ستكون قيمة الـereg خطأ لأن العبارة لاتبدأ بحرفg
    يمكننا فعل العكس بواسطة العلامه ($) التي عملها عكس (^) فهي تفحص إذا كان الحرف المراد فحصه موجود في نهاية الجملة
    مثال :
    <?
    $y="how g" ;
    if (ereg("g$",$y)) echo "true";
    ?>

    يمكننا أيضا اختيار إذا ما كان واحد من نمطين صحيحاً بواسط العلامة ( | )
    <?
    $y="how g" ;
    if (ereg("^y | g$",$y)) echo "true";
    ?>
    في هذا المثال سيقوم الـPHP بفحص الجملة فإذا وافقت أحد النمطين كانت قيمة الـereg عند ذلك true .

    يمكننا أيضا تحديد إذا ما كان حرف أو جملة متكررة بعدد من المرات أو مره واحدة باستخدام أحد هذه الثلاث رموز ( * ، + ، ? )
    تقوم علامه الضرب بالتحقق من أن الحرف الذي يسبقها مكرر مرة أو أكثر أو غير موجود بتاتاً
    مثال :
    Bea*t
    وتوافق :
    Bet
    Beat
    Beaat
    تقوم علامة الجمع (+) بالتأكد من وجود عنصر مرة أو أكثر :
    Bea+t
    وتوافق :
    Beat
    Beaat
    Beaaaaat
    أما علامة الاستفهام فتقوم بالتأكد من وجود عنصر مرة واحده أو عدم وجوده بتاتاً :
    Bea?t
    وتوافق :
    Bet
    Beat
    وتأكد دائماً أن هذه الثلاث علامات مسبوقه بحرف .

    وعند إرادتك مثلاً التأكد من سبق حرفين أو ثلاث بشكل تحديدي يمكنك استخدام القوسين
    مثال :
    (wo)?man
    ويوافق :
    man
    woman

    يمكننا التأكد من تكرر حرف بشكل معين من المرات أو أكبر من عدد معين من المرات أو أصغر من عدد معين من المرات باستخدام القوسين {x,y}
    فمثلاً لو أردنا أن نتأكد من أن حرف (d) مكرر مرتين إلى أربع مرات :
    d{2,4}
    أما إذا أردنا أن نتأكد من أنه مكرر أكثر من مرتين إلى عدد غير محدود من المرات :
    d{2,}
    أما إذا أردناه أن يتكرر 4 مرات على الأكثر :
    d{,4}
    أو إذا اردناه أن يتكرر بعدد محدود من المرات :
    d{8}

    أخيراً نريد أن نلفت النظر إلى الاختصار (\b) الذي معناه أي شي ولكن ليس حرفاً (الحروف التي بين \w وبين \W تقريباً )



















    ملخص ما أخذناه من القواعد تجدونه في الجدول التالى :

    القاعده المعني
    [abc] أي حرف كان a او b او c
    [^abc] أي حرف غير a و b و c
    [a-z] كل الحروف من a الى z
    \d\D \d للارقام و \D لغير الارقام
    \w\W \w للحروف جميعها و\W لغير الحروف
    \s\S \s للفراغ (space) و\S لغير الفراغ (no space)
    \b الحروف التي بين \w و\W
    . أي حرف
    (abc) تقوم باعتبار abc كمجموعه ..
    ؟ حرف او مجموعة حروف مكرره مره اوغير مكرره نهائيا
    + حرف او مجموعة حروف تتكرر مره او اكثر
    * حرف او مجموعة حروف تتكرر مره او اكثر او قد لاتتكرر نهائيا
    {x,y} تكرير بعدد معين من المرات ..
    {,y} تكرير بحد اقصي من المرات ..
    {x,} تكرير بحد ادني من المرات ...
    {x} تكرير بعدد معين من المرات
    ^ في بدايه النص
    $ في نهايه النص

    تعبير للتاكد من ايميل
    ^[_a-zA-Z0-9-]+(\.[_A-Za-z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*$
    شرح التعبير
    الرمز الشرح
    ^ يجب ان يبدا النص
    [_A-Za-z0-9-] أي حرف من a-z كبيرا كان او صغيرا او _او ارقام
    + وقد يكون هذا الحرف متكررا اكثر من مره
    (\.[_A-Za-z0-9-]+) بالاضافه الى انه قد يتبع النقطه وحروف وارقام
    * وقد لايتبعه اوقد يتبعه ويتكرر اكثر من مره
    @ وبعد ذلك يكون لديه حرف ال@
    [a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*$ وايضا نفس القواعد في النهايه





    مثال :
    <?
    Function mailcheck($mail,$t)
    {
    $T="^[_a-zA-Z0-9-]+(\.[_A-Za-z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*$";
    If (EREG($T,$mail))
    {
    $r="the mail is true";
    echo $r;
    }
    else
    {
    $r="the mail is not true";
    echo $r;
    }
    return ;
    }
    mailcheck("alfareees@hotmail.com",$t);
    ?>

    eregi()
    الفرق بين هذه الدالة والدالة ereg أنه غير حساسة لحالة الأحرف كبيرة أو صغيرة أي أنه يمكننا كتابة المثال السابق كالتالى :
    <?
    Function mailcheck($mail,$t)
    {
    $T="^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$";
    If (EREG($T,$mail))
    {
    $r="the mail is true";
    echo $r;
    }
    else
    {
    $r="the mail is not true";
    echo $r;
    }
    return ;
    }
    mailcheck("alfareees@hotmail.com",$t);
    ?>

    ereg_replace()
    ماذا لو أردت تحرير عبارة ما من أحرف معينة وقد تكون متكررة في جملة أوغير ذلك
    لنفرض أن لدينا العبارة التالية :
    Mohmed love his game …….
    ونريد أن نتخلص من النقاط التي في نهاية العبارة
    أو لدينا مثلاً هذا المسار :
    C:\windows\desktop
    ونريد أن نستبدل العلامة (\) بـ (/)


    كل ذلك ممكن بواسطة الدالة ereg_replace وقواعد الـrgular expression التي أخذناها سابقاً
    البنية التي نستخدمها للدالة كالتالى :
    Ereg_replace(reg,string,var);
    نضع في مكان reg القاعدة للـ regular expression ونضع مكان الـstring الحرف الجديد ونضع بدلاً من الـvar المتغير الذي نريد استخلاص الحروف منه .
    مثال :
    <?
    $path =" C:\windows\desktop";
    $tell= "Mohmed love his game .....";
    $newpath= Ereg_replace("[\.]","/",$path);
    $newtell= Ereg_replace("\.","",$tell);
    echo $newpath;
    echo "<br><br>";
    echo $newtell;
    ?>

    أساليب أخري لتتبع الأخطاء
    استخدام عباره echo
    هو من أقدم الاساليب وكان يستخدم مثلاً في فحص بعض متغيرات نموذج فمثلاً أنت لديك نموذج يقوم بإرسال معلومات إلى النموذج وقد تستخدم في اختبار الأخطاء المنطقية التي يستصعب متابعتها في الكود
    مثال :
    <?
    Echo “this is : $name”;
    Echo “<br>”;
    Echo “this is : $Email”;
    //كود يقوم بمعالجة معلومات المتغيرين
    //طباعة المتغيرين بعد اداء عملية المعالجة ورؤية النتائج
    Echo “this is after : $name”;
    Echo “<br>”;
    Echo “this is after: $Email”;
    ?>

    فحص كود الـhtml
    قد تستخدم كود جافا سكربت ويتم إخفاء الأخطاء وسط علامات التعليقات فعليك حينئذ فحص كود الـhtml لرؤية إن كان هناك بعض الأخطاء المخفية أم لا .

    تجاهل الأخطاء
    لنفترض أنك تعلم أن الدالة التي صنعتها بها أخطاء ولكنك تريد تجاهل هذه الأخطاء فكل ماعليك أن تقوم بوضع @ أمام الدالة لكي يتم تجاهل الخطأ عند حدوثه .
    مثلاً نحن نعلم أن القسمة على الصفر من الأشياء الغير مقبولة في الـPHP وأنت صنعت دالة تقوم بالقسمة على صفر ولن يتم تنفيذها لأنها بالأصل خطأ ولكنك تريد أن يقوم PHP بتجاهلها فكل ما عليك أن تفعله هو وضع @ أمام الدالة .
    مثال :
    <?
    function amail ($y)
    {
    $y=$y/0;
    return $y;
    }
    $s= @amail(44);
    echo $s;
    ?>

  7. #17

    افتراضي التعامل مع العميل

    التعامل مع العميل
    كما رأينا في الدروس السابقة ، فإن الـPHP يوفر رقم عظيم من المميزات عن الـhtml لبناء مواقع الويب ، من الأشياء الأساسيه التي لم نتكلم عنها حتي الآن هي الموثوقية (أو الاستقرار ) وهو بالمعني الصحيح والصريح :

    القابيلة على الاحتفاظ بالمعلومات بين صفحتين منفردتين أو مختلفيتن في المستعرض ...

    بدون أي إضافات ، HTTP لايوفر أي ميكانيكيه للحفاظ على البيانات وجعلها مستقرة لمعالجة تتم بين صفحتين ، كل طلب لصفحة في الانترنت (request) ليس له أي علاقة بأي طلب آخر ... مثلاً عندما تتطلب موقع المطور العربي ومن ثم منتدي المطور العربي فان كل الطلبين ليس لهما علاقه ببعضهما ...

    بمصطلح آخر يمكننا أن نقول أن الـHTTP فاقدة لحالتها (stateless) أي أنها لاتعرف أي أن أمر طلب الصفحة ينتهي عند انتهاء الطلب ، فهي عندما تقوم بنقل بيانات صفحة من السيرفر الى المستخدم فهي تعرف من هو المستخدم الذي يطلب البيانات وعلى أي نافذه سيتم نقل البيانات وعند انتهاء ذلك فان كل هذا الموضوع ينتهي وإذا عاد المستخدم فطلب صفحة أخري فإنها لاتعرف إن كان هو نفس المستخدم أو لا !


    إن القدرة على الحفاظ على وجود البيانات ليست وسيلة أو ميزة او قوة مقتصرة على الـPHP فقط .

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

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

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

    1 - الـHTTP والـ html ومحدودية قدراتهم ، وكيف يستطيع الـPHP التغلب علي القصور فيهم .
    2 - الاحتفاظ بالمعلومات التي نريد أن نستخدمها بين طلب لصفحتين مختلفيتن .
    3 - مكنكة الحفاظ على البيانات .
    4 - الكعكات (cookies) وكيفية استخدامها .
    5 - PHP4 والـ native session – المكنكة الداخلية للحفاظ على وجودية البيانات .

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

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









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

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

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

    في الواقع هذا مايسمونه بالمحافظة على الجلسة (maintain session) وأقصد بذلك دخول المستخدم إلى صفحة وانتقاله من صفحة إلى صفحة مع المحافظة على معلوماته وغير ذلك من البيانات ، لكي نستطيع متابعته أولاً بأول .

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

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

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

    افتح محرر نصوص لديك واكتب الكود التالي :
    <p dir="rtl" align="center">ادخل اسمك الكريم </p>
    <form method="POST" action="quiz2.php">
    <hr>
    <input type="text" name="name" size="20"><br>
    <input type="submit" value="إرسال" ></p>
    </form>
    احفظها باسم quiz.php

    قم بفتح محرر النصوص واكتب الكود التالي :
    <html dir ="rtl">
    <?
    If (isset($name)) {
    Echo "مرحبا بك يا" . $name ;
    Echo '
    <br>
    <form method="POST" action="quiz3.php" dir="rtl">
    <input type="hidden" name = "thename" value = "’.$name.’">"
    من هو أول الخلفاء الراشدين ؟ </p>
    <p dir="rtl"><input type="radio" value="أبوبكر الصديق" name="khlifa">أبوبكر
    الصديق .</p>
    <p dir="rtl"><input type="radio" value="عمر بن الخطاب" checked name="khlifa">عمر
    بن الخطاب</p>
    <p dir="rtl">من هو الفاروق ؟</p>
    <p dir="rtl"><input type="radio" name="faroq" value="عمر بن الخطاب">عمر بن
    الخطاب</p>
    <p dir="rtl"><input type="radio" name="faroq" value="سالم" checked>سالم بن
    عامر</p>
    <input type ="submit" value = "إرسال" dir="rtl">
    </form>' ;
    }
    else
    {
    echo "غير مصرح لك بدخول هذه الصفحة" ;
    }
    ?>
    احفظها باسم quiz2.php

    قم بفتح المفكرة واكتب الكود التالي :
    <?
    If ((isset($thename)) && (isset($khlifa)) && (isset($faroq)))
    {
    echo 'لقد انتهت المسابقه يا '. $thename ;
    $range=0;
    $co = 0;
    if ($khlifa =="أبوبكر الصديق") {
    $range=$range+10;
    $co = $co +1;
    }
    if ($faroq =="عمر بن الخطاب")
    {
    $range=$range+10;
    $co=$co+1;
    }
    if ( $range < 10)
    {
    echo "ليس هناك أي إجابة صحيحة";
    }
    else
    {
    echo "<br>"."عدد الاسئلة التي أجبت عليها =" . $co ;
    echo "<br>" . "الدرجة التي حصلت عليها " . $range ;
    }
    }
    ?>
    قم بوضع الملفات الثلاثه السابقه في مجلد السيرفر ثم قم بتشغيلها

    الشرح
    قمت في هذا المثال بمحاولة صنع مكنكة تواصل للبيانات ، بمعني أنني أحاول أن أقوم بالاختفاظ بالبيانات عبر الثلاث صفحات بشكل متواصل ، لاحظ أنني كنت اختبر في quiz2 و quiz3 باختبار المتغيرات قبل طباعة أي شي فقد يقوم المستخدم مثلاً بالاحتفاظ بالصفحة التي وصل إليها في المفضلة ثم يقوم باكمال المسابقة في وقت آخر ولكني لا اريد ذلك بل أريد ان أجعل وقتها محدوداً (طبعاً هذا الكلام سيحصل إذا كانت المسابقة طويلة) لذلك فإنني في كل عند الانتقال من صفحة إلى صفحة اقوم باختبار إن كانت جميع هذه القيم موجودة ولاحظ أنني كنت اجتفظ دوماً بقيم المتغيرات في متغيرات جديدة في حقول مخفية وكلما كان عدد المعلومات أكبر في كل مره كان عدد الحقول المخفية أكثر ، إن لهذه الطريقة أيضا مشاكلها فقد يفتح المستخدم كود الـhtml ويقوم بتفحص كيفية ملاحقته عبر المسابقة وقد يصنع هو الكود في وقت لاحق لكي يستطيع اكمال المسابقة بهذه الخدعة الماكرة ... لذلك يفضل أن لا تقوم بذلك وتقوم بجعل المسألة السابقة اكثر تعقيداً باستخدام الـregular expression بمحاولة تلغيم البيانات بواسطته ومن ثم فك هذا التلغيم في الصفحات التي تصل اليها البيانات .

  8. #18

    افتراضي تابع التعامل مع العميل

    ارسال بيانات بواسطة query strings
    نستطيع ارسال بيانات بسيطة بواسطة الاستعلامات التي نقوم بإضافتها الى اسم الصفحة في الأعلى متبوعة بـ(؟) علامة استفهام ثم اسم متغير وقيمته وإذا كان هناك أكثر من متغير يتم الربط بينهم بعلامة & وراجع درس النماذج لمزيد من المعلومات .

    قم بعمل صفحة وسمها ask.php وقم بكتابة الكود التالى فيها :

    <?
    If (isset($ask)) {
    If ($ask == login) {
    Echo "تم تسجيل الدخول إلى الصفحة";
    }
    }
    if (!isset($ask)) {
    echo "لم يتم تسجيل الدخول إلى الصفحة" . “<br>”;
    Echo "<A HREF=$PHP_SELF?ask=login>اضغط هنا ليتم تسجيل دخولك </a><br>";
    }
    ?>
    قم بتجربة هذا المثال على موقع يدعم PHP على نظام تشغيل لينوكس إذا لم يعمل بشكل جيد على الوندوز

    لاحظ أننا في أول الولوج الى الصفحة لم نستخدم أي استعلامات وعند الضغط على الرابط قام الرابط بارسال قيمه المتغير الذي يقوم الPHP باختبارها فاذا وجد انه قد تم ارسالها (بواسطه الرابط الذي تم الضغط عليه) قام بطباعة (تم تسجيل الدخول) واذا لم يجدها قام بطباعة (لم يتم تسجيل الدخول ) بالإضافة إلى طباعة الرابط الذي يحتوي على المتغير في طياته

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

    1 - جعل لكل مستخدم الألوان الخاصة التي يري فيها صفحتك ( أي أن تجعل للمستخدم مثلاً إعدادات الألوان الخاصة لرؤية موقعك ) .
    2 - جعل مفتاح للمستخدم لكي يستطيع به التحكم في بياناته الخاصة عند زياراته لموقعك في مرات اخري.

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


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

    الكوكيز عباره عن تقنية للتخزين من جهة العميل (client-side storage) تتخزن في ملفات في جهاز العميل

    يتم العبور إلى هذه الكوكيز ومسحها من المكان التي ارسلت منه .

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

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

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

    يقوم السيرفر بإرسال الكوكيز عبر الـHTTP Headers الذي يتم إرساله قبل أي مخرج من مخرجات الـhtml
    والمستعرض أيضا يقوم بإرسال الكوكيز عبر الـHTTP Header بالإضافه إلى أن المستعرض يتعرف على من سيقوم بإرسال الكوكيز فلو كانت الكوكيز مثلاً مرسلة من قبل الموقع www.php.net فإنه لن يقوم بإرسالها إلى موقع www.phpbuilder.com .

    باستطاعتك عند إنشاء الكوكيز تحديد مسار يتم ارسال الكوكيز لكي يتم اقتصار عملية العبور إلى الكوكيز إلى أماكن معينة .
    قبل أن نقوم بوضع كود بسيط سنقوم الآن بتعريف كيفية تخزين الكوكيز وكيفية قراءتها :
    كون الـPHP لغة حديثه لعمل سكربتات ويب فإنها تأتي بدعم كامل للكوكيز بواسطة الدالة setcookie() باستثناء أنك عند استعمالها يجب استعمالها قبل طباعة أي مخرجات html .

    تاخذ الدالة setcookie() ثلاث معاملات ، الثلاثة الأولى هي الأهم والأمثل استخداماً وهي بالترتيب :

     قيمة حرفية يتم تخزينها كاسم للمتغير
     قيمة حرفية يتم تخزينها كقيمة لذلك المتغير
     Unix timestamp الذي يقوم بالإشارة إلى تاريخ إنتهاء الكوكيز
    Unix timestamp عبارة عن رقم صحيح لا يحتوي على فواصل عشرية يقوم بحساب الثواني من منتصف ليلة 01/01/1970 . وإذا كنا نريد مثلاً أن نقوم بمسح الكوكيز بعد ساعة من تخزينه فإننا نقوم باستعمال الدالة time() التي تقوم بحساب الـtimestamp ثم نضيف عليه الوقت الذي نريده وفي حالتنا الساعه تساوي 3600 ثانية وعلى ذلك سنقوم بإضافة ناتج الدالة time على 3600 لكي يتم مسح الكوكيز بعد ساعة واحدة !

    الثلاث العوامل الأخري التي يتم ستخدامها أيضا في الكوكيز ولكنها نادرة الاستخدام ولن نناقشها في موضوعنا هذا هي :
     المسار الذي يتم إرسال الكوكيز إليه فلو تم فتح نفس الصفحة من نفس الموقع ولكن من مسار اخر ( مثلاً المسار كان pag\url\one وتم تغييره إلى page\url\two فان المستعرض لن يقوم بارسال البيانات إلي الصفحة لأنه تم تحديد المسار الذي سيتم ارسال الكوكيز اليه )
     الدومين الذي سيتم إرسال البيانات إليه وهو مفيد في حالة ما إذا كان هناك أكثر من دومين تريد ارسال الكوكيز اليه
     متغير من نوع integer يتم الإشارة إليه بـ secure يتم في حالة استخدام عمليات تشفير بالـ SSL

    العبور الى الكوكيز بسيط جداً فالمتغير الذي يتم ارساله يتم تخزينه ضمن المتغيرات العامة (global) وعندئذ فإنه لو كان لدينا كوكيز اسمه ahmed فإن قيمته توضع مباشرة في متغير اسمه $ahmed !!

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

    إما أن نقوم بإخبار السيرفر بوقت قديم :
    <?
    Set cookie (“ahmed” , “0”, time()-999);
    ?>

    وإما القيام بمسح الكوكيز بكتابة اسمه فقط :
    <?
    Setcookie (“ahmed”);
    ?>

    مثال لتخزين وقراءة كوكيز
    قم بفتح المفكرة واكتب الكود التالي :
    <?
    If ($thename) setcookie ("rname", $thename, time()+3600);
    Echo '<form method="post">
    <input type ="text" name="thename">
    <input type="submit" value="تسجيل">
    </form>';
    echo "قيمه المتغير الذي لديك". " ". $thename ."<br><br>";
    echo "قيمة الكوكيز =" . $rname ;
    ?>

    الشرح
    عند تشغيل الصفحه لاول مره
    عند تشغيلك للصفحة سيتم اختبار ما إذا كان هناك متغير بالاسم $thename فإذا تم الحصول عليه فسيتم وضع قيمته في كوكيز باسم (rname) (وطبعا لن يتم الحصول عليه في أول مرة لأننا لم نقم بارسال أي بيناات بعد) وبعد ذلك طباعة نموذج من مربع نص واحد وزر لإرسال المعلومات .
    ويتم طباعة قيمة المتغير إذا كان هناك أي متغير تم ارساله باسم $thename ويتم فحص قيمة الكوكيز $rname وطباعتها وبالطبع لا يوجد حتي الآن أي كوكيز .
    المرحلة الثانية
    الآن قم بكتابة أي شي في مربع النص (اكتب اسمك مثلاً) ثم قم بضغط زر الارسال سيتم ارسال البيانات الى نفس الصفحة ولكن هذه المرة سيتم تسجيل قيمة المتغير الذي يحمل البيانات في الكوكيز (rname) وبعد ذلك سيتم طباعة النموذج بشكل عادي وسيتم طباعة قيمة المتغير $thename ولكن لن يتم طباعة قيمة المتغير $rname لأننا فقط قمنا بتسجيله ولم يتم ارساله عند طلب الصفحة (لأننا نعرف أنه يتم ارسال الكوكيز عند طلب الصفحة وهذه المرة عندما طلبنا الصفحة لم يكن الكوكيز موجوداً بالأصل فلم يرسله السيرفر وقمنا نحن بتسجيله استعداداً للمرحلة القادمة ) .
    المرحلة الثالثة
    في هذه المرة سيكون الكوكيز موجوداً فسيتم ارساله على هيئة متغير ويتم ارساله ومن ثم طباعة النموذج وقيمه المتغير $thename وقيمة الكوكيز الذي يوجد بجهازك !

  9. #19

    افتراضي بدايتك الى الـsession

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

    قبل أن أتكلم عن كيفية استخدام الـSession وإعطاء بعض الأمثلة البسيطة ، سأقوم بالتكلم عن كيفية إعداد الـsession مع الـPHP .

    اعدادات الـsession في الـPHP
    لكي تستطيع التعامل مع الـsession بشكل جيد يجب عليك أن تتعرف على بعض الإعدادات التي في ملف الـphp.ini
    عندما تفتح الملف ستجد قسماً خاصاً فيه بالـsession هناك حوالى 19 إعداد ولكن لن نتطرق إليها كلها بل سنتكلم عن الأساسية والمهمة منها فقط كبداية لنا للتعرف على الـsession وكيفية عمله .

    اعداد طريقة التخزين
    session.save_handler (files | mm | user)

    ستجد هذه العبارة مكتوبة في الملف كالتالى بشكل افتراضي :
    session.save_handler = files
    وهذا الإعداد يقوم بتحديد طريقة التخزين للـsession وهناك ثلاث حالات للتخزين :

    1 - التخزين في ملفات عادية على السيرفر :
    session.save_handler = files
    2 - التخزين على ذاكرة السيرفر :
    session.save_handler = mm
    3 - التخزين بطريقة أخري معرفة ومعينة من قبل المستخدم مثل التخزين في قواعد البيانات وهذا ما سوف نقوم بالتفصيل عنه بعد الكلام عن قواعد البيانات :
    session.save_handler = user
    يجب أن تأخذ في اعتبارك عدد الملفات التي سيقوم الـsession بتخزينها عند استخدامك للأعداد الأول والإفتراضي خاصة عندما يكون عدد الزوار بالمئات أو الآلاف .

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

    الطريقة الثالثة قد تكون أكثر الطرق مرونة ، ولكنها معقدة وصعبة جداً ، وهي تعطيك مرونة لتخزين البيانات في أي وسائط مدعومة من قبل الـPHP مثل قواعد بيانات mysql و oracle .

    الذي افترضه الآن أنك قمت بوضع قيمة هذه الخاصية إلى files







    إعداد مكان التخزين
    session.save_path (path/to/directory)
    هذه الخاصية مفيدة إذا كنت قد ضبط الإعداد السابق إلى files
    تقوم هذه الخاصية بتحديد مكان التخزين على السيرفر ومن الأفضل أن تقوم بتحديد مكان التخزين بعيداً عن مجلد السيرفر لكي تمنع تصفح هذه الملفات .

    الإنشاء التلقائي للـsession
    session.auto_start (0 | 1)
    هذا الإعداد يقوم بتحديد إذا ما كان الـsession سيتم إنشاؤه تلقائياً عند كل زيارة للموقع أو لأي صفحة من صفحاته بدون إدراج كود الـsession في كل صفحة ... وعلى ذلك فإنك تقوم بوضع القيمة إلى (1) إذا أردت ذلك .
    وعلى إفتراض أنك لا تحتاج إلى أن تجعل الـPHP يقوم بعمل session لكل صفحة تلقائياً ومن غير طلب فستقوم بوضع قيمة هذا الإعداد الى (0)


    الـSID
    عندما يقوم الزائر بزيارة صفحتك فإن الـsession يستطيع تتبع هذا الزائر وعدد المرات التي قام فيه الزائر بالدخول لليوم الواحد ، يقوم الـPHP بعمل SID (session identefier) أو رقم معرف تلقائي بشكل افتراضي عندما تقوم بطلب إنشاء session بالزائر ، وكل رقم معرف يختلف عن الآخر تماماً ، إن رقم المعرف الذي ينشئه الـPHP شبيه للشكل التالى :

    fc94ad8b1ee49ef79c713ee98ac1fcc4
    هناك طريقتين يستطيع بها الـPHP متابعة الـSID للمستخدم :
    1 - عن طريق المتابعة والتخزين بتسلسل في الكوكيز .
    2 - عن طريق اتباع رقم المعرف بعنوان الصفحة في الانترنت .

    سنأخذ أمثلة عن كلا الطريقتين :

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

    هناك بعض الإعدادات البسيطة في ملف php.ini التي يجب معرفة معلومات عنها قبل البدء باستخدام الـsession مع الكوكيز :
    session.use_cookies (0 | 1)
    هذه الخاصية تحدد ماذا كان يمكنك استخدام الكوكيز مع الـsession أو لا وعند وضع القيمة (0) فهذا يمنعك من استخدام الكوكيز مع الـ(session) وأما اذا كانت قيمته (1) فهذا يسمح باستخدام الكوكيز مع الـsession

    session.name (Default: PHPSESSID)
    هذا الإعداد يقوم بتحديد اسم الكوكيز الذي سيحتفظ برقم المعرف (SID) والإعداد الافتراضي هو PHPSESSID ولن اقوم بتغيير هذا الإعداد لكي تستطيع فهم المثال الذي سأطرحه بعد قليل

    session.cookie_lifetime (Default: 0)
    يقوم هذا الإعداد بتحديد المدة التي سيبقي فيها الكوكيز الذي يحتفظ بقيمة الـ(SID) والإعداد الافتراضي هو صفر ، أي أنه سيتم مسح الكوكيز تلقائياً بعد اغلاق المستخدم لنافذة المتصفح مباشرة

    session.cookie_path (Default: /)
    يقوم هذا الإعداد بتحديد مسار دومين يتم تخزين الكوكيز له .. لا تقم بتغيير قيمته ودعه كما هو




    session.cookie_domain (Default: null)
    يقوم هذا الإعداد بتعريف اسم دومين يتم تخزين الكوكيز لصالحه .. والقيمة الافتراضية هي null ، لا تقم بتغييرها

    ضع في اعتبارك انه اذا كانت قيمه الاعداد (session.use_cookies) تساوي واحد فان لا داعي لاستدعاء الدالة set_cookie() لإعداد الكوكيز بل سيتم اعدادها تلقائياً بواسطة الـPHP

    2 - الإضافة أوالكتابة إلى عنوان الصفحة
    إن إضافة عنوان الـSID إلى عنوان الصفحة يعتبر من الأشياء البشعة جداً رغم أن طريقته سهلة ومفيدة في حالة ما إذا كان الكوكيز غير مدعوم في المتصفح بشكل جيد
    مثال :
    <a href="configure.php?<?=SID?>">Go to the configuration page</a>
    بهذه الطريقة نقوم بإضافة المتغير المرجعي SID الذي سيقوم بإعطاء رقم معرف للمستخدم .

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

    <?
    session_start();
    session_register("zx");
    session_register("co");
    $zx=10;
    $co++;
    echo 'مرحبا بك في موقعنا أيها الزائر الكريم '."<br>";

    echo "عدد زياراتك لهذه الصفحة=". $co ;
    echo "<br>";
    echo '<a href="php2.php">الصفحة الثانية</a>';
    ?>
    اقصد بالجلسة هي الـ(session) وإن كانت الترجمة غير صحيحة ولكن فقط نأخذه كمصطلح .
    متغير الجلسة هو الـ(session-variable) أو متغير الـsession أو سمه ما شئت .

    الشرح
    يقوم هذا السكربت في البداية بإنشاء متغير اسمه (zx) ومتغير اسمه (co) وقمنا بإعطاء القيمة (10) للمتغير (zx) وقمنا بزيادة القيمة الموجودة (وهي الصفر) في (co) بواحد وكتبنا مرحبا بك ايها الزائر الكريم في موقعنا ، ثم قلنا له إن عدد زياراتك لهذه الصفحة هي قيمة المتغير( co ) ثم اعطيناه رابط للصفحة الثانية .
    في الواقع إن هذه المتغيرات وقيمها يتم الاحتفاظ بها في كوكيز له اسم خاص قمنا بتحديده سابقاً من ملف PHP.ini ، وهذا الكوكيز يحتفظ بقيمة الـSID للـsession .

    نحن لا نقوم بإخبار الـPHP أين سيحتفظ بقيمة المتغيرات لأننا بدأنا بكلمة الـ:
    session_start();
    وعلى هذا فإن الـPHP سيفهم أنه سيقوم بتخزين القيمة في الكوكيز الخاص بالـsession .
    قمنا بجعل المتغير co كعداد بسيط لعدد المرات التي سوف نقوم بها يزيارة الصفحة فعند عمل تحديث للصفحة سيتم زيادة العداد بمقدار واحد
    $c++;
    وطبعاً قبل زيادة العداد بقيمة واحد فإنه يتم حساب القيمة السابقة للمتغير عند إنشاءه تلقائياً ... ومن ثم يتم الزيادة وبعد ذلك طباعة القيمة .
    كتابة رقم الـSID
    اكتب الآن الكود التالي واحفظه باسم php2.php
    <?
    session_start();
    echo $PHPSESSID ."<br>";
    echo $zx;
    ?>
    في هذه الصفحة نقوم بطباعة قيمة الـSID وذلك بطباعة قيمه المتغير $PHPSESSID (الذي هو اسم الكوكيز الخاصة بالـsession ) .
    بعد ذلك قمنا في النهاية بطباعة قيمة المتغير $zx لكي ألفت نظرك بأن الكوكيز ما زال يحتفظ بها ولم يفقدها لأننا قد حددنا الإعداد في ملف php.ini الخاص بوقت الكوكيز الـ 3600 أي لمده ساعة ثم بعد تلك الساعة سيتم مسح الكوكيز ولن يمكنك استرجاع قيمة أي متغير :
    session.cookie_lifetime = 3600
    واضف إلى معلوماتك أنه لا يمكنك قراءة القيم للكوكيز الخاصة بالـsession إلا عن طريق إضافه الأمر
    session_start();
    يجب أن تبدأ بهذا الأمر دائماً إذا أردت قراءة قيم المتغيرات التي يحتفظ بها الكوكيز الخاص بالـsession .

    مسح متغير من الـsession
    كل ما عليك فعله هو استخدام هذه الدالة :
    session_unregister(variable name);
    تقوم بوضع اسم المتغير في مكان الـ(variable name)
    مثال :
    session_unregister(“brn”);

    سيقوم هذا الأمر بمسح المتغير (brn) من الـكوكيز الخاصة بالـ(session)

    قراءة قيم المتغيرات في الـكوكيز الخاصة بالـsession
    كل ما عليك فعله هو استخدام الدالة :
    session_encode();

    مثال :
    <?
    session_start();
    session_register("bgcolor");
    session_register("name");
    session_register("email");
    $bgcolor = "#8080ff";
    $name = "alfareees almolthem";
    $email = "php@php.com";
    $e = session_encode();
    print "The encoded string is: $e";
    ?>

    بهذا السكربت نكون قد أنهينا درسنا عن مقدمة بسيطة للـsession . هذه مجرد مقدمة ولكي نستطيع أن نتعمق بالـsession فيجب علينا أن نتعلم شيئاً عن قواعد البيانات .

  10. #20

    افتراضي عبارات الشرطية

    بسم الله الرحمن الرحيم والصلاة والسلام على اشرف الانبياء والمرسلين ، سيتم التطرق في هذا الدرس بمشيئة الله الى ما يلي :

    - عبـاراة الـ if .
    - عبـاراة الـ else .
    - عبـاراة الـ elseif .
    - عبـاراة الـ switch .
    - حلقة التكرار while .
    - حلقة التكرار for .
    - حلقة التكرار do while .

    - عبـاراة الـ if :
    استخدام الـ if في كتابة السكربات شي أساسي ، وكما في لغات البرمجة الأخرى فإن الـ PHP تتبع نفس الاسلوب في كتابة الـ if ، فيمكن تحديد شرط معين مقترن بالـ if وبالتالي اذا كان الشرط صحيحاً ( true ) فسيتم تنفيذ الاسطر المحددة ، وبتفصيل أكثر يجب وضع الشرط بين قوسين ( ) ، ووضع الاسطر المطلوب تنفيذها بين العلامـات { } ، مع ملاحظة أنه يمكن التخلي عن العلامات { } في حال وجود سطر واحد فقط .

    فلنفترض وجود نموذج بريدي ( Mail Fourm ) ، يحتوي على الإسم والبريد والرسالة ، ونرغب في معرفة ما اذا كان المرسل قد ملأ جميع الحقول وبالتالي إرسـال الرسـالة ، او انه لم بفعل ذلك وبالتالي عرض رسـالة ( فضلاً قم بتعبئة البيـانات كاملة ) ، لعمل ذلك نحتاج معرفة أسمـاء المتغيرات في النموذج ، ولذلك فلنفترض أن المتغيرات كالتالي :
    ( الإسم name$ ) ، ( البريد email$ ) ، ( الرسـالة later$ ) ، ولعمل الشرط الأول ( اذا كان الإسم لم يُدخل فلن يتم ارسـال الرسـالة ) :
    <?
    if ( $name == "" )
    echo "فضلاً قم بتعبئة البيـانات كاملة ";
    ?>
    والمعنى أنه إذا كان المتغير name$ لا يحتوي على أي قيمة ( أي فراغ ) فسيتم تنفيذ السطر التالي وطبـاعة الجملة ، مع ملاحظة أن المطلوب تنفيذه هم سطر واحد فقط ولذلك لم نستخدم { } ، بل في حالة وجود أكثر من سطر يجب استخدامها كالتالي :
    <?
    if ( $name == "" ) {
    echo "فضلاً قم بتعبئة البيـانات كاملة<br> ";
    echo "لم تقم بإدخـال الإسم ";
    }
    ?>

    - عبـاراة الـ else :
    هذه العبـارة تتيح امكانية وجود اجراء ثاني لعدم تحقق الشرط ، ففي مثالنا السابق كان الاجراء طباعة الجملة اذا تحقق الشرط ، ولكن في حالة عدم تحقق الشرط فلن يكون هناك اجراء لتنفيذه ، بل ان الاجراء سيتم تنفيذه اذا تحقق الشرط ومن ثم سيتم اكمال بقية الاسطر ، وفي حالة مثل هذه الحالة يتم استخدام الـ else لوضع اجراء آخر في حالة عدم تحقق الشرط ، وبالمثال يتضح المقال :
    <?
    if ( $name == "" ) {
    echo "فضلاً قم بتعبئة البيـانات كاملة";
    }
    else
    {
    echo "تم ارسـال الرسـالة ، شكرا لك";
    }
    ?>
    في هذا المثال سيتم طباعة الجملة (فضلاً قم بتعبئة البيـانات كاملة ) اذا تحقق الشرط أن المتغير name$ لا يحتوي على أي قيمة ، وسيتم طباعة الجملة (تم ارسـال الرسـالة ، شكرا لك ) في حالة عدم تحقق الشرط ، أي في حالة وجود قيمة في المتغير name$ ، مع ملاحظة أن هذا المثال يحتوي على شرطين وليس شرط واحد ، فالظاهر هو شرط واحد ( "" == name$ ) ولكن العبـارة else تعتبر شرطاً بحد ذاتها ولو لم يكن هذا الشرط مكتوباً ، وكما هو واضح فمعنى هذا الشرط هو ( إذا كان غير ذلك ) فقم بطباعة الجملة .

    يمكن أن يكون الشرح غير واضح تماماً ، ولكن أهمية فهم الطريقة ستتضح في الأسطر القليلة القادمة .

    - عبـاراة الـ elseif :
    في العبارة السابقة ذكرنا أنه يوجد شرطين واجرائين ، أحد هذين الشرطين غير مكتوب بل هو مفهوم من ادراج العبـارة else ، وفي حالات كثيرة لا يكفينا مجرد شرطين واجرائين لاتمام بعض السكربات المعقدة ، فلذلك يمكن نستخدم العبـارة elseif مع الـ if لعمل مثل هذه السكربات ، فلو افترضنا أن لدينا عداد لزوار الموقع ونريد اظاهر العداد بحيث يتم قراءته بشكل جيد ، اي بمعني اخر اذا كان عدد الزوار ( 1 ) فسيتم طباعة الجملة ( عدد الزوار : زائر واحد فقط ) واذا كان ( 2 ) فسيتم طباعة الجملة ( عدد الزوار : زائرين ) ... وقس على ذلك ، فعندما يكون عدد الزوار ( 1 ) فسيتم عرض الجملة الأولى فقط وعندما يكون عدد الزوار ( 2 ) فسيتم عرض الجملة الثانية فقط ، وهكذا لبقية الشروط .

    بافتراض أن المتغير ( counter$ ) هو عداد الزوار ، فالمثال التالي يبين ما تم شرحه سابقاً :
    <?
    if ( $counter == 1 ) {
    echo " عدد الزوار : زائر واحد فقط ";
    }
    elseif ( $counter == 2 ) {
    echo " عدد الزوار : زائرين ";
    }
    elseif ( $counter >= 3 && $counter <= 10 ) {
    echo "عدد الزوار : $counter زوار";
    }
    else {
    echo "عدد الزوار : $counter زائر";
    }
    ?>
    كما هو واضح في المثـال السابق سيتم ما يلي :

    الشرط : العداد يساوي 1
    الإجراء : طبـاعة ( عدد الزوار : زائر واحد فقط )
    الشرط : العداد يساوي 2
    الإجراء : طبـاعة ( عدد الزوار : زائرين )
    الشرط : العداد أكبر أو يساوي 3 و اصغر أو يسـاوي 10
    الإجراء : طبـاعة ( عدد الزوار : ( العداد ) زوار )
    الشرط : العداد لا يحقق أي من الشروط
    الإجراء : طبـاعة ( عدد الزوار : ( العداد ) زائر )

    ملاحظة بسيطة فقط ، وهي على العلامة && التي تعني ( و ) ، وهي من علامات الجمع بين جملتين ، فيجب أن تكون الجملتين صحيحتين لتحقق الشرط .

    - عبـاراة الـ switch :
    هذه العبـارة قريبة جداً من العبـارة if ، ولكن يمكن استخدام اكثر من شرطرين باسلوب أخر ، غير انه يجب اسناد قيمة معينة للـ case وهي هنا بمثابة الشرط ، لكي يتم تنفيذ الاجراء المحدد لذلك الشرط أو الـ case ، وفي النهاية الأمر يعود الى المصمم وايهما يفضل ، وكما في المثال السابق يمكن كتابة مثال بالـ switch بنفس الطريقة ، والمشكلة الوحيدة هي كما قلنا أنه يجب اسناد قيمة معينة لكل case وبالتالي فإن الشرط الثالث من المثال السابق يجب تفريقه لكل قيمة من ( 3 الى 10 ) ، وهذه العميلة مجهدة لانه يجب كتابة سطر لكل قيمة كما يلي :

    القيمة : 3
    الـ case : 3
    الاجراء : طبـاعة ( عدد الزوار : ( العداد ) زوار )
    القيمة : 4
    الـ case : 4
    الاجراء : طبـاعة ( عدد الزوار : ( العداد ) زوار )
    القيمة : 5
    الـ case : 5
    الاجراء : طبـاعة ( عدد الزوار : ( العداد ) زوار )
    ......... الخ ...

    وفي المثال التالي ساتغاضى عن الشرط الثالث بكامله ، واذكر بقية الشروط والحالات لمجرد فهم طريقة عمل هذه العبـارة :
    <?
    switch ($counter)
    {
    case "1";
    echo " عدد الزوار : زائر واحد فقط ";
    break;
    case "2";
    echo " عدد الزوار : زائرين ";
    break;
    default;
    echo "عدد الزوار : $counter زائر";
    break;
    }
    ?>
    استخدمنا في هذه المثال بعض الجمل وتعني ما يلي :
    Switch وتكتب في البداية مع ادراج اسم المتغير الذي سيتم عمل الشروط عليه .
    Case أي في حالة ( .... ) ويكتب بجانبها الشرط .
    Break وتعني ايقاف العملية والخروج من الشرط بعد تنفيذ أحد الإجراءات .
    Defaukt وهي تقابل العبـارة else أي بمعنى أنها لأي حالة لم يتم ذكرها في الشروط .

    - حلقة التكرار while :
    وهي ابسط حلقات التكرار على الأطلاق ، بحيث تاخذ شرط واحد فقط وتبني على تنفيذ ما بين علامات الشروط { } ، والفرق الوحيد بينها وبين الـ if هو انها ستقوم بتنفيذ الاجراءات طالما كان الشرط صحيحاً ، وهذا يعني احتمال تنفيذ الإجراء أكثر من مرة ، وهذ الدالة مفيدة في ادراج الحقول من الجدوال وغيرها من الاستخدامات ، بحيث لو افترضنا وجود جدول معين في قاعد بيانات ونريد ادراجه في صفحة PHP ، فسيكون من اهم خيارات الاستخدام هذه الدالة ، وباذن الله سيتم التطرق لقواعد البيانات في الدروس القادمة ، وفي الوقت الحالي ساذكر مثال بسيط على هذه الدالة لفهم طريقة استخدامها :
    <?
    $total = 10;
    while ( $total <= 50 )
    {
    echo "العدد أقل من 50<br>";
    $total +=10;
    }
    ?>
    كير بسيط يمكن معرفة أن الجملة ( العدد أقل من 50 ) سيتم طباعتها 5 مرات ، لان حلقة التكرار while قامت بتنفيذ الاجراء طالما أن الشرط صحيح ، وفي المرة الأولى كان المتغير ( total$ ) يساوي ( 10 ) والشرط صحيح لان الـ ( total$ ) فعلاً اصغر أو يساوي الـ ( 50 ) ، فتم تنفيذ ما بين علامات الشرط ، ومن ذلك زيادة متغير المجموع ( total$ ) بقيمة ( 10 ) ومن ثم الرجوع والمقارنة من جديد ، وفي هذه الحالة صار المتغير ( total$ ) يساوي ( 20 ) وأيضـاً الشرط صحيح وبالتالي الدخول مرة أخرى وتنفيذ الأجراء .... وهكذا حتى يتم الوصول الى أن قيمة الـ ( total$ ) يساوي ( 50 ) وبالتالي الشرط صحيح ، ومن ثم تصبح قيمة الـ ( total$ ) تساوي ( 60 ) وفي هذه الحالة يتم ايقاف تنفيذ الاجراءات لأن الشرط غير صحيح .

    - حلقة التكرار for :
    يوجد طريقة أسهل للتعامل مع المثال السابق ، فاستخدام حلقة التكرار while كانت القيمة الابتدائية للمتغير ( total$ ) في سطر ، والشرط في سطر والزيـادة على المتغير في سطر أخر ، وبالتالي زيارة في عدد الأسطر عن ما يمكن استخدامه مع حلقة التكرار for ، فالمثـال التالي يبين طريقة أخرى لاستخدام مثـال الـ while بطريقة أسهل :
    <?
    for ( $total = 10; $total <=50; $total +=10 )
    {
    echo "العدد أقل من 50<br>";
    }
    ?>
    وللتوضيح فان تركيب الـ for هو على الشكل التالي :
    for ( القيمة الأفتراضية; الشـرط; مقدار الزيـادة; )
    {
    الإجراء المطلوب تنفيذه
    }

    - حلقة التكرار do while :
    وهي نسخة أخرى من الـ while والفرق الوحيد بينهما أن التأكد من الشرط وصحته من عدمها يتم بعد تنفيذ الاجراء وليس قبله كما في الـ while وكمثال عليها :
    <?
    $total = 10;
    do
    {
    echo "العدد أقل من 50<br>";
    $total +=10;
    }
    while ( $total <= 50 );
    ?>
    وفي نهاية الدرس اتمنى الفائدة للجميع

+ الرد على الكتاب
صفحة 2 من 4 الأولىالأولى 1 2 3 4 الأخيرةالأخيرة

ضوابط التعليقات على الكتاب

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