0% found this document useful (0 votes)
489 views98 pages

Learn PHP PDF

Uploaded by

abdo Nt
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
489 views98 pages

Learn PHP PDF

Uploaded by

abdo Nt
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 98

âa†‚nbi@òîÜÇbÐm@oããa@ÉÓaìß@Šíìİm

PHP @ @ñ‰ì–Ûa@kíŠÔm@¿@†ÇbŽm@òÇìänß@òîÜàÇ@pbÔîjİm

@ @ò’îji@òîäÔnÛa@òîÜØÛa@ @@ @k%b§a@òîäÔm@áÓ@ @@ @@ @@@[email protected]@@﹊ØÛa@Þý$ Nc


‫المحتويات‬
‫الصفحة‬ ‫الموضوع‬
‫‪١‬‬ ‫تمھيد‬

‫‪٨‬‬ ‫أساسيات ‪PHP‬‬

‫‪١٥‬‬ ‫التعامل مع المتغيرات و الثوابت‬

‫‪٢٤‬‬ ‫التحكم في سير البرنامج‪Controlling Program Flow‬‬

‫‪٣٤‬‬ ‫التعامل مع المصفوفات ‪Arrays‬‬

‫‪٤٤‬‬ ‫الدوال في ‪Functions in, PHP،‬‬

‫‪٥٤‬‬ ‫التعامل مع النماذج ‪Dealing with HTML forms‬‬

‫‪٦٨‬‬ ‫التحقق من بيانات النماذج ‪Validating form data،‬‬

‫‪٧٨‬‬ ‫العمل مع ‪ Cookies‬و ‪Sessions‬‬

‫‪٨٤‬‬ ‫التعامل مع قواعد البيانات في ‪PHP‬‬


‫‪١‬‬ ‫الفصل األول ‪ :‬تمھيد‬
‫ھذا الفصل يغطي‪:‬‬

‫تقديم للغة ‪PHP‬‬ ‫‬


‫متطلبات التركيب‬ ‫‬
‫تجھيز بيئة العمل‬ ‫‬

‫ما ھي ‪PHP‬‬
‫‪ ) PHP‬ترمز إلى ‪ ( PHP:Hypertext Preprocessor‬عبارة عن لغة برمجة مفتوحة المصدر تُستخدم بشكل‬
‫واسع ألغراض متعددة ‪ ،‬و صُممت خصيصا لتطوير مواقع إنترنت تفاعلية‪ .‬و تختلف ‪ PHP‬عن ‪ JavaScript‬في‬
‫أن الشفرة البرمجية يتم تنفيذھا على الخادم ‪ web server‬و من ثم يُرسل ناتج التنفيذ على ھيئة ‪ HTML‬للمستخدم‪.‬‬

‫يتم طلب صفحة ‪PHP‬‬ ‫‪Web Server‬‬

‫يأتي الرد على ھيئة ‪HTML‬‬

‫يقوم محرك الشفرة بتنفيذ‬


‫ملف ‪ PHP‬و من ثم‬
‫يقوم بإرجاع الناتج‬

‫استعالم ‪SQL‬‬ ‫‪Script Engine‬‬

‫‪Database‬‬ ‫ناتج تنفيذ االستعالم‬

‫ماذا يمكنھا أن تعمل‬

‫يمكن أن تُستخدم ‪ PHP‬لعمل ما يلي‪:‬‬


‫‪ .١‬إنشاء تطبيقات جھة خادم ‪ ، server-side application‬و ھو الھدف األساسي من ‪. PHP‬‬
‫‪ .٢‬إنشاء برامج تعمل على موجه األوامر ‪ command line prompt‬بدون الحاجة لمتصفح إنترنت أو خادم‬
‫ويب‪.‬‬
‫‪ .٣‬إنشاء تطبيقات سطح مكتب ‪ desktop applications‬تحتوي على واجھة مستخدم ‪graphical user‬‬
‫‪.interface‬‬

‫ما ھي مميزاتھا‬
‫تتميز ‪ PHP‬بعدد من المزايا منھا‪:‬‬
‫‪ .١‬يمكن تنفيذھا على العديد من أنظمة التشغيل منھا‬
‫أ‪Microsoft Windows -‬‬
‫ب‪Linux -‬‬
‫ت‪Unix -‬‬
‫ث‪Mac OS X -‬‬
‫‪٢‬‬ ‫الفصل األول‪ :‬تمھيد‬
‫تدعم العديد من خوادم الويب كـ ‪ Apache‬و ‪.IIS‬‬ ‫‪.٢‬‬
‫تدعم العديد من أنظمة قواعد البيانات كـ‬ ‫‪.٣‬‬
‫أ‪Oracle -‬‬
‫ب‪MySql -‬‬
‫ت‪SQL Server -‬‬
‫ث‪Microsoft Access -‬‬
‫ج‪Postgre SQL -‬‬
‫تدعم البرمجة الكينونة ‪ object oriented programming‬والبرمجة االجرائية ‪procedural-‬‬ ‫‪.٤‬‬
‫‪ programming‬و يمكن الخلط بينھما‪.‬‬
‫ال تدعم ‪ PHP‬عرض البيانات على ھيئة ‪ HTML‬فقط بل يمكن عرض البيانات على ھيئة صورة ‪PDF ،‬‬ ‫‪.٥‬‬
‫أو حتى اخراج البيانات على ھيئة ملفات فالش‪.‬‬

‫متطلبات ‪PHP‬‬

‫قبل أن نستطيع تنفيذ ملفات ‪ PHP‬سنحتاج إلى خادم ‪ server‬و ذلك ألن ‪ PHP‬من لغات برمجة الخادم ‪server side‬‬
‫‪. scripting‬‬

‫لغات البرمجة النصية ‪ : Scripting Languages‬يقصد بھا لغات البرمجة عالية المستوى و التي يتم‬
‫تفسيرھا عن طريق برنامج آخر وقت التنفيذ‪ Run Time‬بدال من عملية الترجمة و التي تتم بواسطة معالج‬
‫الكمبيوتر كما ھو الحال في لغات برمجة كـ ‪ C‬و ‪ .C++‬من أمثلة ھذا النوع ‪. Javascript,PHP,ASP,JSP,Perl‬‬

‫خادم ويب االباتشي )‪(Apache Web Server‬‬

‫االباتشي ‪ Apache‬عبارة عن خادم ويب وظيفته األساسية استقبال الطلبات ‪ Http Request‬و تسليمھا إلى محرك‬
‫الشفرة ‪ Script Engine‬و من ثم الحقا يقوم ‪ Apache‬باستالم الرد ‪ Http Response‬من محرك الشفرة و‬
‫تسليمھا الى مرسل الطلب على ھيئة ‪ .HTML‬وقد صمم االباتشي ليعمل مع نظام التشغيل يونكس ‪ . Unix‬الحقا تم‬
‫تھيئته للعمل مع نظام التشغيل ويندوز ‪ Windows‬وبعض أنظمة التشغيل الخاصة بالشبكات‪.‬‬
‫و يمتاز خادم األباتشي بمجموعة المزايا و اإلمكانيات منھا‪:‬‬
‫ إمكانية عمل صفحات خطأ مخصصة ‪.Customized error pages‬‬
‫ إمكانية إخفاء عناوين االنترنت ‪.URL‬‬
‫ سجالت األخطاء و االستخدام بأكثر من ھيئة‪.‬‬
‫و يمكن الحصول على نسخة من البرنامج من خالل زيارة موقع فريق عمل االباتشي التالي‪:‬‬
‫‪. http://httpd.apache.org/download.cgi‬‬

‫نظام قواعد البيانات ‪MySql‬‬

‫‪ MySql‬عبارة عن نظام قواعد بيانات مفتوح المصدر‪ .‬و تصنف ‪ MySql‬على انھا من أنظمة إدارة قواعد البيانات‬
‫صممت للعمل مع االستعالمات المعقدة و األحمال الثقيلة‪ .‬كما تتيح إمكانية ربط عدد كبير من‬ ‫العالئقية ‪ُ RDBMS‬‬
‫الجداول ببعضھا البعض للوصول إلى أعلى قدر من الكفاءة و السرعة‪.‬‬
‫أخيرا يمكن تحميل نسخة من البرنامج من خالل الرابط التالي‪:‬‬
‫‪. /http://dev.mysql.com/downloads‬‬
‫‪٣‬‬ ‫الفصل األول ‪ :‬تمھيد‬

‫برنامج ‪XAMMP‬‬

‫الكثيرون يعرفون أن عملية تركيب خادم ويب ‪ Apache‬و تھيئته للعمل مع ‪ PHP‬و ‪ MySql‬ليست بالعملية السھلة‬
‫و دائما ما تستھلك وقت و جھد للتوفيق بينھا‪ .‬لذلك يأتي دور برنامج ‪ XAMMP‬و الذي جعل من عملية التركيب تتم‬
‫بشكل سھل و سريع جدا ‪ .‬يمكن تحميل نسخة من البرنامج من خالل الرابط التالي‪:‬‬
‫‪. http://www.apachefriends.org/en/xampp.html‬‬

‫تحميل ‪XAMMP‬‬

‫قبل عملية التركيب سنقوم بتحميل البرنامج من خالل الخطوات التالية‪:‬‬


‫‪ .١‬قم بالتوجه إلى الصفحة التالية‪. http://www.apachefriends.org/en/xampp.html :‬‬
‫‪ .٢‬أسفل الصفحة قم باختيار إصدارة البرنامج المتوافقة مع نظام التشغيل لديك‪ .‬في حالتنا سنقوم باختيار النسخة‬
‫المتوافقة مع نظام التشغيل ‪ Windows‬لذلك سنقوم بالنقر على الرابط ‪:‬‬
‫‪. XAMMP for Windows‬‬
‫‪ .٣‬من الصفحة الجديدة نسحب شريط التمرير إلى منتصف الصفحة وصوال عند القسم تحميل )‪(Download‬‬
‫‪ ،‬بعد ذلك قم بالنقر على ‪. Installer‬‬
‫‪ .٤‬أخيرا ستظھر نافذة تطالب بتحديد مكان لحفظ الملف ‪ ،‬قم باختيار سطح المكتب أو المستندات لحفظ الملف‪.‬‬

‫تركيب ‪XAMMP‬‬

‫بعد االنتھاء من تحميل برنامج ‪ XAMMP‬سنبدأ اآلن في خطوة تركيب البرنامج و الذي سيقوم بتھيئة ‪، Apache‬‬
‫‪ PHP‬و ‪ MySql‬للعمل معا‪ .‬خطوات التركيب‪:‬‬
‫‪ .١‬انقر بزر الفأرة االيسر مرتين على ايقونة البرنامج‪.‬‬
‫‪ .٢‬أول نافذة ھي نافذة تحديد اللغة و التي من خاللھا سنختار الخيار االفتراضي ‪ English‬و من ثم نضغط‬
‫‪ .Next‬و من النافذة التالية نضغط على ‪ Next‬أيضا‪.‬‬
‫‪ .٣‬في النافذة التالية نحدد مكان مسار البرنامج ) و يفضل ‪.(C:\xampp‬‬
‫‪٤‬‬ ‫الفصل األول ‪ :‬تمھيد‬

‫‪ .٤‬النافذة التالية من خاللھا نحدد ما إذا كنا نرغب في تركيب ‪ Apache‬و ‪ Mysql‬كخدمة ‪ Service‬من‬
‫خدمات ويندوز‪ ،‬بمعنى أنھما سيعمالن بمجرد تشغيل نظام التشغيل‪.‬‬

‫‪ .٥‬بعد ذلك سيقوم البرنامج باستخراج و تركيب الملفات المطلوبة‪ .‬و من ثم عند االنتھاء ستظھر النافذة التالية و‬
‫التي ستخبرنا بانتھاء عملية التركيب بنجاح و نستطيع تشغيل لوحة تحكم البرنامج بالضغط على زر ‪.Yes‬‬
‫‪٥‬‬ ‫الفصل األول ‪ :‬تمھيد‬

‫‪ .٦‬بعد االنتھاء من تركيب ‪ XAMMP‬سنقوم بفتح متصفح االنترنت و كتابة العنوان التالي‪:‬‬
‫‪ . http://localhost‬عندھا ستظھر صفحة إختيار اللغة لتطبيق ‪ XAMPP‬و التي من خاللھا سنقوم‬
‫بإختيار اللغة االنجليزية ‪ English‬لكي ننتقل الى الصفحة الرئيسية لـ ‪.XAMMP‬‬
‫‪٦‬‬ ‫الفصل األول ‪ :‬تمھيد‬

‫أين سيتم حفظ ملفات ‪PHP‬‬


‫على عكس ‪ ، HTML‬يجب أن نقوم بحفظ ملفات ‪ PHP‬في المكان المخصص لھا و الذي يسمى بالمجلد الجذر ‪root‬‬
‫‪ .directory‬و المجلد الجذر ھو ‪ htdocs‬و الذي يقع في المسار التالي ‪ . C:\xammp\htdocs :‬أي ملف يوضع‬
‫داخل ھذا المجلد سيكون قابل للوصول عن طريق كتابة ‪ http://localhost/‬أو ‪ http://127.0.0.1/‬في شريط‬
‫عنوان متصفح االنترنت ‪.‬‬

‫يمكن تغيير المجلد الجذر من خالل تغيير القيمة االفتراضية المحددة في ملف إعدادات االباتشي و الموجودة‬
‫في ‪ c:\xammp\apache\conf\httpd.conf‬و تغيير قيمة لـ ‪ . DocumentRoot‬أخيرا ال تنسى القيام‬
‫بإعادة تشغيل االباتشي لكي تصبح التغييرات الجديدة نافذة‪.‬‬

‫ما ھو المحرر المناسب لكتابة شفرة ‪PHP‬‬


‫تستطيع استخدام أيا من محررات النصوص كبرنامج المفكرة ‪ Notepad‬أو برنامج الدفتر ‪ WordPad‬أو برنامج‬
‫المفكرة المطور ‪ Notepad++‬أو البرامج ذات الواجھة الرسومية كبرنامج ‪.Adobe Dreamweaver‬‬
‫و المحرر الذي سنقوم باستخدامه في الشرح ھو برنامج ‪ Notepad++‬و الذي يمكن تحميله بشكل مجاني من خالل‬
‫زيارة الموقع التالي‪. http://notepad-plus-plus.org/download/ :‬‬

‫تطبيق عملي‬

‫قم بفتح برنامج ‪ .Notepad++‬بعد ذلك سيقوم البرنامج بإنشاء مساحة عمل فارغة‪ .‬قم بكتابة الشفرة التالية‪:‬‬
‫>‪<html‬‬
‫>‪<head‬‬
‫>‪<tilte> 
</tilte‬‬
‫>‪</head‬‬
‫>‪<body‬‬
‫>‪ 
PHP</font‬آ آ د>"‪<font color="blue‬‬
‫>‪<p‬‬
‫‪<?php‬‬
‫;'  ‪echo 'PHP‬‬
‫>?‬
‫>‪</p‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .‬و من النافذة التالية قم بما يلي‪:‬‬ ‫بعد االنتھاء من كتابة الشفرة السابقه ‪ ،‬قم بالنقر على زر حفظ‬
‫‪ .١‬قم بتغيير مكان الحفظ عن طريق االنتقال للمجلد ‪.C:\xammp\htdocs‬‬
‫‪ .٢‬قم بتسمية الملف باسم ‪. test.php‬‬
‫‪ .٣‬غير نوع الملف ‪ Save as type‬من القائمة المنسدلة ليصبح )*‪ All types(*.‬أو ‪PHP Hypertext‬‬
‫‪.Preprocessor files‬‬
‫‪ .٤‬انقر على الزر ‪.Save‬‬
‫بعد االنتھاء من عملية الحفظ ‪،‬افتح متصفح االنترنت و اكتب العنوان التالي‪ http://localhost/test.php :‬و من ثم‬
‫الحظ الناتج‪.‬‬
‫أخيرا ‪ ،‬اضغط على زر الفأرة األيمن )على نافذة المتصفح ( و من ثم اختر عرض المصدر ‪ ، view source‬أو من‬
‫القائمة المنسدلة عرض ‪ view‬اختر المصدر ‪ ) source‬قد تختلف من متصفح آلخر ( ‪ ،‬ماذا تالحظ؟‬
‫‪٧‬‬ ‫الفصل األول ‪ :‬تمھيد‬

‫أسئلة نھاية الفصل‬

‫‪ .١‬ما ھو الھدف الرئيسي من استخدام لغة ‪.PHP‬‬

‫‪ .٢‬عدد ثالث من مميزات ‪.PHP‬‬

‫‪ .٣‬أين سيتم حفظ ملفات ‪ PHP‬لكي نتمكن من عرضھا الحقا‪ .‬و كيف سيتم استدعاء الصفحة؟‬

‫‪ .٤‬ماذا يقصد بلغات البرمجة النصية ‪scripting languages‬؟‬

‫‪ .٥‬قم بتحميل برنامج ‪ XAMMP‬و تركيبه على جھازك الشخصي متبعا خطوات التركيب المذكورة سابقا‪.‬‬
‫‪٨‬‬ ‫الفصل الثاني‪ :‬أساسيات ‪PHP‬‬
‫ھذا الفصل يغطي‪:‬‬

‫كيف كتابة و تنفيذ شفرة ‪PHP‬‬ ‫‬


‫تركيب لغة ‪PHP‬‬ ‫‬
‫تنفيذ شفرة ‪ PHP‬من موجه األوامر‬ ‫‬

‫تنفيذ ملفات ‪PHP‬‬

‫كما ذكرنا سابقا‪ ،‬تعتبر ‪ PHP‬من لغات برمجة جھة الخادم ‪ .Server-side programming‬بمعنى أن‬
‫خادم الويب ‪ Apache Web Server‬يقوم بإرسال شفرة ‪ PHP‬إلى محرك الشفرة ‪PHP script engine‬‬
‫و الذي يقوم بتنفيذ الشفرة و من ثم إرجاع نتيجة التنفيذ إلى خادم الويب و الذي يقوم بإرجاع ناتج التنفيذ الى‬
‫جھاز العميل و غالبا يكون على ھيئة ‪) HTML‬راجع الرسم التوضيحي في الفصل السابق( ‪ .‬و لكي يتمكن‬
‫خادم الويب من فھم و معالجة شفرة ‪ PHP‬البد من إخباره بأن صفحة االنترنت تحتوي على شفرة ‪ .PHP‬و‬
‫لتحقيق ذلك يجب أن نتبع الخطوات التالية‪:‬‬
‫‪ .١‬يجب حفظ صفحة االنترنت بامتداد ‪ .php‬مثال ‪index.php‬‬
‫‪ .٢‬يجب حصر شفرة ‪ PHP‬بين وسوم ‪.PHP‬‬

‫‪<?php‬‬

‫ آ ا د ه‬

‫>?‬

‫وسوم ‪PHP‬‬

‫يمكن كتابة شفرة ‪ PHP‬بين وسوم ‪ PHP‬الموضحة في الجدول التالي‪:‬‬

‫الوسوم القياسية ‪Standard tags‬‬ ‫‪<?php‬‬


‫اة ه‬
‫>?‬
‫الوسوم المختصرة ‪Short tags‬‬ ‫?<‬
‫اة ه‬
‫>?‬
‫وسوم سكريبت ‪Script tags‬‬ ‫>"‪<script language="php‬‬
‫اة ه‬
‫>‪</script‬‬
‫وسوم لغة ‪ASP‬‬ ‫‪<%‬‬
‫اة ه‬
‫>‪%‬‬

‫‪ <?php‬لضمان عدم حصول مشاكل تتعلق بالتوافقية‬ ‫و ينصح دائما باستخدام الطريقة القياسية >?‬
‫‪ compatibility‬و ألن كل خوادم الويب ‪ web servers‬تدعم العمل بھا‪.‬‬
‫‪٩‬‬ ‫الفصل الثاني‪ :‬أساسيات ‪PHP‬‬

‫الفاصلة المنقوطة ) ; ‪(Semicolon‬‬

‫تتطلب ‪ PHP‬أن يتم إنھاء أغلب تعليماتھا بواسطة فاصلة منقوطة );( ‪ .‬وسم إغالق ‪ ?> PHP‬يشتمل على فاصلة‬
‫منقوطة لذلك ليس ھناك حاجة إلنھاء آخر سطر من شفرة ‪ PHP‬بواسطة فاصلة منقوطة‪.‬‬

‫‪<?php‬‬
‫;'‪echo 'This is a test‬‬
‫>?‬

‫>? '‪<?php echo 'This is a test‬‬

‫;'‪<?php echo 'We omitted the last closing tag‬‬

‫)ا"!ر(‪php.net‬‬

‫التعليقات )‪(Comments‬‬

‫إلدراج تعليق في سطر واحد فقط ‪ ،‬نستخدم )‪ (//‬أو )‪ .(#‬أما في حالة الرغبة في إدراج تعليق ألكثر من سطر واحد‬
‫فنستخدم )‪.(/* */‬‬
‫‪<?php‬‬


' & ‪  %‬وا‪// !#‬‬


' & ‪  %‬وا‪# !#‬‬

‫*‪/‬‬

' &‬
‫أآ* )(‬
‫‪ % */‬‬
‫>?‬

‫يقصد بعبارة ) تعليق ‪ ،(comment‬كل تعليمة سيتجاھلھا مفسر)‪ (Parser‬لغة ‪ PHP‬أثناء عملية التنفيذ‪.‬‬

‫المسافة الفارغة ‪whitespace‬‬

‫ال تعتبر ‪ PHP‬حساسة للمسافة الفارغة إال في عدد من الحاالت ‪:‬‬


‫ ال يمكننا ترك مسافة فارغة بين وسم ‪ ، PHP‬كأن نكتب ‪) <? php :‬غير صحيح( ‪.‬‬
‫ ال يسمح بترك مسافة فارغة بين الكلمات المحجوزة من قبل ‪ ، PHP‬كأن نكتب ‪ ) wh ile , fo r :‬غير‬
‫صحيح(‪.‬‬
‫ ال يسمح باستخدام المسافات الفارغة مع أسماء المتغيرات و الدوال كأن نكتب ‪ ) $first name :‬غير‬
‫صحيح(‪.‬‬
‫‪١٠‬‬ ‫الفصل الثاني‪ :‬أساسيات ‪PHP‬‬

‫إستخدام االقواس الكبيرة } {‬

‫يتم استخدام االقواس الكبيرة عند الحاجة لتنفيذ مجموعة من األوامر في حالة محددة‪ .‬كما في حالة الدوال ‪functions‬‬
‫أو جمل الشرط ‪ condition statements‬أو حلقات التكرار ‪.loops‬‬

‫‪<?php‬‬
‫) ‪if( $i > 2‬‬
‫{‬
‫‪//Statement1‬‬
‫‪//Statement2‬‬
‫}‬
‫>?‬

‫‪ PHP‬و ‪HTML‬‬

‫يمكن تضمين شفرة ‪ HTML‬داخل ملف ‪ PHP‬بطريقتين‪:‬‬

‫‪ .١‬أن تُكتب ‪ HTML‬خارج الجزء الخاص بشفرة ‪.PHP‬‬

‫>‪<html‬‬
‫>‪<head><title>PHP inside HTML</title‬‬
‫>‪</head‬‬
‫>‪<body‬‬
‫>‪  '
</h1‬ا
‪<h1>,% -   .‬‬
‫‪<?php‬‬
‫; "ه‪ 12‬ا ‪ -‬ا‪0‬و‪echo "/‬‬
‫>?‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .٢‬أن يتم كتابة ‪ HTML‬داخل عبارة ‪ echo‬أو الدالة ‪ print‬لكن البد أن تكون محصورة بين عالمات‬
‫االقتباس المفردة أو المزدوجة‪.‬‬

‫‪<?php‬‬
‫;'>‪echo '<html‬‬
‫;'>‪</title></head‬ا ‪ -‬ا*‪echo '<head><title>3‬‬
‫;'>‪print '<body‬‬
‫ه‪ 12‬ه ا ‪ -‬ا*‪ 3‬و ا
!ل ‪) /‬و‪print '<h1> 3‬‬
‫;'>‪PHP</h1‬‬
‫;'>‪echo'</body></html‬‬
‫>?‬
‫‪١١‬‬ ‫الفصل الثاني‪ :‬أساسيات ‪PHP‬‬

‫تنسيق شفرة ‪PHP‬‬

‫عند كتابة أي شفرة برمجية باستخدام ‪ PHP‬ينصح األخذ في االعتبار تحسين مظھر الشفرة المكتوبة‪ .‬و يتم ذلك عادة‬
‫بإضافة مسافة محددة )أربع خانات مثال( قبل كل تعليمة تكون تابعة للتعليمة التي تسبقھا باإلضافة إلى استخدام‬
‫التعليقات ‪. comments‬‬

‫‪<?php‬‬
‫ه‪2‬ا ا‪ - B)3‬م @ر ? ا> ‪// x‬‬
‫;‪$x=5‬‬
‫)‪if(x < 1‬‬
‫; " ‪echo " x is less than 1‬‬
‫‪else‬‬
‫; " ‪echo " x is bigger than 1‬‬
‫>?‬

‫علما أن تنسيق شفر ‪ PHP‬ليس له أي تأثير في عملية التنفيذ‪ .‬لكنھا مفيدة في ‪:‬‬

‫عملية تنظيم الشفرة و جعلھا أكثر قابلية للقراءة‪.‬‬ ‫‬


‫المساعدة كذلك في عملية الصيانة و التطوير الحقا‪.‬‬ ‫‬
‫تسھيل عملية الصيانة‪.‬‬ ‫‬

‫‪ echo‬و ‪print‬‬

‫لطباعة النتائج في ‪ PHP‬نستطيع استخدام إما ‪ echo‬أو ‪ . print‬والفرق الوحيد بينھما أن ‪ print‬تعتبر من دوال‬
‫‪ PHP‬بينما ‪ echo‬تُعتبر من تصاريح ‪) PHP‬راجع المثال في الصفحة السابقة(‪.‬‬

‫عالمة االقتباس المفردة ) ' ‪ ( Single quote‬و المزدوجة )'' ‪(Double quotes‬‬

‫عند التعامل مع النصوص يجب أن يتم تضمينھا بين عالمات االقتباس المفردة أو المزدوجة‪ .‬و الفرق بين‬
‫العالمتين ھو أن المفسر ‪ PHP interpreter‬سيقوم بالتعامل مع أي بيانات موضوعة بين عالمة االقتباس‬
‫المفردة و كأنھا نص عادي‪ .‬بينما في حالة عالمة االقتباس المزدوجة فسيقوم المفسر بالبحث عن أي‬
‫متغيرات أو حروف خاصة لكي يقوم بمعالجتھا‪.‬‬

‫>‪<html‬‬
‫>‪<head><title>Single and Double quotes</title‬‬
‫>‪</head‬‬
‫>‪<body‬‬
‫‪<?php‬‬
‫;‪$x = 1‬‬
‫;" >‪echo " x =\t$x <br/‬‬
‫;' >‪echo ' x =\t$x <br/‬‬
‫>?‬
‫>‪</body></html‬‬
‫‪١٣‬‬ ‫الفصل الثاني‪ :‬أساسيات ‪PHP‬‬

‫‪ PHP‬حساسة لحالة الحرف ‪case-sensitive‬‬

‫‪ PHP‬من لغات البرمجة الحساسة لحالة الحرف‪ .‬بمعنى أن ‪ $x‬تختلف عن ‪ $X‬و ) (‪ test‬تختلف أيضا عن ) (‪Test‬‬
‫و ھكذا‪.‬‬

‫‪<?php‬‬
‫;‪$number = 60‬‬
‫;‪echo'$number='.$number‬‬
‫;‪echo'<br>$number='.$Number‬‬
‫>?‬

‫‪$number=60‬‬
‫=‪$number‬‬

‫تنفيذ ‪ PHP‬من موجه األوامر ‪command line‬‬

‫بدال من الطريقة القياسية لتنفيذ ملفات ‪ PHP‬و التي نستخدم فيھا متصفح االنترنت ‪ ،‬نستطيع تنفيذ شفرة ‪ PHP‬من‬
‫خالل موجه األوامر‪ .‬و الطريقة كالتالي‪:‬‬
‫‪ .١‬قم بكتابة شفرة ‪ PHP‬التالية‪:‬‬
‫‪<?php‬‬
‫;'…‪echo 'executing PHP in command line‬‬
‫>?‬

‫االفتراضي‬ ‫المجلد‬ ‫داخل‬‫‪commandline.php‬‬ ‫باسم‬ ‫السابق‬ ‫الملف‬ ‫‪ .٢‬احفظ‬


‫)‪.(c:\xammp\htdocs\commandline.php‬‬
‫‪ .٣‬انتقل إلى كل البرامج ‪ <--‬البرامج الملحقة ‪ <--‬موجه األوامر‪.‬‬
‫‪ .٤‬بعد فتح موجه األوامر قم بكتابة سلسلة األوامر التالية بالترتيب‪:‬‬
‫ \‪cd‬‬
‫ ‪cd c:\xampp\php‬‬
‫ ‪ php c:\xampp\htdocs\commandline.php‬اآلن قم بالضغط على زر ‪ Enter‬و الحظ‬
‫الناتج‪.‬‬
‫\‪C:\Users\user>cd‬‬
‫‪C:\ cd c:\xampp\php‬‬
‫‪C:\xampp\php>php c:\xampp\htdocs\commandline.php‬‬
‫…‪executing PHP in command line‬‬

‫>‪C:\xampp\php‬‬
‫‪١٤‬‬ ‫الفصل الثاني‪ :‬أساسيات ‪PHP‬‬

‫أسئلة نھاية الفصل‬

‫‪ .١‬لماذا ال ينصح باستخدام >? ?< في كتابة شفرة ‪ PHP‬؟‬

‫‪ .٢‬ھل يجب إستخدام الفاصلة المنقوطة ) ; ( مع كل تعليمات ‪PHP‬؟‬

‫‪ .٣‬كيف يمكن تنسيق شفرة ‪ PHP‬و ما الفائدة منھا؟‬

‫‪ .٤‬ما الفرق بين عالمة االقتباس المفردة و المزدوجة؟‬

‫‪ .٥‬ھل تعتبر ‪ PHP‬حساسة لحالة الحرف‪ ،‬اضرب مثال لذلك؟‬

‫‪ .٦‬قم بكتابة شفرة ‪ ، PHP‬الغرض منھا طباعة اسمك‪ .‬مع االخذ في االعتبار ضرورة أن يظھر االسم‬

‫في وسط الصفحة و بحجم كبير جدا؟‬

‫‪ .٧‬صح أم خطأ‪:‬‬

‫ال يوجد فرق بين كال من ‪ echo :‬و ‪. print‬‬


‫‪١٥‬‬ ‫الفصل الثالث ‪ :‬التعامل مع المتغيرات و الثوابت‬

‫ھذا الفصل يغطي‪:‬‬

‫المتغيرات في ‪PHP‬‬ ‫‬


‫أنواع البيانات ‪data types‬‬ ‫‬
‫كيفية التعامل مع الثوابت‬ ‫‬
‫المعامالت الخاصة و كيفية استخدامھا‬ ‫‬

‫المتغيرات ‪variables‬‬

‫المتغير ھو عبارة عن حاوية ‪ container‬تستخدم لحفظ البيانات بشكل مؤقت ‪ .‬في ‪ PHP‬يمكن أن تحتوي المتغيرات‬
‫على أي نوع من البيانات كاألرقام أو النصوص أو المصفوفات ‪ .‬و تعتبر ‪ PHP‬من اللغات الغير صارمة من ناحية‬
‫نوع البيانات ‪ .loosely typed‬بمعنى أن نوع البيانات يختلف باختالف القيمة المخزنة داخل المتغير‪.‬‬

‫تسمية المتغيرات ‪naming variables‬‬

‫لتعريف المتغيرات في ‪ PHP‬يجب األخذ في االعتبار عدد من القواعد‪:‬‬


‫ تبدأ المتغيرات في ‪ PHP‬بعالمة الدوالر ‪. $‬‬
‫ الذي يلي عالمة ‪ $‬يجب أن يكون إما حرف ]‪ [a-z A-Z‬أو شرطة سفلية _ ‪.‬‬
‫ ال يسمح بالمسافات ‪ space‬و عالمات الترقيم ‪.punctuation‬‬
‫ أسماء المتغيرات حساسة لحالة الحرف ‪.case sensitive‬‬
‫كما ينصح عند اختيار اسم لمتغير أن يكون االسم المختار ذا معنى‪ .‬أي عند النظر الى اسم المتغير نستطيع أن نعرف‬
‫ما ھي البيانات التي سيتم حفظھا في ذلك المتغير‪.‬‬

‫;' ‪$name = ' OP‬‬


‫;' ‪$_name = 'OP‬‬
‫‪! R30 OP Q‬أ ? ‪$2name = 'OP Q '; //‬‬

‫اسناد القيم للمتغيرات ‪assign values to variables‬‬

‫عملية إعطاء المتغيرات قيم تتم بطريقة سھلة في ‪ . PHP‬كل ما علينا عمله ھو استخدام رمز المساواة ) = (‪ .‬عند‬
‫استخدام ھذا الرمز تتم عملية اسناد القيمة الموجودة في اليسار الى المتغير الموجود في الطرف االيمن‪.‬‬

‫;" )‪$name = " !S‬‬


‫في المثال السابق‪:‬‬
‫‪ $name‬ھو اسم المتغير‬
‫عالمة المساواة‬ ‫=‬
‫"محمد" ھي قيمة المتغير‬
‫كما يجب أن ال ننسى أن ننھي العبارة بفاصلة منقوطة‪ .‬المثال التالي يوضح كيفية التعامل مع المتغيرات‪:‬‬
‫‪١٦‬‬ ‫الفصل الثالث ‪ :‬التعامل مع المتغيرات و الثوابت‬

‫>‪<html‬‬
‫>‪<head><title>Variables</title‬‬
‫>‪</head‬‬
‫>‪<body‬‬
‫‪<?php‬‬
‫;" )‪$name = " T ! !S‬‬
‫>?‬
‫>‪<b>  #) </b> <h4> <?php echo $name; ?> </h4‬‬
‫>‪</body></html‬‬

‫كما ھو واضح من المثال السابق ستقوم ‪ echo‬بطباعة قيمة المتغير ‪.$name‬‬


‫كما يمكن إسناد قيمة متغير إلى متغير آخر أو أن تكون قيمة المتغير ناتجة من تنفيذ عملية حسابية أو يتم إدخالھا عن‬
‫طريق المستخدم لقيمة المتغير عن طريق نموذج ‪.HTML form‬‬

‫‪<?php‬‬
‫إ ء )> ? ‪//‬‬
‫;‪$now = 2012‬‬

‫ا‪%‬د ? )> ا‪// @_ >) /‬‬


‫;‪$currentYear = $now‬‬

‫? )> ( ‪// `#  a‬‬


‫;‪$lastYear = $currentYear - 1‬‬
‫;">‪echo "<div dir=rtl‬‬
‫;' إ‪ /,3‬ا'م' ‪echo‬‬
‫;‪echo $lastYear‬‬
‫;' )‪ &  #‬ا'م >‪echo'<br/‬‬
‫;‪echo $currentYear‬‬
‫;">‪echo "</div‬‬
‫>?‬

‫إنتھى العام ‪٢٠١١‬‬


‫مرحبا بكم في العام ‪٢٠١٢‬‬

‫االسناد بواسطة المرجع ‪assign by reference‬‬

‫تدعم ‪ PHP‬ميزة أخرى عند التعامل مع المتغيرات و ذلك عن طريق االسناد بواسطة المرجع‪ .‬بمعنى أن المتغير‬
‫الجديد يقوم باإلشارة إلى المتغير األساسي‪ .‬ولإلسناد بواسطة المرجع نقوم بإدراج العالمة & قبل اسم المتغير الذي‬
‫ستتم االشارة إليه‪ .‬في ھذه الحالة ستصبح المتغيرات مرتبطة ببعضھا البعض‪.‬‬
‫‪<?php‬‬
‫;'‪$foo = 'Bob‬‬ ‫‪// Assign the value 'Bob' to $foo‬‬
‫;‪$bar = &$foo‬‬ ‫‪// Reference $foo via $bar.‬‬
‫‪$bar = "My name is $bar<br/>"; // Alter $bar...‬‬
‫;‪echo $bar‬‬
‫;‪echo $foo‬‬ ‫‪// $foo is altered too.‬‬
‫>?‬
‫‪١٧‬‬ ‫الفصل الثالث ‪ :‬التعامل مع المتغيرات و الثوابت‬

‫‪My name is Bob‬‬


‫‪My name is Bob‬‬

‫لحذف قيمة متغير‪ ،‬نستخدم الدالة ‪ . unset( ) :‬مثال‪:‬‬


‫;) ‪unset( $name‬‬

‫أنواع البيانات في ‪PHP‬‬

‫تدعم ‪ PHP‬العديد من أنواع البيانات ‪ .data types‬و يمكن تصنيف أنواع البيانات في ‪ PHP‬إلى ثالث فئات‪:‬‬
‫ أنواع بيانات بقيمة واحدة ‪ scalar‬و تنقسم إلى أربعة أقسام‪:‬‬
‫‪int‬‬ ‫رقم صحيح بدون فاصلة عشرية كـ ‪٤٥٦٠‬‬
‫‪float‬‬ ‫رقم صحيح بفاصلة عشرية كـ ‪٤٥٫٣٢٥‬‬
‫‪string‬‬ ‫بيانات ثنائية كالنصوص أو الصور ‪ ....‬الخ‬
‫‪boolean‬‬ ‫قيمة تحتمل أن تكون ‪ TRUE‬أو ‪FALSE‬‬

‫أنواع بيانات تدعم أكثر من قيمة ‪composite‬‬ ‫‬


‫‪array‬‬ ‫سلسلة من البيانات المرتبة في عناصر‬
‫‪object‬‬ ‫يمكن أن تحتوي على بيانات أو شفرة برمجية‬

‫أنواع بيانات خاصة‬ ‫‬


‫‪NULL‬‬ ‫تدل على أن المتغير ال يحتوي على قيمة ) قيمة خالية(‬
‫‪resources‬‬ ‫تدل على أن المتغير يحتوي على مصدر بيانات خارجي‬

‫‪<?php‬‬

‫;‪$valid_student = TRUE‬‬

‫;‪$student_id = 181280000‬‬

‫;"‪$student_name = "Ali Mohammad‬‬

‫;‪$student_gpa = 3.75‬‬

‫;‪$student_phone=null‬‬

‫;)"‪$student_courses = ("cs101","cs102","cs103‬‬

‫>?‬
‫‪١٨‬‬ ‫الفصل الثالث ‪ :‬التعامل مع المتغيرات و الثوابت‬

‫فرض نوع بيانات ‪type casting‬‬

‫كما سبق وأن اشرنا بأن ‪ PHP‬من اللغات التي ال تفرض تحديد نوع بيانات المتغير عند تعريفه كما ھو الحال في‬
‫لغات البرمجة كـ ‪ C‬و ‪ .java‬لكن مفسر اللغة ‪ PHP interpreter‬يقوم بتحديد نوع البيانات تلقائيا استنادا على القيمة‬
‫المخزنة في المتغير‪ .‬لكن قد نحتاج في بعض الحاالت لفرض نوع بيانات محدد‪.‬‬

‫‪<?php‬‬
‫!د ‪$value1 = 10; // OSP‬‬
‫!د ‪ OSP‬ي ‪$value2 = 20.38; //‬‬
‫;‪$value3 = $value1 + $value2‬‬
‫;‪echo $value3‬‬
‫>?‬

‫‪30.38‬‬

‫و كما ھو مالحظ فإن ناتج المتغير ‪ $value3‬عبارة عن رقم صحيح عشري ‪ .float‬و في حال أردنا أن يكون الناتج‬
‫عدد صحيح فإننا نقوم بفرض نوع البيانات ‪ int‬كما يلي‪:‬‬
‫‪<?php‬‬
‫!د ‪$value1 = 10; // OSP‬‬
‫!د ‪ OSP‬ي ‪$value2 = 20.38; //‬‬
‫;‪$value3 = $value1 + $value2‬‬
‫‪echo $value3.'<br/>';// before type casting‬‬
‫‪echo (int)$value3; // type casting‬‬
‫>?‬

‫‪30.38‬‬
‫‪30‬‬

‫التعامل مع الثوابت ‪constants‬‬

‫على عكس المتغير و الذي من الممكن أن تتغير قيمته في أثناء سير البرنامج‪ ،‬فإن الثابت يحتوي على قيمة ثابتة ال‬
‫تتغير‪ .‬و لتعريف الثابت في ‪ PHP‬يجب األخذ في االعتبار مايلي‪:‬‬
‫ إتباع القواعد الخاصة بتعريف المتغير باستثناء عالمة ‪ $‬و التي ليست مطلوبة مع الثوابت‪.‬‬
‫ استخدام الدالة ) (‪.define‬‬
‫ ينصح عند تسمية الثوابت بأن تكتب بأحرف كبيرة ‪. capital letters‬‬
‫‪<?php‬‬


'‪ u‬ا*‪define("COURSE","PHP Programming"); // t‬‬
‫;)‪define("YEAR",1430‬‬

‫‪ a‬ا*‪echo COURSE; // t‬‬


‫;‪echo '</br>'.YEAR‬‬
‫>?‬
‫في الشفرة السابقة ‪:‬‬
‫ ‪ COURSE‬ھو اسم الثابت و ‪ PHP Programming‬ھي القيمة‪.‬‬
‫ ‪ YEAR‬ھو اسم الثابت و ‪ 1430‬ھي القيمة ) وألنھا قيمة رقمية لم توضع بين عالمات اقتباس(‪.‬‬
١٩ ‫ التعامل مع المتغيرات و الثوابت‬: ‫الفصل الثالث‬

string concatenation ‫ربط النصوص‬

. ( . ) ‫ نقوم باستخدام اداة الربط‬PHP ‫لربط النصوص في‬


<?php
$name = "Ali Abdullah";
$course = " Web Programming";

echo '<h1>Welcome '.$name.' ,you are enrolled in '.$course


.' course<h1>';
?>

Welcome Ali Abdullah ,you are enrolled in Web


Programming course

arithmetic operators ‫المعامالت الحسابية‬

.‫المعامالت الحاسبية تساعدنا على إجراء العمليات الحسابية األساسية‬

$x = 20 + 14 ; addition ‫الجمع‬
$x = 30 – 10 ; subtraction ‫الطرح‬
$x = 12 * 10 ; multiplication ‫الضرب‬
$x = 30 / 10 ; division ‫القسمة‬
$x = 10 % 3 ; modulus ‫باقي القسمة‬

<?php
// `S‫آ ا') )} ا')|ت ا‬
$num1 = 10;
$num2 = 3;
echo $num1 * $num2;
echo '</br>'.$num1 / $num2;
echo '</br>'.$num1 % $num2;
?>

30
3.3333333333333
1
‫‪٢٠‬‬ ‫الفصل الثالث ‪ :‬التعامل مع المتغيرات و الثوابت‬

‫أسبقية المعامالت ‪operators precedence‬‬

‫عند التعامل مع المعامالت الحسابية في ‪ ،PHP‬فإننا نتبع نفس القواعد المتبعة مع العمليات الحسابية في علم الحساب‪.‬‬
‫لذلك عند تنفيذ أي عملية حسابية ‪ ،‬يجب األخذ في االعتبار أسبقية المعامالت من حيث التنفيذ‪ .‬الجدول التالي يوضح‬
‫ترتيب المعامالت وفقا ألسبقيتھا في التنفيذ‪.‬‬

‫أعلى‬ ‫)(‬
‫‪* / %‬‬
‫أقل‬ ‫‪+ -‬‬

‫معامالت الزيادة و النقصان ‪increment and decrement operators‬‬

‫معامالت الزيادة )‪ (++‬و معامالت النقصان)‪ (--‬من الممكن أن تأتي قبل أو بعد المتغير‪ .‬في حال أتيا قبل المتغير‬
‫فستتم عملية الزيادة أو النقصان بمقدار ) ‪ ( ١‬قبل إجراء أي عملية على المتغير‪ .‬و على العكس تماما إذا أتى أيا ً من‬
‫المعاملين بعد المتغير سيتم إجراء أي عملية على المتغير و من ثم ستتم عملية الزيادة أو النقصان‪.‬‬

‫‪<?php‬‬
‫;‪$num1 = 10‬‬
‫;‪$num2 = 3‬‬

‫‪echo $num1++; // $num1 = 10‬‬


‫‪echo '</br>'.++$num1; // $num1 = 12‬‬
‫‪echo '</br>'.++$num2; // $num2 = 4‬‬
‫>?‬

‫معامالت المقارنة ‪comparison operators‬‬

‫تتيح ‪ PHP‬لنا مقارنة المتغيرات أو القيم عن طريق استخدام معامالت المقارنة‪ .‬الجدول التالي يوضح معامالت‬
‫المقارنة في ‪:PHP‬‬

‫المساواة ) ‪( Equality‬‬ ‫==‬


‫عدم المساواة )‪( Inequality‬‬ ‫=!‬
‫أكبر من ) ‪( Greater than‬‬ ‫>‬
‫أقل من ) ‪( Less than‬‬ ‫<‬
‫أكبر من أو يساوي )‪( Greater than or equal‬‬ ‫=>‬
‫أقل من أو يساوي ) ‪( Less than or equal‬‬ ‫=<‬
‫التماثل ) ‪( Identical‬‬ ‫===‬
‫غير متماثل ) ‪( Not identical‬‬ ‫==!‬
‫‪٢١‬‬ ‫الفصل الثالث ‪ :‬التعامل مع المتغيرات و الثوابت‬

‫من الجدول السابق يجب اإلشارة إلى أن المقصود بالتماثل ‪ ،Identical‬ھو أن تكون المتغيرات متساوية في القيمة و‬
‫من نفس نوع البيانات ‪.data type‬‬

‫عالمة )=( المفردة ال تستخدم في عملية المقارنة ‪ ،‬تستخدم فقط عند إسناد القيم للمتغيرات‪.‬‬

‫المعامالت المنطقية ‪logical operators‬‬

‫تُستخدم المعامالت المنطقية عادة مع الشروط المركبة و تكون النتيجة إما ‪ TRUE‬أو ‪. FALSE‬‬

‫مثال‬ ‫الوصف‬ ‫المعامل‬


‫‪x=6 y=4‬‬ ‫)و(ھذا المعامل يقوم بإرجاع القيمة ‪ TRUE‬فقط في حال كان‬ ‫‪and‬‬
‫‪(x>5 and y<3)  FALSE‬‬ ‫ناتج كل الشرطين ‪ .TRUE‬بخالف ذلك يقوم بإرجاع القيمة‬
‫‪(x>4 and y<6)  TRUE‬‬ ‫‪.FALSE‬‬
‫‪x=6 y=4‬‬ ‫)أو(ھذا المعامل يقوم بإرجاع القيمة ‪ FALSE‬فقط في حال‬ ‫‪or‬‬
‫‪(x>5 or y<3)  TRUE‬‬ ‫كان ناتج كل الشرطين ‪ .FALSE‬بخالف ذلك يقوم بإرجاع‬
‫‪(x>7 or y<2)  FALSE‬‬ ‫القيمة ‪.TRUE‬‬
‫‪x=6 y=4‬‬ ‫)و(ھذا المعامل يقوم بإرجاع القيمة ‪ TRUE‬فقط في حال كان‬ ‫&&‬
‫‪(x>5 && y<3)  FALSE‬‬ ‫ناتج كل الشرطين ‪ .TRUE‬بخالف ذلك يقوم بإرجاع القيمة‬
‫‪(x>4 && y<6)  TRUE‬‬ ‫‪.FALSE‬‬
‫‪x=6 y=4‬‬ ‫)أو(ھذا المعامل يقوم بإرجاع القيمة ‪ FALSE‬فقط في حال‬ ‫||‬
‫‪(x>5 || y<3)  TRUE‬‬ ‫كان ناتج كل الشرطين ‪ .FALSE‬بخالف ذلك يقوم بإرجاع‬
‫‪(x>7 || y<2)  FALSE‬‬ ‫القيمة ‪.TRUE‬‬
‫‪x=6 y=4‬‬ ‫)نفي(ھذا المعامل يقوم بعكس قيمة الشرط‪.‬‬ ‫!‬
‫‪!(x>y)  FALSE‬‬

‫معامل منع عرض الخطأ ‪error supersession operator‬‬

‫يُستخدم المعامل @ في ‪ PHP‬إلجبار مفسر اللغة ‪ interpreter‬بمنع عرض رسائل الخطأ ‪error‬‬
‫‪ messages‬أو التحذير ‪ warning messages‬للمستخدم‪.‬‬

‫‪<?php‬‬
‫*‪/‬‬
‫& ه‪ 12‬ا‪ - ( S‬م )` ا> 'ض ر‪ %‬ا‪ 2S‬ا
 )(‬
‫)‪S‬و ا‪ / `-‬ا" و ا` ‪ -% 30‬ا> ‪@ )' x‬‬
‫‪*/‬‬
‫;‪@$x = 10/0‬‬
‫;‪echo $x‬‬
‫>?‬
‫‪٢٢‬‬ ‫الفصل الثالث ‪ :‬التعامل مع المتغيرات و الثوابت‬

‫تطبيق عملي‬

‫في ھذا التطبيق سنقوم بتعريف اربع متغيرات ‪ a‬و ‪ b‬و ‪ c‬و ‪ . d‬و سنقوم بإسناد القيم التالية للمتغيرات على التوالي‪:‬‬
‫ ‪PHP‬‬
‫ ‪40‬‬
‫ ‪25.32‬‬
‫ ‪TRUE‬‬
‫سنستعين في ھذا التطبيق بالدالة ) (‪ gettype‬و التي تقوم بإرجاع نوع البيانات و من ثم طباعة الناتج‪ .‬قم بفتح برنامج‬
‫‪ Notepad++‬ثم قم بكتابة الشفرة التالية‪:‬‬
‫‪<?php‬‬
‫ه ? '‪ u‬ا>ات ا  ‪//‬‬
‫;'‪$a = 'PHP‬‬
‫;‪$b = 40‬‬
‫;‪$c = 25.32‬‬
‫;‪$d = TRUE‬‬
‫*‪/‬‬
‫)(‪!% ? gettype‬ء ا!ا‬
‫ ‪ -3‬م 'ض ‪ 3‬ع ا‪3‬ت  )>‬
‫‪*/‬‬
‫;'>"‪echo'<table border="1" dir="rtl" align="center‬‬
‫;'>‪ 3:'.gettype($a).'</td></tr‬ع ‪ $a R
3‬ا>>‪echo'<tr><td‬‬
‫;'>‪ 3:'.gettype($b).'</td></tr‬ع ‪ $b R
3‬ا>>‪echo'<tr><td‬‬
‫;'>‪ 3:'.gettype($c).'</td></tr‬ع ‪ $c R
3‬ا>>‪echo'<tr><td‬‬
‫;'>‪ 3:'.gettype($d).'</td></tr‬ع ‪ $d R
3‬ا>>‪echo'<tr><td‬‬
‫;'>‪echo'</table‬‬
‫>?‬

‫‪ .‬و من النافذة التالية قم بما يلي‪:‬‬ ‫بعد االنتھاء من كتابة الشفرة السابقه ‪ ،‬قم بالنقر على زر حفظ‬
‫‪ .١‬قم بتغيير مكان الحفظ عن طريق االنتقال للمجلد ‪.C:\xammp\htdocs‬‬
‫‪ .٢‬قم بتسمية الملف باسم ‪. variables.php‬‬
‫‪ .٣‬غير نوع الملف ‪ Save as type‬من القائمة المنسدلة ليصبح )*‪ All types(*.‬أو ‪PHP Hypertext‬‬
‫‪.Preprocessor files‬‬
‫‪ .٤‬انقر على الزر ‪.Save‬‬
‫بعد االنتھاء من عملية الحفظ ‪،‬افتح متصفح االنترنت و اكتب العنوان التالي‪ http://localhost/variables.php :‬و‬
‫من ثم الحظ الناتج‪.‬‬
‫‪٢٣‬‬ ‫الفصل الثالث ‪ :‬التعامل مع المتغيرات و الثوابت‬

‫أسئلة نھاية الفصل‬

‫‪ .١‬قم بكتابة برنامج يقوم بتحويل العملة من دوالر امريكي الى ﷼ سعودي‪ .‬علما بأن سعر صرف‬

‫الدوالر= ‪ ٣٫٧٥‬﷼ ‪.‬‬

‫‪ .٢‬متى نستخدم المتغيرات و متى نستخدم الثوابت‪.‬‬

‫‪ .٣‬ما الفرق بين كال من‪ (= =) ، (= = =) :‬و )=(‪.‬‬

‫‪ .٤‬كيف نستطيع منع عرض رسائل الخطأ للمستخدم ؟‬


‫‪٢٤‬‬ ‫الفصل الرابع ‪ :‬التحكم في سير البرنامج‬

‫ھذا الفصل يغطي‪:‬‬

‫كيف التعامل مع جمل الشرط‬ ‫‬


‫أنواع جمل التكرار المختلفة‬ ‫‬
‫كيفية التحكم في التكرار‬ ‫‬

‫جملة الشرط ‪if‬‬


‫تعتبر جملة الشرط ‪ if‬من ابسط جمل الشرط في ‪ . PHP‬و تستخدم إلختبار شرط ما و من ثم تنفيذ جواب الشرط إذا‬
‫كان ناتج الشرط ‪ .TRUE‬وصيغتھا العامة كالتالي‪:‬‬

‫) ‪if ( condition is TRUE‬‬


‫{‬
‫ا د ا‪2‬ي ‪# & 2%‬ل
‪ -S‬اط ‪//‬‬
‫}‬

‫جملة الشرط ‪if else‬‬

‫في ھذه الحالة سيتم تنفيذ الجزء التابع لجملة ‪ if‬إذا كان ناتج الشرط ‪ .TRUE‬بخالف ذلك سيتم تنفيذ الجزء البرمجي‬
‫التابع لـ ‪:else‬‬

‫) ‪if ( condition is TRUE‬‬


‫{‬
‫ا د ا‪2‬ي ‪# & 2%‬ل
‪ -S‬اط ‪//‬‬
‫}‬
‫‪else‬‬
‫{‬
‫ا د ا‪2‬ي ‪# & 2%‬ل  ‪ -S‬اط ‪//‬‬
‫}‬

‫جمل الشرط المتداخلة ‪if elseif else‬‬


‫في ھذه الحالة سيتم اختبار أكثر من شرط و لن يتم تنفيذ إال الجزء البرمجي الذي تكون فيه نتيجة الشرط ‪TRUE‬‬
‫بخالف ذلك سيتم تنفيذ الجزء البرمجي التابع لجملة ‪: else‬‬

‫) ‪if ( condition is TRUE‬‬


‫{‬
‫ا د ا‪2‬ي ‪# & 2%‬ل
‪ -S‬اط ‪//‬‬
‫}‬
‫)‪elseif( condition 2 is TRUE‬‬
‫{‬
‫ا د ا‪2‬ي ‪# & 2%‬ل
‪ -S‬اط ا*‪// 3‬‬
‫}‬
‫‪.‬‬
‫‪.‬‬
‫‪.‬‬
‫‪else‬‬
‫{‬
‫ا د ا‪2‬ي ‪# & 2%‬ل  ‪ -S‬أي …ط ‪//‬‬
‫}‬
‫‪٢٥‬‬ ‫الفصل الرابع ‪ :‬التحكم في سير البرنامج‬

‫يمكن كتابة ‪ elseif‬ككلمة واحدة أو كلمتين منفصلتين‪else if :‬‬

‫‪<?php‬‬
‫;‪$student_mark = 73‬‬
‫)‪if($student_mark <60‬‬
‫{‬
‫;"هـ" = ‪$result‬‬
‫}‬
‫)‪elseif($student_mark<70‬‬
‫{‬
‫;"د" = ‪$result‬‬
‫}‬
‫)‪elseif($student_mark<80‬‬
‫{‬
‫;"ج" = ‪$result‬‬
‫}‬
‫)‪elseif($student_mark<90‬‬
‫{‬
‫;"ب" = ‪$result‬‬
‫}‬
‫‪else‬‬
‫{‬
‫;"أ" = ‪$result‬‬
‫}‬
‫;'>";‪echo'<div style="direction:rtl‬‬
‫;‪!-
: '.$result‬ك & ادة ه ' ‪echo‬‬
‫;'>‪echo'</div‬‬
‫>?‬

‫ ك
ادة ه‪ :‬ج‬

‫جملة القرار ‪switch‬‬

‫تستخدم جملة القرار ‪ switch‬كبديل لجملة الشرط ‪ . if else‬في حالة جملة ‪ switch‬نقوم باختبار قيمة متغير ما مقابل‬
‫مجموعة من القيم ‪ .‬الصيغة العامة لجملة القرار ‪ switch‬كالتالي‪:‬‬
‫‪٢٦‬‬ ‫الفصل الرابع ‪ :‬التحكم في سير البرنامج‬

‫)‪switch(variable‬‬
‫{‬
‫‪case value1:‬‬
‫ا د ا‪2‬ي ‪# & 2%‬ل آ‪ ? t3‬ا>
`وي ه‪ 12‬ا‪//-‬‬
‫;‪break‬‬

‫‪case value2:‬‬
‫ا د ا‪2‬ي ‪# & 2%‬ل آ‪ ? t3‬ا>
`وي ه‪ 12‬ا‪//-‬‬
‫;‪break‬‬

‫………‬
‫………‬

‫‪default:‬‬
‫ا د ا‪2‬ي ‪# & 2%‬ل 
`وي ? ا> ا )( ا‪// -‬‬
‫ا`‪-‬‬
‫}‬

‫المتغير الذي سيتم اختبار قيمتة سيوضع بين القوسين التابعين لـ ‪. switch‬أما العبارة ‪ case‬فتمثل القيمة أو القيم التي‬
‫سيتم اختبار قيمة المتغير مقابلھا‪ .‬بعد ادخال المتغير المراد اختباره سيقوم مفسر ‪ PHP‬باختبار قيمة ذلك المتغير‬
‫مقابل كل جملة ‪ . case‬في حال كانت نتيجة اختبار ايا من جمل ‪ case‬تساوي ‪ TRUE‬سيقوم مفسر ‪ PHP‬بتنفيذ‬
‫الشفرة التابعة لھا حتى يصل عند جملة ‪ ،break‬بعد ذلك سيقوم بالخروج من جملة ‪.switch‬‬

‫لكن ما الذي سيحدث في حال نسي المبرمج كتابة عبارة ‪ break‬ألي من عبارة ‪ case‬؟‬

‫في ھذه الحالة‪ ،‬سيقوم مفسر ‪ PHP‬بتنفيذ الشفرة البرمجية و التوقف عند أقرب عبارة ‪ break‬حتى و ان كانت تتبع‬
‫لعبارة ‪ case‬اخرى‪.‬‬
‫اخيرا‪ ،‬اذا لم يجد مفسر ‪ PHP‬ايا من جمل ‪ case‬قيمتھا تساوي قيمة المتغير المراد اختباره‪ ،‬سيقوم المفسر بتنفيذ‬
‫الشفرة التابعة لعبارة ‪.default‬‬

‫‪<?php‬‬
‫دا ار‹ )(‪/* date‬‬
‫‪ -
timestamp‬م ‪  S‬ا اŒ)‬
‫">
ر‹ ? ‪-‬اءة‬
‫‪*/‬‬
‫;)"‪$d=date("D‬‬
‫;'>";‪echo'<div style="direction:rtl‬‬
‫)‪switch ($d‬‬
‫{‬
‫‪case "Mon":‬‬
‫;"ا م ه اŽ(" ‪echo‬‬
‫;‪break‬‬
‫‪case "Tue":‬‬
‫;"ا م ه ا*|Žء" ‪echo‬‬
‫;‪break‬‬
‫‪case "Wed":‬‬
‫;"ا م ه ار'ء" ‪echo‬‬
‫;‪break‬‬
‫‪٢٧‬‬ ‫الفصل الرابع ‪ :‬التحكم في سير البرنامج‬

‫‪case "Thu":‬‬
‫;"ا م ه ا" ‪echo‬‬
‫;‪break‬‬
‫‪case "Fri":‬‬
‫;"ا م ه ا'" ‪echo‬‬
‫;‪break‬‬
‫‪case "Sat":‬‬
‫;"ا م ه ا`‪echo "t‬‬
‫;‪break‬‬
‫‪case "Sun":‬‬
‫;"ا م ه ا‪echo "!#0‬‬
‫;‪break‬‬
‫‪default:‬‬
‫;"ا م ‪') Q‬وف؟" ‪echo‬‬
‫}‬
‫;'>‪echo'</div‬‬
‫>?‬

‫القيم النصية لعبارة ‪ case‬يجب أن تحصر بين عالمتي تنصيص‪ ،‬على عكس القيم الرقمية التي ال تتطلب‬
‫حصرھا بين عالمات التنصيص‪.‬‬

‫المعامل الشرطي ‪ternary operator ?:‬‬

‫المعامل الشرطي ‪ ?:‬يستخدم كطريقة مختصرة للتحقق من الشروط البسيطة‪ .‬الصيغة العامة للمعامل الشرطي‬
‫كالتالي‪:‬‬

‫; ‪condition? value if ture : value if FALSE‬‬

‫‪<?php‬‬
‫;‪$age=20‬‬
‫; '‪$result = $age>18? '“' : 'a‬‬
‫;‪echo $result‬‬
‫>?‬

‫جملة التكرار ‪while‬‬

‫تستخدم جملة التكرار ‪ while‬لتكرار تنفيذ شفرة برمجية طالما كانت نتيجة الشرط التابع لھا تساوي ‪.TRUE‬‬
‫و الصيغة العامة لجملة ‪ while‬ھي كالتالي‪:‬‬
‫) ‪while ( condition‬‬
‫{‬
‫اŒء ا) ا‪2‬ي ‪# & 12
%‬ل آ‪ 3 t3‬اط ‪// SSP‬‬
‫}‬
‫‪٢٨‬‬ ‫الفصل الرابع ‪ :‬التحكم في سير البرنامج‬

‫‪<?php‬‬
‫;‪$i = 0‬‬
‫;‪$num = 50‬‬
‫) ‪while( $i < 10‬‬
‫{‬
‫;‪$num--‬‬
‫;‪$i++‬‬
‫}‬
‫;'>"‪echo'<div align="right‬‬
‫;'>‪ '.'<br/‬اار
?‪echo'! t‬‬
‫;'>‪echo'$i='.$i.'<br/‬‬
‫;‪echo'$num='.$num‬‬
‫;'>‪echo'</div‬‬
‫>?‬

‫جملة التكرار توقفت عند‬


‫‪$i=10‬‬
‫‪$num=40‬‬

‫جملة التكرار ‪do-while‬‬

‫كما ھو مالحظ مع جملة التكرار ‪ ،while‬يتم اختبار الشرط في بداية التكرار‪ .‬على العكس في جملة التكرار ‪do-‬‬
‫‪ ، while‬فإن الشرط يتم اختباره في نھاية التكرار‪ .‬ھذا يعني أن التكرار سيتم تنفيذه مرة واحدة على األقل‪ .‬المثال‬
‫التالي نسخة معدلة من المثال السابق‪:‬‬

‫‪<?php‬‬
‫;‪$i = 0‬‬
‫;‪$num = 50‬‬
‫*‪/‬‬
‫&  اار ه‪  12‬ا@ر اط & ‪ ,3‬اŒء اص ‪,‬‬
‫‪ 2
% •2‬اŒء ا) ا}  اار )ة وا‪!#‬ة‬
‫‪ /‬ا‪?0‬‬
‫‪*/‬‬
‫‪do‬‬
‫{‬
‫;‪$num--‬‬
‫;‪$i++‬‬
‫;) ‪}while( $i < 10‬‬
‫;'>"‪echo'<div align="right‬‬
‫;'>‪ '.'<br/‬اار
?‪echo'! t‬‬
‫;'>‪echo'$i='.$i.'<br/‬‬
‫;‪echo'$num='.$num‬‬
‫;'>‪echo'</div‬‬
‫>?‬
‫‪٢٩‬‬ ‫الفصل الرابع ‪ :‬التحكم في سير البرنامج‬
‫جملة التكرار ‪for‬‬

‫جملة التكرار تستخدم لتكرار جزء من الشفرة البرمجية لعدد محدد يتم تحديده في جملة التكرار ‪ ) for‬على عكس‬
‫جملة التكرار ‪ .(while‬و صيغتھا العامة كالتالي‪:‬‬

‫)‪for( initial value ; condition ; increment or decrement‬‬


‫{‬
‫اŒء ا) ا‪2‬ي ‪# & 12
%‬ل آن ? اط ‪// SSP‬‬
‫}‬

‫و كما ھو مالحظ من الصيغة العامة لجملة التكرار ‪ for‬فھي تتكون من ثالث اجزاء‪:‬‬
‫ ‪ Initial value‬القيمة االبتدائية للعداد‪.‬‬
‫ ‪ Condition‬الشرط‪.‬‬
‫ ‪ Increment or decrement‬الزيادة أو النقصان‪.‬‬
‫المثال التالي يقوم بطباعة مجموع األعداد الزوجية من ‪ ٠‬الى ‪:١٠٠‬‬

‫‪<?php‬‬
‫;‪$count=0‬‬
‫)‪for($i=0;$i<=100;$i+=2‬‬
‫{‬
‫;‪$count = $count + $i‬‬
‫}‬
‫;‪echo $count‬‬
‫>?‬

‫‪2550‬‬

‫جمل ‪ for‬المتداخلة‬

‫كما عملنا مع جملة الشرط ‪ ،if‬فإنه من الممكن أن تتداخل أكثر من جملة ‪ .for‬المثال يوضح كيفية التعامل مع جمل‬
‫‪ for‬المتداخلة‪:‬‬
‫‪<?php‬‬
‫‪ -‬م ˜‪3‬ء !ول  ن )( ‪//‬‬
‫أ!ة ‪ P, 4‬ف ‪// 3‬‬
‫;">"\‪echo "<table border=\"1‬‬
‫{ )‪for ($row=1; $row<4; $row++‬‬
‫;">‪echo "<tr‬‬
‫{ )‪for ($col=1; $col<5; $col++‬‬
‫;">‪echo "<td>Row $row, Column $col</td‬‬
‫}‬
‫;">‪echo "</tr‬‬
‫}‬
‫;">‪echo "</table‬‬
‫>?‬

‫كما ھو واضح من المثال السابق‪ ،‬لدينا جملتي ‪ ،for‬األول ھي جملة ‪ for‬الخارجية ‪ outer loop‬و التي تقوم بطباعة‬
‫الصفوف‪ .‬و األخرى ھي جملة ‪ for‬الداخلية ‪ inner loop‬والمسئولة عن طباعة الخاليا داخل الصفوف‪.‬‬
‫‪٣٠‬‬ ‫الفصل الرابع ‪ :‬التحكم في سير البرنامج‬

‫ايقاف تنفيذ التكرار ‪interrupting loop‬‬

‫الشرط‬ ‫في حال أردنا ايقاف تنفيذ التكرار ألي سبب كان فإننا نقوم بإدراج ‪ break‬داخل جملة شرط‪ .‬عند تحقق ذلك‬
‫ستقوم ‪ break‬بإنھاء جملة التكرار كاملة‪.‬‬

‫تجاھل تنفيذ التكرار ‪skipping loop‬‬

‫على النقيض من عبارة ‪ break‬التي تقوم بالخروج من التكرار‪ ،‬تُستخدم عبارة ‪ continue‬في حال أردنا تجاھل‬
‫التكرار الحالي و االنتقال الى قيمة التكرار التالية‪.‬‬

‫جملة التكرار ‪foreach‬‬

‫ھذا النوع من جمل التكرار يُستخدم فقط مع المصفوفات‪ .‬و تأتي على شكلين ‪ .‬و في كال الحالتين يتم استخدام متغير‬
‫مؤقت ‪ temporary variable‬للتعامل مع عناصر المصفوفة‪.‬‬

‫في حال أردنا التعامل فقط مع القيم لكل عنصر داخل المصفوفة ‪ ، elements values‬فتكون الصيغة‬ ‫‬
‫العامة لجملة ‪ foreach‬كالتالي‪:‬‬

‫‪foreach( array_name‬‬ ‫‪as‬‬ ‫)‪temporary_variable‬‬


‫{‬
‫…ة )
‪ / 2‬ا> اš?‪//t‬‬
‫}‬

‫ھذا النوع جملة ‪ foreach‬يستخدم مع المصفوفات الرقمية ‪. numeric arrays‬‬

‫الشكل الثاني من جملة التكرار ‪ foreach‬يُستخدم عادة في حال أردنا التعامل مع القيم ‪ values‬و المفاتيح‬ ‫‬
‫‪ keys‬لعناصر المصفوفة‪ .‬ھذا النوع يستخدم عادة مع المصفوفات الترابطية ‪.associative arrays‬‬
‫الصيغة العامة لھذا النوع من جملة ‪ foreach‬كالتالي‪:‬‬

‫)‪foreach( array_name as key => value‬‬


‫{‬
‫…ة )
‪ / 2‬اح و ا‪// "' -‬‬
‫}‬

‫الحقا‪ ،‬في الفصل الخامس سنتطرق الى العديد من األمثلة لجملة التكرار ‪ foreach‬عندما نتعامل مع المصفوفات‪.‬‬
٣١ ‫ التحكم في سير البرنامج‬: ‫الفصل الرابع‬

‫تطبيق عملي‬

.‫في ھذا التطبيق سنقوم بكتابة شفرة برمجية تقوم بطباعة جدول الضرب‬
<html>
<head>
<style>
/*
‫ …ة‬css
‫ ا!ول‬,œ) ` ,
‫و ا‬
*/
table{
border:1px solid #333;
text-align:center;
}
td{
border:1px solid #CCC;
}
.higlight{
background-color:#0C9;
}
</style>
</head>
<body>
<?php
echo'<table>';
echo'<tr>';
//‫ ا!ول‬,œ) / ‫ظ‬S Q‫ء @ &ر‬3˜ ? ‫ه‬
echo'<td>*</td>';
/*
‫ول )( ا!ول‬0‫ ا‬u"‫ ا‬a (  ¢`) ‫ اار ا‬
*/
for($i=1;$i<=10;$i++)
{
echo "<td class='higlight'>$i</td>";
}
echo'</tr>';

/*
‫ي‬2‫ول & ا!ول و ا‬0‫ م   ا' د ا‬-
‫ اار ار‬-#
١ ?‫!أ ( ا‬
‫ب‬¤‫  ا‬, ‫ م‬-
@‫ اار ا!ا‬-#
>‫ب ا‬¤ ‫ م‬-3 ‫ ه‬j
‫ي ? ا' د‬2‫و ا‬
> t
١٠ ! ,
‫ و‬١ ‫ ن رة ? )Œا!ة
!أ ب‬% ‫ي‬2‫وا‬
*/
for($j=1;$j<=10;$j++)
{
echo "<tr><td class='higlight'>$j</td>";
for($t=1;$t<=10;$t++)
‫‪٣٢‬‬ ‫الفصل الرابع ‪ :‬التحكم في سير البرنامج‬

‫;'>‪echo '<td>'.($t*$j).'</td‬‬
‫;'>‪echo'</tr‬‬
‫}‬
‫;'>‪echo'</table‬‬
‫>?‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .‬و من النافذة التالية قم بما يلي‪:‬‬ ‫بعد االنتھاء من كتابة الشفرة السابقه ‪ ،‬قم بالنقر على زر حفظ‬
‫‪ .١‬قم بتغيير مكان الحفظ عن طريق االنتقال للمجلد ‪.C:\xammp\htdocs‬‬
‫‪ .٢‬قم بتسمية الملف باسم ‪. multitable.php‬‬
‫‪ .٣‬غير نوع الملف ‪ Save as type‬من القائمة المنسدلة ليصبح )*‪ All types(*.‬أو ‪PHP Hypertext‬‬
‫‪.Preprocessor files‬‬
‫‪ .٤‬انقر على الزر ‪.Save‬‬
‫بعد االنتھاء من عملية الحفظ ‪،‬افتح متصفح االنترنت و اكتب العنوان التالي‪http://localhost/ multitable.php :‬‬
‫و من ثم الحظ الناتج‪.‬‬
‫‪٣٣‬‬ ‫الفصل الرابع ‪ :‬التحكم في سير البرنامج‬

‫أسئلة نھاية الفصل‬

‫‪ .١‬أكتب برنامج يقوم بحساب مجموع االعداد الفردية من ‪ ١‬الى ‪. ١٠٠‬‬

‫‪ .٢‬ما الفرق بي كال من‪ while :‬و ‪ do-while‬؟‬

‫‪ .٣‬ما ھي أنواع جملة التكرار ‪ foreach‬و متى يُستخدم كل نوع؟‬

‫‪ .٤‬ما الفرق بين ‪ break‬و ‪ continue‬؟‬

‫‪ .٥‬أكتب برنامج يقوم بطباعة القيم من ‪ ١‬الى ‪ ١٠‬مع تجاھل طباعة القيمة ‪. ٥‬‬
‫‪٣٤‬‬ ‫الفصل الخامس ‪ :‬التعامل مع المصفوفات ‪Arrays‬‬

‫ھذا الفصل يغطي‪:‬‬

‫مفھوم المصفوفات‬ ‫‬


‫المصفوفة الرقمية و كيفية التعامل معھا‬ ‫‬
‫المصفوفة الترابطية و كيفية التعامل معھا‬ ‫‬
‫المصفوفات ذات البعدين و المصفوفات الجاھزة‬ ‫‬

‫ما ھي المصفوفة‬

‫المصفوفة ‪ array‬عبارة عن متغير لديه االمكانية لتخزين أكثر من قيمة حتى لو اختلفت أنواعھا‪ .‬كل مصفوفة تتكون‬
‫من مجموعة من العناصر‪ .‬و كل عنصر يتكون من جزئين قيمة ‪ value‬و مفتاح ‪ . key‬و تنقسم المصفوفات في‬
‫‪ PHP‬إلى ثالثة أنواع و ھي ‪:‬‬

‫المصفوفة الرقمية ‪.numeric array‬‬ ‫‬


‫المصفوفة الترابطية ‪.associative array‬‬ ‫‬
‫المصفوفات ذات البعدين ‪.multidimensional array‬‬ ‫‬

‫المصفوفة الرقمية ‪numeric array‬‬

‫في ھذا النوع من المصفوفات يتم استخدام األرقام لفھرسة عناصر المصفوفة لتسھيل عملية التعامل معھا‬
‫الحقا‪.‬‬

‫‪key‬‬ ‫‪value‬‬
‫‪0‬‬ ‫أحمر‬
‫‪1‬‬ ‫أخضر‬
‫‪$colors‬‬ ‫أزرق‬
‫‪2‬‬
‫‪3‬‬ ‫أبيض‬
‫‪4‬‬ ‫أسود‬

‫كما ھو واضح من الشكل السابق ‪ ،‬فإن اسم المصفوفة ھو ‪ colors‬و تحتوي على خمس عناصر‪ .‬يتم بدء فھرسة‬
‫العناصر من الرقم صفر الى ن‪ ، (0 …. n-1) ١-‬حيث تمثل ن مجموع عناصر المصفوفة‪ .‬السترجاع قيمة عنصر‬
‫ما في المصفوفة‪ ،‬نقوم بكتابة اسم المصفوفة و من ثم قوسين مربعين ‪ ،‬و بينھما رقم المفتاح لذلك العنصر كالتالي‪:‬‬

‫]‪$colors[2‬‬
‫‪٣٥‬‬ ‫الفصل الخامس ‪ :‬التعامل مع المصفوفات ‪Arrays‬‬

‫طريقة انشاء المصفوفة الرقمية‬

‫يتم انشاء المصفوفة الرقمية بإحدى الطرق التاليه‪:‬‬

‫الطريقة األولى‬
‫=]‪$colors[0‬‬ ‫;'أ‪'#‬‬
‫=]‪$colors[1‬‬ ‫;'أ@‪'¤‬‬
‫=]‪$colors[2‬‬ ‫;'أزرق'‬
‫=]‪$colors[3‬‬ ‫;'أ©'‬
‫=]‪$colors[4‬‬ ‫;'أ‪ %‬د'‬

‫الطريقة الثانية‬
‫;)'أ‪ %‬د'‪',‬أ©'‪',‬أزرق'‪',‬أ@‪','¤‬أ‪$colors = array ('#‬‬

‫في ھذه الطريقة ‪ ،‬يالحظ أننا لم نقم بتحديد المفتاح لكل عنصر في المصفوفة‪ .‬بدال من ذلك استخدمنا الدالة ) (‪array‬‬
‫إلنشاء المصفوفة ‪ .‬و لذلك فإن عملية الفھرسة تتم بشكل تلقائي بدءا من أول عنصر )المفتاح ‪.( 0‬‬

‫طريقة استرجاع قيم المصفوفة‬

‫يمكن استرجاع قيم المصفوفة بأكثر من طريقة منھا ما يلي‪:‬‬

‫باستخدام جمل التكرار و أفضلھا جملة التكرار ‪. for‬‬ ‫‬

‫‪<?php‬‬

‫;)'أ‪'،'#‬أ@‪'،'¤‬أزرق'‪'،‬أ©'‪'،‬أ‪ %‬د'( ‪$colors = array‬‬

‫)‪for($i=0;$i<sizeof($colors);$i++‬‬
‫{‬
‫;">‪echo "<h3>".$colors[$i]."</h3‬‬
‫}‬

‫>?‬

‫في ھذا المثال استخدمنا جملة التكرار ‪ for‬لطباعة قيم المصفوفة ‪ . colors‬و كما ھو واضح فإننا استخدمنا‬
‫الدالة ) (‪ sizeof‬لتحديد حجم المصفوفة لكي نتمكن من عرض جميع قيمھا‪ .‬أخيرا بدأنا التكرار عند القيمة‬
‫صفر ألن المفتاح ألول عنصر في المصفوفة الرقمية ھو ‪. 0‬‬
‫‪٣٦‬‬ ‫الفصل الخامس ‪ :‬التعامل مع المصفوفات ‪Arrays‬‬

‫باستخدام جملة التكرار ‪ foreach‬كما في المثال التالي‪:‬‬ ‫‬

‫‪<?php‬‬

‫;)'أ‪'،'#‬أ@‪'،'¤‬أزرق'‪'،‬أ©'‪'،‬أ‪ %‬د'( ‪$colors = array‬‬

‫)‪foreach($colors as $value‬‬
‫{‬
‫;">‪echo "<h3>".$value."</h3‬‬
‫}‬

‫>?‬

‫في ھذا الطريقة استخدمنا النوع األول من جملة التكرار ‪) foreach‬تم شرحه في الفصل السابق(‬
‫السترجاع قيم المصفوفة الرقمية ‪ .‬في ھذا المثال ستقوم جملة ‪ foreach‬بتخزين قيمة أول عنصر داخل‬
‫المتغير المؤقت ‪ $value‬و من ثم نقوم بطباعة قيمة ذلك المتغير‪ .‬ستقوم ‪ foreach‬بعد ذلك بالعودة و تكرار‬
‫نفس الخطوات السابقة مع العنصر الثاني و ھكذا حتى االنتھاء من جميع عناصر المصفوفة الرقمية تلقائيا‪.‬‬

‫تغيير قيمة عنصر‬

‫عملية تغيير قيمة عنصر ما تتم بسھولة‪ .‬كل ما علينا عمله ھو كتابة اسم المصفوفة متبوع بالمفتاح للعنصر المحدد بين‬
‫قوسين مربعة و من ثم نقوم بإسناد القيمة الجديدة له‪.‬‬

‫‪<?php‬‬

‫;)'أ‪'،'#‬أ@‪'،'¤‬أزرق'‪'،‬أ©'‪'،‬أ‪ %‬د'( ‪$colors = array‬‬


‫ه ? > ? ا'" ا*‪// 3‬‬
‫;'‪$colors[1] = '#FFFFFF‬‬
‫)‪foreach($colors as $value‬‬
‫{‬
‫;">‪echo "<h3>".$value."</h3‬‬
‫}‬

‫>?‬

‫استرجاع حجم المصفوفة‬

‫السترجاع حجم مصفوفة ما ‪ ،‬باإلمكان استخدام الدالة ) (‪ count‬أو الدالة ) (‪ sizeof‬كالتالي‪:‬‬

‫;) ‪count( array_name‬‬

‫;)‪sizeof( array_name‬‬
‫‪٣٧‬‬ ‫الفصل الخامس ‪ :‬التعامل مع المصفوفات ‪Arrays‬‬

‫المصفوفة الترابطية ‪associative array‬‬

‫المصفوفة الترابطية مشابھه للمصفوفة الرقمية من ناحية الوظيفة لكنھا تختلف عنھا من ناحية عملية الفھرسة‪ .‬في ھذا‬
‫النوع من المصفوفات‪ ،‬يتم استخدام النصوص ‪ string‬في فھرسة عناصر المصفوفة بدال من االرقام‪.‬‬

‫‪key‬‬ ‫‪value‬‬
‫‪title‬‬ ‫البرمجة باستخدام ‪php‬‬
‫‪author‬‬ ‫محمد عبدﷲ‬
‫‪$books‬‬ ‫دار النشر‬
‫‪publisher‬‬
‫‪isbn‬‬ ‫‪١٢-٢٥٠-١٦٣‬‬

‫طريقة انشاء المصفوفة الترابطية‬

‫يتم انشاء المصفوفة الترابطية بإحدى الطرق التاليه‪:‬‬

‫الطريقة األولى‬
‫;'‪php‬ا) ‪!%‬ام ' =]'‪$books['title‬‬
‫;')‪$books['author']= 'T! !S‬‬
‫;'دار ا' =]'‪$books['publisher‬‬
‫;'‪$books['isbn']= '12-250-163‬‬

‫الطريقة الثانية‬
‫‪php',‬ا) ‪!%‬ام ' >= '‪$books = array('title‬‬
‫‪'author' => 'T! !S)' ,‬‬
‫‪',‬دار ا' >= '‪'publisher‬‬
‫;)'‪'isbn' => '12-250-163‬‬

‫و كما ھو مالحظ في الطريقة الثانية استخدمنا الدالة ) (‪. array‬كذلك فإننا استخدمنا الرمز >= للفصل بين القيمة‬
‫‪ value‬و المفتاح ‪.key‬‬
‫‪٣٨‬‬ ‫الفصل الخامس ‪ :‬التعامل مع المصفوفات ‪Arrays‬‬

‫طريقة استرجاع قيم المصفوفة‬

‫أسھل طريقة السترجاع قيم المصفوفة الترابطية ھو عن طريق استخدام جملة التكرار ‪. foreach‬‬

‫‪<?php‬‬

‫‪ php',‬ا) ‪!%‬ام' >= '‪$books = array('title‬‬


‫‪'author' => 'T! !S)' ,‬‬
‫‪',‬دار ا' >= '‪'publisher‬‬
‫;)'‪'isbn' => '12-250-163‬‬

‫)‪foreach($books as $key=>$value‬‬
‫{‬
‫;">‪echo "<h3>$key => $value</h3‬‬
‫}‬

‫>?‬

‫كما ھو واضح من المثال السابق فإننا قمنا بتعريف المصفوفة ‪ books‬و قمنا بتعبئة قيمھا كما ھو واضح كذلك‪ .‬بعد‬
‫ذلك قمنا باستخدام جملة التكرار ‪ foreach‬لطباعة قيم المصفوفة‪ .‬في ھذه الحالة قمنا باستخدام متغيرين مؤقتين‬
‫‪ temporary variables‬لتخزين القيم ‪ values‬و المفاتيح ‪ keys‬لعناصر المصفوفة الترابطية ‪ .‬في كل مرة سنقوم‬
‫بتخزين قيم و مفاتيح العنصر األول في المصفوفة في المتغيرين المؤقتين ثم الذي يليه و ھكذا حتى االنتھاء من كل‬
‫عناصر المصفوفة‪.‬‬

‫تغيير قيمة عنصر‬

‫كما سبق أن عملنا مع المصفوفة الرقمية من تغيير قيمة عنصر ‪ ،‬نستطيع عمل نفس الطريقة مع المصفوفة الترابطية‬
‫عن طريق تحديد المفتاح للعنصر المطلوب و من ثم إسناد القيمة الجديدة له‪.‬‬

‫‪<?php‬‬

‫‪ php',‬ا) ‪!%‬ام' >= '‪$books = array('title‬‬


‫‪'author' => 'T! !S)' ,‬‬
‫‪',‬دار ا' >= '‪'publisher‬‬
‫;)'‪'isbn' => '12-250-163‬‬

‫ه    ا اول‪//‬‬


‫;'‪$books['title'] = 'java programming‬‬
‫;]'‪echo $books['title‬‬

‫>?‬

‫في حال أردنا مسح عناصر المصفوفة السابقة ‪ books‬فإننا نكتب‬


‫;) (‪$books = array‬‬
‫‪٣٩‬‬ ‫الفصل الخامس ‪ :‬التعامل مع المصفوفات ‪Arrays‬‬

‫المصفوفات ذات البعدين ‪multidimensional array‬‬

‫كما ذكرنا سابقا بأن المصفوفة تُستخدم لتخزين أي نوع من البيانات‪ .‬و كما ذكرنا أيضا بأن المصفوفة تعتبر من أنواع‬
‫البيانات في ‪ . PHP‬لذلك نستطيع القول بأنه من الممكن تخزين مصفوفة كأحد عناصر مصفوفة أخرى‪ .‬في ھذه الحالة‬
‫تسمى المصفوفة التي تحتوي على مصفوفة كأحد عناصرھا بالمصفوفة ذات البعدين‪.‬‬
‫(‪$books = array‬‬
‫‪ php',‬ا) ‪!%‬ام' >= '‪array('title‬‬
‫‪'author' => 'T! !S)' ,‬‬
‫‪',‬دار ا' >= '‪'publisher‬‬
‫‪'isbn' => '12-250-163'),‬‬

‫‪',‬أ‪%%‬ت ? ا! ا‪3‬ت' >= '‪array('title‬‬


‫‪ !@' ,‬ا'' >= '‪'author‬‬
‫‪',‬دار اروق' >= '‪'publisher‬‬
‫‪'isbn' => '22-433-987'),‬‬

‫;)‬

‫في ھذه الحالة إذا اردنا االشارة الى عنصر محدد داخل المصفوفة ذات البعدين فنتبع الطريقة التالية‪:‬‬
‫‪$books[1][ 'isbn']; // value is 12-250-163‬‬

‫المصفوفات العامة الجاھزة ‪PHP’s built-in super global arrays‬‬

‫تحتوي ‪ PHP‬على عدد من المصفوفات المبنية مسبقا و التي تستخدم بشكل متكرر في ‪ PHP‬و تسھل عملية الوصول‬
‫للبيانات حتى لو كانت من صفحات مختلفة‪ .‬جميع ھذه المصفوفات تبدأ بعالمة الدوالر ‪ $‬متبوعة بشرطة سفلية _ ‪.‬‬
‫من أشھر ھذه المصفوفات ‪ $_GET ،‬و ‪ $_POST‬و اللتان تحتويان على بيانات ھامة يتم تمريرھا عن طريق‬
‫نماذج ‪) HTML‬كما سنرى الحقا(‪ .‬كل المصفوفات العامة تُعتبر مصفوفات ترابطية‪ .‬المفاتيح لكال من ‪ $_POST‬و‬
‫‪ $_GET‬يتم اشتقاقھما من اسماء العناصر في نموذج ‪.HTML‬‬
‫فلو افترضنا أنه لدينا النموج التالي‪:‬‬

‫‪Address:‬‬

‫‪Send‬‬

‫لنفترض أن أسم مربع النص ھذا ھو ‪ address‬و الطريقة المستخدمة في ارسال النموذج ھي ‪ .POST‬عند الضغط‬
‫على مربع االرسال ‪ ،submit‬يقوم مفسر ‪ PHP‬تلقائيا بإنشاء العنصر ]'‪ $_POST['address‬و الذي ستكون قيمته‬
‫ھي القيمة المدخلة في مربع النص من قبل المستخدم‪.‬‬
‫‪٤٠‬‬ ‫الفصل الخامس ‪ :‬التعامل مع المصفوفات ‪Arrays‬‬

‫من أشھر المصفوفات العامة في ‪ PHP‬ما يلي‪:‬‬

‫‪$_POST‬‬ ‫تحتوي على بيانات مرسلة عن طريق نموذج ‪ HTML‬باستخدام طريقة ‪. post‬‬
‫‪$_GET‬‬ ‫تحتوي على بيانات مرسلة عن طريق نموذج ‪ HTML‬باستخدام طريقة ‪. get‬‬
‫‪$_SERVER‬‬ ‫تحتوي على معلومات مخزنة بواسطة خادم الويب ‪ Web Server‬كـ‪ :‬اسم الملف و مساره‪.‬‬
‫‪$_FILE‬‬ ‫يحتوي معلومات خاصة بالملفات المحملة‪.‬‬
‫‪$_SESSION‬‬ ‫يحتوي على معلومات يتم حفظھا ‪ ،‬لكي تستخدم في أكثر من صفحة‪.‬‬

‫يجب األخذ في االعتبار أن اسماء المصفوفات العامة في ‪ PHP‬تكتب بأحرف كبيرة ‪ ،‬باإلضافة‬
‫لذلك فھي حساسة لحالة الحرف ‪.case sensitive‬‬

‫استخدام الدالة ) (‪ print_r‬مع المصفوفات‬

‫في حال اردنا معرفة المحتوى لمصفوفة ما‪ ،‬نقوم باستدعاء الدالة ) (‪ print_r‬و التي تقوم بعرض محتوى المصفوفة‬
‫ال ُممررة لھا كالتالي‪:‬‬

‫;) ‪print_r( $book‬‬


‫‪٤١‬‬ ‫الفصل الخامس ‪ :‬التعامل مع المصفوفات ‪Arrays‬‬

‫تطبيق عملي‬

‫في ھذا التطبيق سنقوم بكتابة شفرة برمجية تقوم بتخزين درجات الطالب في مصفوفة رقمية ‪ ،‬و من ثم نقوم بطباعة‬
‫إحصائية عن درجات الطالب تشمل الطلبة الناجحين و الراسبين و بعض االحصائيات األخرى‪.‬‬
‫قم بفتح برنامج ‪ .Notepad++‬بعد ذلك سيقوم البرنامج بإنشاء مساحة عمل فارغة‪ .‬قم بكتابة الشفرة التالية‪:‬‬

‫>‪<html‬‬
‫>‪<head‬‬
‫>‪<style‬‬
‫*‪/‬‬
‫‪… css‬ة‬
‫و ا
‪ ,œ) ` ,‬ا!ول‬
‫‪*/‬‬
‫{‪body‬‬
‫;‪direction:rtl‬‬
‫}‬
‫{‪fieldset‬‬
‫;‪width:300px‬‬
‫}‬

‫{‪legend‬‬
‫;‪font-weight:bold‬‬
‫}‬

‫{‪p‬‬
‫;‪background-color:#CCC‬‬
‫}‬
‫>‪</style‬‬
‫>‪</head‬‬
‫>‪<body‬‬
‫‪<?php‬‬
‫إ‪3‬ء )" &
‪ S‬ي ‪ /‬درت ا |ب‪//‬‬
‫(‪$grades = array‬‬
‫‪25, 64, 23, 87, 56, 38, 78, 57, 98, 95,‬‬
‫‪81, 67, 75, 76, 74, 82, 36, 39,‬‬
‫‪54, 43, 49, 65, 69, 69, 78, 17, 91‬‬
‫;)‬
‫‪`#‬ب !د ا!رت ‪//‬‬
‫;)‪$count = count($grades‬‬
‫إ ) ع ا!رت و ا‪ -‬ا‪0‬و ه ‪// P‬‬
‫;‪$total = 0‬‬
‫!د ا  اا‪ (%‬و ا‪ -‬ا‪0‬و ه ‪//P‬‬
‫;‪$fail = 0‬‬
‫!د ا  ا‪ (S‬و ا‪ -‬ا‪0‬و ه ‪//P‬‬
‫;‪$success = 0‬‬

‫)‪foreach($grades as $grade‬‬
‫{‬
‫;‪$total += $grade‬‬
‫‪٤٢‬‬ ‫الفصل الخامس ‪ :‬التعامل مع المصفوفات ‪Arrays‬‬

‫)‪if ($grade < 60‬‬


‫{‬
‫;‪$fail++‬‬
‫}‬
‫)‪if ($grade >= 60‬‬
‫{‬
‫;‪$success++‬‬
‫}‬
‫}‬
‫) ‪ °%‬درت ا |ب *‪/‬‬
‫‪!`
round‬م ‪?0 -‬ب ر? ‪OSP‬‬
‫‪*/‬‬
‫;)‪$avg = round($total / $count‬‬
‫‪ a‬ا‪// ±"#²‬‬
‫;'>‪</legend‬إ‪ ±"#‬ا!رت & ادة>‪echo'<fieldset><legend‬‬
‫;">‪!: $count</p‬د ا  ا`( & ادة ه >‪echo"<p‬‬
‫;">‪ °% ): $avg</p‬ا!رت & ادة ه >‪echo"<p‬‬
‫;">‪!: $success</p‬د ا  ا‪ & (S‬ادة>‪echo"<p‬‬
‫;">‪!: $fail</p‬د ا  اا‪ & (%‬ادة ه >‪echo"<p‬‬
‫;'>‪echo'</fieldset‬‬
‫>?‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .‬و من النافذة التالية قم بما يلي‪:‬‬ ‫بعد االنتھاء من كتابة الشفرة السابقه ‪ ،‬قم بالنقر على زر حفظ‬
‫‪ .١‬قم بتغيير مكان الحفظ عن طريق االنتقال للمجلد ‪.C:\xammp\htdocs‬‬
‫‪ .٢‬قم بتسمية الملف باسم ‪. grades.php‬‬
‫‪ .٣‬غير نوع الملف ‪ Save as type‬من القائمة المنسدلة ليصبح )*‪ All types(*.‬أو ‪PHP Hypertext‬‬
‫‪.Preprocessor files‬‬
‫‪ .٤‬انقر على الزر ‪.Save‬‬
‫بعد االنتھاء من عملية الحفظ ‪،‬افتح متصفح االنترنت و اكتب العنوان التالي‪ http://localhost/grades.php :‬و‬
‫من ثم الحظ الناتج‪.‬‬
‫‪٤٣‬‬ ‫الفصل الخامس ‪ :‬التعامل مع المصفوفات ‪Arrays‬‬

‫أسئلة نھاية الفصل‬

‫‪ .١‬ما الفرق بين المصفوفة المفھرسة و المصفوفة الرقمية؟‬

‫‪ .٢‬باستخدام جملة التكرار ‪ ،do-while‬اكتب برنامج يقوم بطباعة قيم المصفوفة التالية‪:‬‬

‫;)'‪$fruit = array('Apple','Orange','Pineapple' ,'Strawberry‬‬

‫‪ .٣‬كيف نستطيع معرفة حجم المصفوفة السابقة؟‬

‫‪ .٤‬قم بتغيير قيمة العنصر الثالث ليصبح ‪. Banana :‬‬


‫‪٤٤‬‬ ‫الفصل السادس ‪ :‬الدوال في ‪Functions in, PHP‬‬

‫ھذا الفصل يغطي‪:‬‬

‫مفھوم الدوال‬ ‫‬


‫أنواع الدوال في ‪PHP‬‬ ‫‬
‫مجال رؤية المتغيرات‬ ‫‬
‫تضمين الملفات الخارجية‬ ‫‬

‫ما ھي الدالة ‪function definition‬‬

‫الدالة ‪ function‬ھي عبارة عن شفرة برمجية تقوم بتنفيذ مھمة محددة‪ .‬و ھي مھمة ألنھا تساعد على فصل جزء من‬
‫البرنامج بغرض إعادة استخدامه أكثر من مرة‪ .‬و تنقسم الدوال في ‪ PHP‬الى قسمين‪:‬‬

‫الدوال المبنية مسبقا ‪. Built-in functions‬‬ ‫‬


‫الدوال المعرفة من قبل المستخدم ‪.User defined functions‬‬ ‫‬

‫الدوال المبنية مسبقا ‪Built-in functions‬‬

‫تحتوي ‪ PHP‬على أكثر من ‪ ١٠٠٠‬دالة مبنية مسبقا و جاھزة لالستخدام ‪ ،‬كما يتم إضافة العديد من الدوال بشكل‬
‫مستمر ‪ .‬لذلك تعتبر ‪ PHP‬من أكثر لغات برمجة الويب تكيفا مع التوسع الكبير في التطبيقات الخاصة بشبكة‬
‫االنترنت‪ .‬و للمزيد عن دوال ‪ PHP‬الجاھزة يمكن زيارة الموقع‪ http://php.net/quickref.php :‬و اختيار أي‬
‫دالة لإلطالع على كيفية التعامل معھا ‪.‬‬

‫الدوال المعرفة من قبل المستخدم ‪User defined functions‬‬

‫قبل البدء في إنشاء أي دالة يجب األخذ في االعتبار محتويات الدالة‪ .‬تحتوي كل دالة على ثالث أقسام‪:‬‬

‫معطيات الدالة ‪. parameters‬‬ ‫‬


‫جسم الدالة ‪.body‬‬ ‫‬
‫القيمة المرجعة ‪.returning value‬‬ ‫‬

‫عند تعريف أي دالة يجب البدء بالكلمة المحجوزة ‪ function‬متبوعة باسم الدالة و من ثم قوسين صغيرين متبوعة‬
‫بجسم الدالة كالتالي‪:‬‬

‫‪function‬‬ ‫) (‪function_name‬‬
‫{‬
‫اة ا) دا@ ` ا!ا ‪//‬‬
‫}‬
‫‪٤٥‬‬ ‫الفصل السادس ‪ :‬الدوال في ‪Functions in, PHP‬‬

‫في حال كانت الدالة تحتوي على معطيات فيصبح شكل الدالة كما يلي‪:‬‬

‫‪function‬‬ ‫) …‪function_name( arg1, arg2,‬‬


‫{‬
‫اة ا) دا@ ` ا!ا ‪//‬‬
‫}‬
‫بعد تعريف الدالة يجب أن نقوم باستدعاء الدالة‪ .‬و عملية االستدعاء تتم بكتابة اسم الدالة متبوع بقوسين‪ .‬في حال كانت‬
‫الدالة ُمعرفة بمعطيات فيجب كتابة المعطيات عند استدعاء الدالة‪ .‬في حال لم يتم استدعاء الدالة فلن يتم تنفيذھا‪.‬‬

‫>‪<html‬‬
‫>‪<head‬‬
‫>‪</title‬آ ا‪3‬ء دا !ون )' ت>‪<title‬‬
‫>‪</head‬‬
‫>‪<body‬‬

‫‪<?php‬‬

'‪ u‬ا!ا ‪//‬‬

‫)(‪function writeMessage‬‬
‫{‬
‫;'إ‪3‬ء دا !ون )' ت'‪echo‬‬
‫}‬
‫إ‪!%‬ء ا!ا ‪//‬‬
‫;)(‪writeMessage‬‬
‫>?‬
‫>‪</body‬‬
‫>‪</html‬‬

‫كما ھو واضح ‪ ،‬قمنا بتعريف دالة اسمھا )(‪ writeMessage‬بدون معطيات ‪ .‬عند استدعاء الدالة ستقوم بتنفيذ‬
‫جملة الطباعة ‪ echo‬و طباعة النص المضمن بداخلھا‪ .‬المثال التالي يوضح كيفية تعريف و استدعاء دالة بمعطيات‪.‬‬

‫>‪<html‬‬
‫>‪<head‬‬
‫>‪</title‬آ ا‪3‬ء دا ' ت>‪<title‬‬
‫>‪</head‬‬
‫>‪<body‬‬

‫‪<?php‬‬

'‪ u‬دا ' ت ‪//‬‬

‫)‪function add($number1,$number2‬‬
‫{‬
‫;‪$result = $number1 + $number2‬‬
‫;‪  B
3'.$result‬ا} ه ‪echo':‬‬
‫}‬
‫إ‪!%‬ء ا!ا ‪//‬‬
‫;)‪add(10,20‬‬
‫>?‬
‫>‪</body></html‬‬
‫‪٤٦‬‬ ‫الفصل السادس ‪ :‬الدوال في ‪Functions in, PHP‬‬

‫إرجاع قيمة دالة ‪returning value‬‬

‫يمكن أن تقوم الدالة بإرجاع قيمة عن طريق العبارة ‪ . return‬عند الوصول للعبارة ‪ return‬فإن الدالة ستتوقف‪ .‬و‬
‫سيتم ارجاع القيمة للسطر من البرنامج الذي تم فيه استدعاء الدالة‪.‬‬

‫>‪<html‬‬
‫>‪<head‬‬
‫>‪</title‬آ ا‪3‬ء دا ' ت>‪<title‬‬
‫>‪</head‬‬
‫>‪<body‬‬

‫‪<?php‬‬

'‪ u‬دا ' ت ‪//‬‬

‫)‪function add($number1,$number2‬‬
‫{‬
‫;‪$result = $number1 + $number2‬‬
‫أرع ? ا> ‪// $result‬‬
‫;‪return $result‬‬
‫}‬
‫ا‪!%‬ء ا!ا و ا‪ -‬ا' )( ا!ا ‪  ` }%‬ا ‪//‬‬
‫;)‪$return_value = add(10,20‬‬
‫;‪  B
3'. $return_value‬ا} ه ‪echo':‬‬
‫>?‬
‫>‪</body‬‬
‫>‪</html‬‬

‫إسناد قيم افتراضية للمعطيات‬

‫يمكن إسناد قيم افتراضية لمعطيات الدالة ‪ parameters‬يتم استخدمھا في حال تم استدعاء الدالة بدون تمرير قيم‬
‫لمعطياتھا‪.‬‬

‫>‪<html‬‬
‫>‪<head‬‬
‫>‪</title‬آ ا‪3‬ء دا ' ت>‪<title‬‬
‫>‪</head‬‬
‫>‪<body‬‬

‫‪<?php‬‬

'‪ u‬دا ' ت ‪//‬‬

‫)‪function add($number1=30,$number2=40‬‬
‫{‬
‫;‪$result = $number1 + $number2‬‬
‫ارع ? ا> ‪// $result‬‬
‫;‪return $result‬‬
‫}‬
‫‪٤٧‬‬ ‫الفصل السادس ‪ :‬الدوال في ‪Functions in, PHP‬‬

‫ا‪!%‬ء ا!ا !ون


 )' ت ‪//‬‬
‫;)(‪$call_without_values = add‬‬
‫ا‪!%‬ء ا!ا )}
 )' ت ‪//‬‬
‫;)‪$call_with_values = add(53,32‬‬

‫;‪ B
3:'. $call_without_values‬ا‪!%‬ء ا!ا !ون )' ت'‪echo‬‬
‫;‪ B
3:'. $call_with_values‬ا‪!%‬ء ا!ا ' ت>‪echo'<br/‬‬
‫>?‬
‫>‪</body‬‬
‫>‪</html‬‬

‫ناتج استدعاء الدالة بدون معطيات‪٧٠:‬‬


‫ناتج استدعاء الدالة بمعطيات‪٨٥:‬‬

‫مجال رؤية المتغير ‪variable scope‬‬

‫من المھم أن نعرف أن أي متغير يتم تعريفه داخل جسم الدالة فسوف يكون متاحا للدالة فقط‪ .‬بمعنى أنه من غير‬
‫الممكن االشارة لذلك المتغير خارج إطار الدالة‪.‬‬

‫>‪<html‬‬
‫>‪<head‬‬
‫>‪)</title‬ل رؤ ا>>‪<title‬‬
‫>‪</head‬‬
‫>‪<body‬‬

‫‪<?php‬‬

'‪ u‬دا ' ت ‪//‬‬
‫)‪function add($number1=30,$number2=40‬‬
‫{‬
‫;‪$result = $number1 + $number2‬‬
‫}‬

‫;)‪add(53,32‬‬
‫;‪ ?: '.$result‬ا> ه'‪echo‬‬
‫>?‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪Notice: Undefined variable: result in C:\xampp\htdocs\test\test2.php on line 16‬‬


‫قيمة المتغير ھي‪:‬‬

‫كما ھو واضح من المثال السابق ‪ ،‬المتغير ‪ $result‬متغير محلي ‪ local‬خاص بالدالة ‪ . add‬عندما قمنا بمحاولة‬
‫طباعة قيمة المتغير خارج الدالة ‪ ،‬عرض مفسر ‪ PHP‬رسالة خطأ تفيد بأن المتغير غير معرف‪.‬‬
‫‪٤٨‬‬ ‫الفصل السادس ‪ :‬الدوال في ‪Functions in, PHP‬‬

‫و في حال أردنا أن يكون المتغير ‪ $result‬متاحا داخل و خارج الدالة أيضا ‪ ،‬فنقوم بكتابة العبارة ‪ global‬قبل اسم‬
‫المتغير‪ .‬في ھذه الحالة سيصبح المتغير ‪ $result‬متغيرا عاما ‪ .public‬و سيتأثر بأي تغيير يحدث على المتغير‬
‫خارج إطار الدالة‪.‬‬

‫>‪<html‬‬
‫>‪<head‬‬
‫>‪</title‬آ ا‪3‬ء دا ' ت>‪<title‬‬
‫>‪</head‬‬
‫>‪<body‬‬

‫‪<?php‬‬

‫;‪$result = 0‬‬

'‪ u‬دا ' ت ‪//‬‬
‫)‪function add($number1=30,$number2=40‬‬
‫{‬
‫ا> ا´ن ا‪>) OP‬ا ) ‪//‬‬
‫;‪global $result‬‬
‫;‪$result = $number1 + $number2‬‬
‫}‬

‫;)‪add(53,32‬‬

‫;‪ ?: '.$result‬ا> ه'‪echo‬‬


‫>?‬
‫>‪</body‬‬
‫>‪</html‬‬

‫قيمة المتغير ھي‪٨٥ :‬‬

‫تضمين شفرة برمجية من ملف آخر ‪PHP file inclusion‬‬

‫تدعم ‪ PHP‬إمكانية تضمين محتوى ملف ‪ PHP‬في ملف ‪ PHP‬آخر قبل أن يقوم الخادم بإتمام عملية التنفيذ‪ .‬ھذه‬
‫الطريقة تساعد في إعادة استخدام الشفرة برمجية ‪ . reusability‬و تكون شائعة في تضمين شفرات برمجية تُستخدم‬
‫بشكل متكرر عند بناء موقع ديناميكي خصوصا ملفات ‪. copy right footer ، header‬‬
‫و لتحقيق ذلك نستطيع استخدام الدالتين التاليتين‪:‬‬

‫) (‪include‬‬ ‫‬
‫) (‪require‬‬ ‫‬

‫كال الدالتين تقوم بتضمين شفرة برمجية من ملف آخر‪ .‬لكن الفرق بينھما ھو في كيفية تعامل الدالتين مع األخطاء‪.‬‬

‫في حال استخدمنا ) (‪ ، include‬و كان الملف المضمن الذي يحتوي على الشفرة البرمجية المدرجة غير موجود ‪،‬‬
‫ففي ھذه الحالة سيقوم مفسر ‪ PHP‬بإنشاء رسالة تحذير ‪ warning message‬و من ثم يتابع تنفيذ بقية البرنامج‪.‬‬
‫‪٤٩‬‬ ‫الفصل السادس ‪ :‬الدوال في ‪Functions in, PHP‬‬

‫على النقيض تماما في حال استخدمنا الدالة ) (‪ require‬و كان الملف المضمن غير موجود ‪ ،‬فسيقوم مفسر ‪PHP‬‬
‫بإنشاء رسالة خطأ مميت ‪ fatal error‬و من ثم ايقاف تنفيذ البرنامج‪.‬‬

‫‪menu.php‬‬
‫‪<a‬‬ ‫‪</a> -‬ا‪href="home.php">`±‬‬
‫‪<a‬‬ ‫‪)!@</a> -‬ت>"‪href="services.php‬‬
‫‪<a‬‬ ‫‪ #</a> -‬ل ا ?}>"‪href="about.php‬‬
‫‪<a‬‬ ‫>‪</a> <br /‬ا
" >"‪href="contactus.php‬‬

‫‪index.php‬‬
‫>‪<html‬‬
‫>"‪<body dir="rtl‬‬
‫>? ;)"‪<?php include("menu.php‬‬
‫>‪ PHP</p‬ه‪2‬ي ‪ (¤
-a‬ات &>‪<p‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫كما ھو واضح من المثال السابق استخدمنا الدالة ) (‪ include‬لتضمين محتوى الملف ‪ menu.php‬في الملف‬
‫‪ .index.php‬و بنفس الطريقة نستطيع استخدام الدالة ) (‪ require‬كذلك‪.‬‬

‫تطبيق عملي‬

‫في ھذا التطبيق سنقوم بتصميم واجھة لموقع تخيلي‪ .‬و الھدف ھو تطبيق ميزة تضمين الملفات في ‪. PHP‬‬
‫عندما نقوم بتصميم الواجھة الرئيسية لموقع فيُنصح دائما بفصل األجزاء المتكررة من ملفات مستقلة بھدف استخدامھا في كامل‬
‫صفحات الموقع‪ .‬فمثال شعار الموقع و القوائم الرئيسية )تسمى رأس الصفحة أو ‪ (header‬تكون ثابتة لذلك نقوم بوضعھا في‬
‫ملف مستقل‪ .‬ايضا حقوق الموقع و التي تظھر عادة في أسفل الصفحة )تسمى ذيل الصفحة أو ‪ (footer‬تكون ثابتة لذلك نقوم‬
‫بوضعھا في ملف مستقل‪ .‬و ھكذا مع أي محتوى يتم استخدامه عبر كل ملفات الموقع فيُنصح أن يوضع في ملف مستقل‪ .‬ھذه‬
‫الطريقة تساعد في إعادة استخدام الشفرة البرمجية ‪ reusability‬كما تسھل من عملية التطوير و الصيانة للموقع‪.‬‬
‫بعد أن نقوم بفصل المحتوى المتكرر نقوم بإنشاء الصفحة الرئيسية للموقع و من ثم تضمين المحتوى المطلوب‬
‫باستخدام ) (‪ include‬أو ) (‪.require‬‬

‫قم بفتح برنامج ‪ .Notepad++‬بعد ذلك سيقوم البرنامج بإنشاء مساحة عمل فارغة‪ .‬قم بكتابة الشفرة التالية‪:‬‬
٥٠ Functions in, PHP ‫ الدوال في‬: ‫الفصل السادس‬

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8" />
<style>
body{
direction:rtl;
margin:0px 200px 0px 200px;
font-family:"Times New Roman", Times, serif;
}
a{
text-decoration:none;
color:#000;
}
a:hover{
text-decoration:underline;
color:#FFF;
}
#logo{
background-color:#6CC;
}
#titleLogo{
text-align:right;
font-size:42px;
font-weight:bold;
padding-right:50px;
}
#menu{
padding-top:5px;
text-align:center;
}
#menu td{
background-color:#6CC;
font-size:16px;
font-weight:bold;
}
#content{
margin-top:20px;
margin-bottom:20px;
font-size:16px;
font-weight:bold;
}

#footer{
margin-top:100px;
padding:2px;
background-color:#6CC;
text-align:center;
font-size:16px;
font-weight:bold;
}
‫‪٥١‬‬ ‫الفصل السادس ‪ :‬الدوال في ‪Functions in, PHP‬‬

‫>‪</style‬‬
‫>‪ </title‬ا"  ا?>‪<title‬‬
‫>‪</head‬‬

‫>‪<body‬‬
‫>"‪<div id="header‬‬
‫>"‪<table width="100%" id="logo‬‬
‫>‪<tr‬‬
‫>‪ </td‬ا"  ا?>"‪<td width="86%" id="titleLogo‬‬
‫‪<td‬‬ ‫‪width="14%"><img‬‬ ‫"‪src="cammera.png‬‬ ‫"‪width="128‬‬
‫>‪height="128" /></td‬‬
‫>‪</tr‬‬
‫>‪</table‬‬
‫>"‪<table width="100%" cellpadding="3" id="menu‬‬
‫>‪<tr‬‬
‫>‪</a></td‬ا‪<td><a href="home.php">`±‬‬
‫>‪</a></td‬دروس ا" >"‪<td><a href="tutorials.php‬‬
‫>‪ </a></td‬ا)ات>"‪<td><a href="camsworld.php‬‬
‫>‪ #</a></td‬ل ا ?}>"‪<td><a href="about.php‬‬
‫>‪</a></td‬ا
" >"‪<td><a href="contact.php‬‬
‫>‪</tr‬‬
‫>‪</table‬‬
‫>‪</div‬‬
‫>‪ ,3 --‬رأس ا"‪<!-- S‬‬

‫‪ .‬و من النافذة التالية قم بما يلي‪:‬‬ ‫بعد االنتھاء من كتابة الشفرة السابقه ‪ ،‬قم بالنقر على زر حفظ‬
‫‪ .١‬قم بتغيير مكان الحفظ عن طريق االنتقال للمجلد ‪.C:\xammp\htdocs‬‬
‫‪ .٢‬قم بتسمية الملف باسم ‪. header.php‬‬
‫‪ .٣‬غير نوع الملف ‪ Save as type‬من القائمة المنسدلة ليصبح )*‪ All types(*.‬أو ‪PHP Hypertext‬‬
‫‪.Preprocessor files‬‬
‫‪ .٤‬انقر على الزر ‪.Save‬‬

‫اآلن قم بالضغط على مفتاح ‪ Ctrl+N‬إلنشاء مساحة عمل فارغة ثم قم بكتابة الشفرة التالية‪.‬‬

‫>‪! --‬ا
‪ 2‬ا"‪<!-- S‬‬
‫>"‪<div id="footer‬‬
‫>‪ }&copy;</p‬ا‪ -S‬ق )‪ }?  ¶ S‬ا ا ا?>‪<p‬‬
‫>‪</p‬اء ?اءة
'ت ا‪!%‬ام ا ?}>‪<p‬‬
‫>‪</div‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .‬و من النافذة التالية قم بما يلي‪:‬‬ ‫بعد االنتھاء من كتابة الشفرة السابقه ‪ ،‬قم بالنقر على زر حفظ‬
‫‪ .١‬قم بتغيير مكان الحفظ عن طريق االنتقال للمجلد ‪.C:\xammp\htdocs‬‬
‫‪ .٢‬قم بتسمية الملف باسم ‪. footer.php‬‬
‫‪ .٣‬غير نوع الملف ‪ Save as type‬من القائمة المنسدلة ليصبح )*‪ All types(*.‬أو ‪PHP Hypertext‬‬
‫‪.Preprocessor files‬‬
‫‪ .٤‬انقر على الزر ‪.Save‬‬
‫‪٥٢‬‬ ‫الفصل السادس ‪ :‬الدوال في ‪Functions in, PHP‬‬

‫مرة أخرى ‪ ،‬قم بالضغط على مفتاح ‪ Ctrl+N‬إلنشاء مساحة عمل فارغة ثم قم بكتابة الشفرة التالية‪.‬‬

‫‪<?php‬‬
‫‪ header.php‬ه ? ‪ S) (¤‬ى ا‪//u‬‬
‫;)'‪require('header.php‬‬
‫>?‬
‫>"‪<div id="content‬‬
‫‪  &  #).‬ا"  ا?‬
‫ه‪2‬ا ا ?} ‪!,‬ف إ‪23 !-
/‬ة ( )"ة ( &( ا"  ا?‬
‫و `'!‪ 3‬أن ‪!-3‬م Œا‪ ±‬ا ا'!! )( ا!روس و ا"‪ # O±‬ل‬
‫‪ (&.‬ا" ‬
‫>‪</div‬‬
‫‪<?php‬‬
‫‪ footer.php‬ه ? ‪ S) (¤‬ى ا‪//u‬‬
‫;)'‪require('footer.php‬‬
‫>?‬

‫‪ .‬و من النافذة التالية قم بما يلي‪:‬‬ ‫بعد االنتھاء من كتابة الشفرة السابقه ‪ ،‬قم بالنقر على زر حفظ‬
‫‪ .١‬قم بتغيير مكان الحفظ عن طريق االنتقال للمجلد ‪.C:\xammp\htdocs‬‬
‫‪ .٢‬قم بتسمية الملف باسم ‪. index.php‬‬
‫‪ .٣‬غير نوع الملف ‪ Save as type‬من القائمة المنسدلة ليصبح )*‪ All types(*.‬أو ‪PHP Hypertext‬‬
‫‪.Preprocessor files‬‬
‫‪ .٤‬انقر على الزر ‪.Save‬‬

‫بعد االنتھاء من عملية الحفظ ‪،‬افتح متصفح االنترنت و اكتب العنوان التالي‪ http://localhost/index.php :‬و من‬
‫ثم الحظ الناتج‪.‬‬
‫‪٥٣‬‬ ‫الفصل السادس ‪ :‬الدوال في ‪Functions in, PHP‬‬

‫أسئلة نھاية الفصل‬

‫‪ .١‬ما ھي أنواع الدوال في ‪ PHP‬مع ذكر مثال توضيحي عن كل نوع‪.‬‬

‫‪ .٢‬ما ھي الطرق المستخدمة في ‪ PHP‬لتضمين شفرة برمجية من ملف آخر‪ ،‬و ما الفرق بينھا‪.‬‬

‫‪ .٣‬أكتب برنامج يقوم بإنشاء دالة تقوم بتحويل العملة من دوالر أسترالي إلى ﷼ سعودي ‪ ،‬مع‬

‫األخذ في االعتبار أن سعر الصرف غير ثابت‪.‬‬

‫‪ .٤‬ما ھي الفائدة من جعل المحتوى المتكرر في ملفات مستقلة؟‬


٥٤ Handling forms ‫ التعامل مع النماذج‬: ‫الفصل السابع‬

:‫ھذا الفصل يغطي‬

‫كيفية التعامل مع البيانات المرسلة من خالل النموذج‬ 


.‫الطرق المستخدمة في ارسال البيانات و الفرق بينھا‬ 
‫كيف التعامل مع الروابط التفاعلية‬ 

‫ لذلك تكون الحاجة ملحة للتعامل مع البيانات المدخلة عن طريق‬.‫ أكثر تعقيدا‬PHP ‫مع مرور الوقت تصبح تطبيقات‬
.HTML forms ‫ و أكثر الشائعة استخداما للتعامل مع ُمدخالت المستخدم ھو عن طريق النماذج‬.‫المستخدم‬

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8" />
<style>
/*
‫ …ة‬css
‫ ا!ول‬,œ) ` ,
‫و ا‬
*/
body{
direction:rtl;
}
form{
font-weight:bold;
}
.button{
font-weight:bold;
width:75px;
}

</style>
</head>
<body>
<form name="contact " method="post" action="contact.php">
<p>%‫ا‬:
<input type="text" name="name" />
</p>
<p>3‫ا! او‬:
<input type="text" name="email" />
</p>
<p>%‫ا‬:
<textarea name="message" cols="45" rows="5"></textarea>
</p>
<p>
<input class="button" type="submit" name="send"
value="%‫ "أر‬/>
<input class="button" type="reset" name="reset" value="O`)"
/>
</p>
</form>
</body></html>
‫‪٥٥‬‬ ‫الفصل السابع ‪ :‬التعامل مع النماذج ‪Handling forms‬‬

‫من خالل الشفرة السابقة ‪ ،‬قمنا بإنشاء نموذج يحتوي على حقل إلدخال االسم من نوع نص ‪ ، text‬حقل إلدخال البريد‬
‫االلكتروني من نوع نص كذلك‪ .‬باإلضافة الى مساحة نص ‪ textarea‬إلدخال الرسالة ‪ .‬أخيرا لدينا زر إلرسال‬
‫البيانات من نوع ‪ submit‬و زر لمسح قيم الحقول من نوع ‪.reset‬‬
‫كما يجب اإلنتباه الى انه عند الرغبة في التعامل مع بيانات حقل معين‪ ،‬يجب تحديد اسم ذلك الحقل عن طريق‬
‫الخاصية ‪ name‬لنتمكن من استخدامھا الحقا ‪.‬‬
‫بقي أن نشير أن الوسم ‪ form‬يحتوي على خاصيتين مھمتين‪:‬‬

‫ الخاصية ‪ method‬و تستخدم لتحديد كيفية ارسال البيانات و لھا قيمتين‪:‬‬


‫‪post o‬‬
‫‪get o‬‬
‫ و الخاصية األخرى ‪ action‬و تستخدم لتحديد الصفحة التي سوف تستقبل البيانات المرسلة من النموذج‪.‬‬

‫الفرق بين استخدام ‪ post‬و ‪get‬‬

‫‪post‬‬ ‫‪get‬‬ ‫الخاصية‬


‫البيانات المرسلة ال يتم حفظھا‬ ‫البيانات المرسلة يتم حفظھا في تاريخ متصفح‬ ‫التاريخ ‪history‬‬
‫في تاريخ متصفح االنترنت‬ ‫االنترنت ‪.Browser history‬‬
‫‪.Browser history‬‬
‫يتم عرض صندوق حواري‬ ‫يتم تنفيذ البيانات مباشرة‪.‬‬ ‫زر العودة أو تحديث‬
‫للمستخدم لتأكيد عملية التنفيذ‬ ‫الصفحة‬
‫ال يمكن وضعھا في المفضلة‬ ‫يمكن وضعھا في المفضلة‬ ‫المفضلة ‪Bookmark‬‬
‫يمكن ارسالھا و ال تعاني من‬ ‫يمكن ارسالھا لكنھا محدودة و تختلف من متصفح‬ ‫المتغيرات المرسلة‬
‫مشاكل طول البيانات‪.‬‬ ‫آلخر‪.‬‬ ‫‪parameters‬‬
‫صعبة العبث ألن البيانات يتم‬ ‫سھلة العبث ألن البيانات تُعرض للمستخدم في‬ ‫العبث ‪hacking‬‬
‫تشفيرھا و ال تعرض في عنوان‬ ‫عنوان ‪.URL‬‬
‫‪. URL‬‬
‫تُستخدم عند التعامل مع بيانات‬ ‫يجب أن ال يتم استخدامھا عند ارسال بيانات‬ ‫االستخدام ‪usability‬‬
‫تتطلب سرية عالية‪.‬‬ ‫حساسة مثل كلمات المرور أو أرقام بطاقات‬
‫االئتمان‪.‬‬

‫كيفية قراءة البيانات ال ُمرسلة من النموذج‬

‫كما سبق و أن أشرنا في الفصل الخامس ‪ ،‬ھناك عدد من المصفوفات العامة في ‪ PHP‬تُستخدم ألغراض محددة‪ .‬من‬
‫ضمن ھذه المصفوفات المصفوفتين ‪ $_POST‬و ‪ $_GET‬و التي تُستخدمان لجمع البيانات ال ُمرسلة عبر النموذج‪.‬‬
‫بمعنى أننا نقوم بالنظر للنموذج ‪ form‬و تحديدا للخاصية ‪ . method‬إذا كانت القيمة ھي ‪ post‬فإن البيانات ال ُمرسلة‬
‫من النموذج سيتم تخزينھا في المصفوفة العامة ‪ $_POST‬و العكس صحيح إذا كانت القيمة ھي ‪ get‬فإن البيانات‬
‫ال ُمرسلة من النموذج سيتم تخزينھا في المصفوفة العامة ‪.$_GET‬‬
‫بعد ذلك نقوم بكتابة قوسين مربعة ] [ و من ثم نقوم بكتابة اسم الحقل و التي تمثل قيمة الخاصية ‪name‬‬
‫لعناصر النموذج بين عالمات اقتباس مفردة أو مزدوجة‪.‬‬
‫‪٥٦‬‬ ‫الفصل السابع ‪ :‬التعامل مع النماذج ‪Handling forms‬‬

‫‪order.html‬‬
‫‪...‬‬
‫>'‪<form action='ordere.php' method='post‬‬
‫>‪:<input type='text' name='name'/‬ا‪%‬‬
‫>‪: :<input type='text' name='phone'/‬ا‪u
,‬‬
‫‪...‬‬

‫‪order.php‬‬ ‫الصفحة المستقبلة للبيانات‬


‫‪<?php‬‬
‫‪...‬‬
‫;]'‪echo $_POST['name‬‬ ‫طريقة ارسال البيانات ‪post‬‬
‫;]'‪echo $_POST['phone‬‬
‫‪...‬‬
‫>?‬

‫سنقوم اآلن بالعودة للمثال األول في ھذا الفصل و سنقوم بحفظ الشفرة السابقة باسم ‪ contact.html‬و في نفس المكان‬
‫الذي تعودنا لحفظ ملفاتنا فيه )داخل المجلد االفتراضي ‪.( htdocs‬‬

‫اآلن سنقوم بإنشاء الصفحة التي سوف تستقبل البيانات و الموضحة في الخاصية '‪ action=' contact.php‬في‬
‫النموذج السابق‪ .‬و كما ال يجب أن ننسى الخاصية األخرى المھمة و التي تحدد طريقة ارسال البيانات وھي الخاصية‬
‫'‪.method = 'post‬‬

‫‪<?php‬‬
‫*‪/‬‬ ‫& اŒء ا ? '‪>) u‬ات  ‪ ,& ¸S3‬ا‪-‬‬
‫‪*/‬ا‪|@ () %‬ل ا ذج‬
‫;]'‪$name = $_POST['name‬‬
‫;]'‪$email = $_POST['email‬‬
‫;]'‪$message = $_POST['message‬‬
‫;'>";‪echo'<div style="direction:rtl;font-size:16px‬‬
‫…ا أ@ اŒا‪  ±‬ا‪3 ') •P‬ت ر‪echo'<h2> •%‬‬
‫;'>‪:</h2‬آ‬
‫;'>‪echo'<hr align="right" style="width:500px"/‬‬
‫;">‪:</b>$name</p‬ا‪echo"<p><b>%‬‬
‫;">‪:</b>$email</p‬ا! او‪echo"<p><b>3‬‬
‫;">‪:</b>$message</p‬ا‪echo"<p><b>%‬‬
‫;'>‪echo'</div‬‬
‫>?‬

‫نقوم بحفظ الشفرة السابقة باسم ‪ contact.php‬داخل المجلد االفتراضي و ستكون ھذه الصفحة ھي المسئولة عن‬
‫استقبال و التعامل مع البيانات المرسلة من الصفحة ‪.contact.html‬‬
‫نقوم اآلن باستدعاء الصفحة التي تحتوي على النموذج كالتالي ‪http://localhost/contact.html‬‬
‫‪٥٧‬‬ ‫الفصل السابع ‪ :‬التعامل مع النماذج ‪Handling forms‬‬

‫]'‪$_POST['name‬‬

‫]'‪$_POST['email‬‬

‫]'‪$_POST['message‬‬

‫نقوم بتعبئة البيانات كما ھو واضح و من ثم نضغط على زر االرسال‪ .‬عند الضغط على زر االرسال سوف تُرسل‬
‫البيانات للصفحة ‪ contact.php‬و التي ستقوم بطباعة البيانات كما يلي‪:‬‬

‫ارسال النموذج لنفس الصفحة‬

‫في بعض الحاالت قد يكون من األفضل ارسال النموذج لنفس الصفحة لتتم معالجته بدال من ارسال الى صفحة أخرى‬
‫مستقلة‪ .‬الفائدة من ھذه الخطوة أن البيانات ال ُمدخلة في النموذج تبقى ‪ ،‬مما يتيح للمستخدم تعديل البيانات الخاطئة‬
‫فقط‪.‬‬
‫لكن ستواجھنا مشكلة بأن مفسر ‪ PHP‬سيقوم بتنفيذ شفرة ‪ PHP‬حتى و إن لم يتم ارسال النموذج؟‬
‫لذلك الحل أن يتم حصر الشفرة البرمجية داخل جملة شرط‪ .‬و يتحقق الشرط فقط عندما يتم ارسال النموذج و بالتالي‬
‫يتم تنفيذ الشفرة البرمجية التي ستتعامل مع البيانات المرسلة من النموذج‪.‬‬
‫و لكي نرسل النموذج لنفس الصفحة سنستخدم المصفوفة العامة الجاھزة ‪ $_SERVER‬مع المتغير‬
‫‪ SCRIPT_NAME‬و الذي يحتوي على اسم الصفحة التي يتم تنفيذھا حاليا و نضعھا داخل الخاصية ‪ action‬في‬
‫النموذج‪ .‬سنقوم بالتعديل على الملفين السابقين ‪ contact.html‬و ‪ contact.php‬بحيث يصبح النموذج والشفرة‬
‫البرمجية في صفحة واحدة‪.‬‬
٥٨ Handling forms ‫ التعامل مع النماذج‬: ‫الفصل السابع‬

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8" />
<style>
body{
direction:rtl;
}
form{
font-weight:bold;
}
.button{
font-weight:bold;
width:75px;
}
</style>
</head>
<body>
<?php
if(array_key_exists('send',$_POST))
{
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
echo'<div style="direction:rtl;font-size:16px;">';
echo'<h2> •%‫ت ر‬3 ') •P‫  ا‬±‫…ا أ@ اŒا‬
‫آ‬:</h2>';
echo'<hr align="right" style="width:500px"/>';
echo"<p><b>%‫ا‬:</b>$name</p>";
echo"<p><b>3‫ا! او‬:</b>$email</p>";
echo"<p><b>%‫ا‬:</b>$message</p>";
echo'</div><br/>';
}
?>
<form name="contact " method="post" action="<?php echo
$_SERVER['SCRIPT_NAME'];?>">
<p>%‫ا‬:
<input type="text" name="name" />
</p>
<p>3‫ا! او‬:
<input type="text" name="email" />
</p>
<p>%‫ا‬:
<textarea name="message" cols="45" rows="5"></textarea>
<p>
<input class="button" type="submit" name="send"
value="%‫ "أر‬/>
<input class="button" type="reset" name="reset" value="O`)"
/>
</p>
</form></body></html>
‫‪٥٩‬‬ ‫الفصل السابع ‪ :‬التعامل مع النماذج ‪Handling forms‬‬

‫في الشفرة السابقة استخدمنا الدالة ) (‪ array_key_exists‬و التي تأخذ معطيين‪ .‬األول عبارة عن مفتاح ‪ key‬يتم‬
‫البحث عن وجوده في مصفوفة و التي تمثل المعطى الثاني للدالة‪ .‬المفتاح في المثال السابق يمثل اسم زر اإلرسال‬
‫‪ send‬و المصفوفة ھي المصفوفة العامة ‪.$_POST‬‬
‫تقوم الدالة بالبحث عن المفتاح ‪ send‬داخل المصفوفة ‪ $_POST‬ألن طريقة ارسال البيانات في النموذج ھي ‪.post‬‬
‫عند الضغط على زر االرسال سيتم ارسال المفتاح ‪ send‬للمصفوفة ‪ $_POST‬و ستكون نتيجة اختبار الدالة ھي‬
‫‪ true‬و يتم تنفيذ الجزء التابع لجملة الشرط ‪ if‬و العكس صحيح اذا لم يتم ارسال النموذج أي سوف تكون نتيجة‬
‫اختبار الدالة ھي ‪.false‬‬
‫في الجزء ‪ action‬الخاص بالنموذج قمنا بطباعة المتغير العام ]'‪ $_SERVER['SCRIPT_NAME‬و الذي‬
‫سيقوم بإرجاع اسم الصفحة الحالية ‪.contact.php‬‬

‫التعامل مع أزرار االختيار ‪radio‬‬

‫أزرار االختيار ‪ radio‬من العناصر البسيطة و الفعالة عند التعامل مع نماذج ‪ .HTML‬في الوضع االفتراضي‪ ،‬نقوم‬
‫بتحديد أحد أزرار االختيار ‪ radio‬ليكون ھو القيمة االفتراضية وذلك عن طريق أعطاءه الخاصية ‪ checked‬للداللة‬
‫على أن ھذا الحقل ھو القيمة االفتراضية‪ .‬بمعنى أنه‪ ،‬إذا لم يقم المستخدم بإختيار أيا من أزرار االختيار‪ ،‬فسيتم ارسال‬
‫قيمة الحقل المحدد مسبقا كقيمة افتراضية الى ايا من المصفوفتين ‪ $_POST‬أو ‪ $_GET‬عند ارسال النموذج‪.‬‬
‫في حال كانت قيم أزرار االختيار ‪ radio‬مرتبطة ببعضھا‪ ،‬مثل لو أردنا تحديد ما إذا كان المستخدم ذكر أم أنثى‪ .‬ففي‬
‫ھذه الحالة يجب أن نعطي جميع أزرار االختيار نفس االسم‪.‬‬

‫حماية صفحة انترنت‬

‫في بعض الحاالت قد نحتاج الى حماية صفحة انترنت من الوصول اليھا مباشرة عن طريق كتابة عنوان الصفحة في‬
‫شريط عنوان المتصفح‪.‬‬
‫لنفترض أنه لدينا صفحة انترنت باسم ‪ admin.php‬و للوصول لھذه الصفحة بطريقه صحيحة يجب على المستخدم‬
‫المرور أوال عبر الصفحة ‪ login.php‬و تعبئة بيانات الدخول‪ .‬إذا حاول المستخدم الوصول للصفحة ‪admin.php‬‬
‫عن طريق كتابة عنوان الصفحة مباشرة في شريط عنوان المتصفح سنقوم بمنعه و طباعة رسالة مناسبة‪.‬‬

‫‪login.php‬‬ ‫‪admin.php‬‬

‫×‬
٦٠ Handling forms ‫ التعامل مع النماذج‬: ‫الفصل السابع‬

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8" />
<style>
body{
direction:rtl;
}
form{
font-weight:bold;
}
.button{
font-weight:bold;
width:75px;
}
</style>
</head>
<body>
<form method="post" action="admin.php">
<p>‫ ا`!م‬%‫ا‬
<label for="user_name"></label>
<input type="text" name="user_name" id="user_name" />
</p>
<p>‫آ اور‬
<label for="password"></label>
<input type="password" name="password" id="password" />
</p>
<p>3‫آ‬2

<input type="checkbox" name="remeber_me" id="remeber_me" />


<label for="remeber_me"></label>
</p>
<p>
<input type="submit" name="login" id="login" value="‫"د@ ل‬
/>
</p>
</form>
</body>
</html>

login.php ‫احفظ الصفحة السابقة باسم‬


<?php
if(array_key_exists('login',$_POST))
{
echo'<h1>‫ ادارة‬SP & • #)</h1>';
}
else
{
echo'S"‫ ا‬12, ‫ ل‬P  #|P •! ';
}
?>
‫‪٦١‬‬ ‫الفصل السابع ‪ :‬التعامل مع النماذج ‪Handling forms‬‬

‫احفظ الصفحة السابقة باسم ‪.admin.php‬‬


‫قم اآلن بكتابة العنوان التالي ‪ http://localhost/login.php‬و من ثم قم بتعبئة النموذج و اضغط على زر دخول‪.‬‬
‫بعد ذلك قم بفتح نافذة جديدة من متصفح االنترنت عن طريق الضغط على ‪ CRTL + N‬و من ثم قم بكتابة العنوان‬
‫التالي ‪ ، http://localhost/admin.php‬اآلن الحظ الناتج‪.‬‬

‫الروابط التفاعلية ‪dynamic links‬‬

‫في الفصول السابقة كنا نقوم بإرسال البيانات عن طريق النماذج باستخدام ‪ POST‬أو ‪ GET‬إلى صفحات ‪PHP‬‬
‫لكي يتم معالجتھا‪ .‬لكن ماذا لو أردنا بدال من إرسال المعلومات عن طريق النماذج أن نقوم بإرسالھا عن طريق‬
‫الروابط التشعبية ضمن الوسم >‪ .<a‬في ھذه الحالة سيتم إرسال البيانات إلى المصفوفة العامة ‪) $_GET‬عبارة عن‬
‫مصفوفة ترابطية ‪ . ( associative array‬و كما ھو معلوم لدينا أنه في المصفوفات الترابطية المفاتيح عبارة عن‬
‫نصوص و ليست أرقام‪ .‬لذلك لو أردنا أن نضيف عنصر داخل المصفوفة ‪ $_GET‬و له القيمة ‪ Ahmad‬فنقوم‬
‫بما يلي ‪:‬‬

‫; "‪$_GET[ 'name' ] = "Ahmad‬‬

‫لكن كيف سيتم إرسال رابط تشعبي و يتم تخزين قيمه داخل المصفوفة ‪ $_GET‬؟‬

‫لكي نقوم بذلك نقوم أوال بكتابة اسم الصفحة التي ستقوم باستقبال البيانات ‪ ،‬مثال ‪ login.php‬متبوعة بعالمة استفھام‬
‫? و من ثم اسم المفتاح متبوعا بعالمة يساوي = يليھا قيمة العنصر كالتالي‪:‬‬
‫>"‪<a href= "login.php?name=Ahmad‬‬

‫القيمة المفتاح اسم الصفحة متبوع بعالمة ?‬

‫في حال أردنا إضافة أكثر من قيمة نقوم بالفصل بين القيم كالتالي‪:‬‬

‫>"‪<A href= "login.php?name=Ahmad&password=12345‬‬

‫>‪<html‬‬
‫>‪<head‬‬
‫‪<meta‬‬ ‫"‪http-equiv="Content-Type‬‬ ‫;‪content="text/html‬‬
‫>‪charset=utf-8" /‬‬
‫>‪<style‬‬
‫{‪body‬‬
‫;‪direction:rtl‬‬
‫}‬
‫>‪</style‬‬
‫>‪</head‬‬
‫>‪<body‬‬
‫‪<a‬‬
‫ا'"<اوا‪href="dynamicLinks.php?firstName=T!&&lastName= °‬‬
‫>‪ </a><br /‬ا‬
‫‪٦٢‬‬ ‫الفصل السابع ‪ :‬التعامل مع النماذج ‪Handling forms‬‬

‫‪<?php‬‬
‫)‪if(array_key_exists('firstName',$_GET‬‬
‫))‪&& array_key_exists('lastName',$_GET‬‬
‫{‬
‫]'‪echo'<h2> • #) ' . $_GET['firstName‬‬ ‫‪.‬‬ ‫'‬ ‫'‬ ‫‪.‬‬
‫;'>‪$_GET['lastName'] .'</h2‬‬
‫}‬
‫>?‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪http://localhost/dynamicLinks.php‬‬

‫العلي=‪&&lastName‬عبدﷲ=‪http://localhost/dynamicLinks.php?firstName‬‬

‫استخدام الدالة ) (‪trim‬‬

‫تعتبر الدالة ) (‪ trim‬من دوال ‪ PHP‬المبنية مسبقا وتُستخدم إلزالة المسافات الفارغة في بداية و نھاية النص ‪string‬‬
‫‪ .‬و تعتبر من الدوال التي يشيع استخدامھا مع نماذج ‪ HTML‬و ذلك إلزالة أي مساحات فارغة في القيم المدخلة من‬
‫قبل المستخدم قبل إجراء أي عملية على تلك البيانات كتخزينھا في قواعد البيانات مثال‪.‬‬

‫‪<?php‬‬
‫‪// remove leading and trailing whitespace‬‬
‫‪// output 'a b‬‬ ‫'‪c‬‬
‫‪$str = ' a b‬‬ ‫‪c‬‬ ‫;'‬
‫;)‪echo trim($str‬‬
‫>?‬
٦٣ Handling forms ‫ التعامل مع النماذج‬: ‫الفصل السابع‬

‫تطبيق عملي‬

‫ وقبل أن يتمكن الزائر من البدء في تعبئة النموذج يجب أن‬.‫في ھذا التطبيق سنقوم بتصميم نموذج تسجيل زائر جديد‬
.‫يقوم الزائر بالموافقة على الشروط التسجيل‬
:‫ قم بكتابة الشفرة التالية‬.‫ بعد ذلك سيقوم البرنامج بإنشاء مساحة عمل فارغة‬.Notepad++ ‫قم بفتح برنامج‬

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8" />
<title>`‫ ذج ا‬3</title>
<style>
body{
direction:rtl;
}
.agreement{
border:1px solid #CCC;
width:350px;
padding:5px;
}
form input{
border:1px solid #CCC;
}
form .button{
width:80px;
}
form fieldset{
width:350px;
border:1px solid #CCC;
}
form fieldset legend{
font-weight:bold;
border:1px solid #CCC;
}

</style>

</head>

<body>
<?php
/*
`‫ ا
? ا‬/ &‫ ا ا‬t
‫ )( ) اذا‬R|@ () -S3 ‫اط‬
 ‫ام‬.
`‫ل  ذج ا‬-3‫ (  ا‬-&‫اذا 
 ا ا‬
*/
if(!array_key_exists('agreement',$_POST) &&
!array_key_exists('register',$_POST))
{
٦٤ Handling forms ‫ التعامل مع النماذج‬: ‫الفصل السابع‬

echo"
<p class='agreement'>
‫ …وط‬/ -&‫
   ا` & ا ?} ا ا‬
‫!ام ا ?} " رة‬%‫( ا‬¤
‫ا`  ?} و ا‬
‫ ا…ص‬/ ,‫ و!م ا'½  ?} أو ا‬.…....
</p>
<form method='post'>
<p>`‫ …وط ا‬/ &‫<أوا‬input type='checkbox'
name='agreement'/></p>
<p><input type='submit' name='accept_agreement'
value='‫ 'ا ة ا‬class='button'/></p>
</form>
";
}
/*
!'   ‫ ا
? ا` و‬/ &‫ )( ان ا`!م وا‬-S3 ‫ه‬
`‫ ا‬
*/
elseif(array_key_exists('agreement',$_POST) &&
!array_key_exists('register',$_POST))
{
?>
<form method='post'>
<fieldset >
<legend>!! ¤ `
‫ ذج‬3</legend>
<table>
<tr>
<td>)‫ ا‬%‫*ا‬: </td>
<td><input type='text' name='name' id='name'
maxlength="50" /></td>
</tr>
<tr>
<td>3‫*ا! او‬:</td>
<td><input type='text' name='email' id='email'
maxlength="50" /></td>
</tr>
<tr>
<td>‫ ا`!م‬%‫*ا‬:</td>
<td><input type='text' name='username' id='username'
maxlength="50" /></td>
</tr>
<tr>
<td>‫*آ اور‬:</td>
<td><input type='password' name='password'
id='password' maxlength="50" /></td>
</tr>
<tr>
<td><br />* ‫ )  ب‬-S‫<ا‬/td><td><br /><input
type='submit' name='register' value='`‫'ا
م ا‬
class="button"/></td>
</tr>
‫‪٦٥‬‬ ‫الفصل السابع ‪ :‬التعامل مع النماذج ‪Handling forms‬‬

‫>‪</table‬‬
‫>‪</fieldset‬‬
‫>‪</form‬‬
‫‪<?php‬‬
‫}‬
‫‪else‬‬
‫{‬
‫;]'‪$name = $_POST['name‬‬
‫;]'‪$username = $_POST['username‬‬
‫;]'‪$email = $_POST['email‬‬
‫;]'‪$pass = $_POST['password‬‬

‫;' …ا • ا@ اŒا‪ / ±‬ا


م  ا`'‪echo‬‬
‫;'‪3:‬ت
`• آ  '‪echo‬‬
‫;‪:' . $name‬ا‪ %‬آ)|>‪echo'<br/‬‬
‫;‪:' . $username‬ا‪ %‬ا`!م>‪echo'<br/‬‬
‫;‪:' . $email‬ا! او‪echo'<br/>3‬‬
‫;‪:' . $pass‬آ اور>‪echo'<br/‬‬
‫}‬
‫>?‬
‫>‪</body‬‬
‫>‪</html‬‬

‫‪ .‬و من النافذة التالية قم بما يلي‪:‬‬ ‫بعد االنتھاء من كتابة الشفرة السابقة ‪ ،‬قم بالنقر على زر حفظ‬
‫‪ .١‬قم بتغيير مكان الحفظ عن طريق االنتقال للمجلد ‪.C:\xammp\htdocs‬‬
‫‪ .٢‬قم بتسمية الملف باسم ‪. register.php‬‬
‫‪ .٣‬غير نوع الملف ‪ Save as type‬من القائمة المنسدلة ليصبح )*‪ All types(*.‬أو ‪PHP Hypertext‬‬
‫‪.Preprocessor files‬‬
‫‪ .٤‬انقر على الزر ‪.Save‬‬

‫بعد االنتھاء من عملية الحفظ ‪،‬افتح متصفح االنترنت و اكتب العنوان التالي‪ http://localhost/register.php :‬و‬
‫من ثم الحظ الناتج‪.‬‬
‫‪٦٦‬‬ ‫الفصل السابع ‪ :‬التعامل مع النماذج ‪Handling forms‬‬

‫‪١‬‬

‫‪٢‬‬

‫‪٣‬‬
‫‪٦٧‬‬ ‫الفصل السابع ‪ :‬التعامل مع النماذج ‪Handling forms‬‬

‫أسئلة نھاية الفصل‬

‫‪ .١‬عند التعامل مع النماذج ما ھو الفرق بين طريقة إرسال البيانات ‪ POST‬و ‪. GET‬‬

‫‪ .٢‬ما وظيفة كال من الدوال التالية‪:‬‬

‫) (‪array_key_exists‬‬ ‫‬

‫) (‪trim‬‬ ‫‬

‫‪ .٣‬كيف يمكن التحقق من أزرار االختيار ‪ radio‬في حال كانت تتبع لمجموعة واحدة‪.‬‬

‫‪ .٤‬أين سيتم تخزين القيم المرسلة من خالل الرابط التفاعلي ‪.‬‬


‫‪٦٨‬‬ ‫الفصل الثامن ‪ :‬التحقق من بيانات النماذج ‪Form validation‬‬

‫ھذا الفصل يغطي‪:‬‬

‫أھمية عملية التحقق من البيانات ال ُمدخلة‪.‬‬ ‫‬


‫مفھوم التعبيرات العادية ‪.Regular Expressions‬‬ ‫‬
‫كيف مطابقة االنماط في ‪.PHP‬‬ ‫‬

‫عند التعامل مع نماذج ‪ HTML‬بغرض السماح للمستخدمين بإدخال بيانات محددة فيجب علينا التحقق من تلك‬
‫البيانات قبل إجراء أي عملية عليھا‪ .‬و تكمن أھمية إجراء عملية التحقق ألننا ال نضمن أن تكون البيانات ال ُمدخلة‬
‫صحيحة‪ ،‬وبدون إجراء عملية التحقق قد تتسبب تلك البيانات بحدوث نتائج غير متوقعة قد يصعب معالجتھا الحقا‪.‬‬
‫لذلك يجب أن ال نثق في المستخدم ألن األخطاء قد تحدث عمدا أو عن غير قصد‪.‬‬
‫عملية التحقق من البيانات يمكن أن تتم بواسطة طريقتين‪:‬‬

‫عن طريق جھة العميل ‪ client-side‬باستخدام ‪ JavaScript‬مثال‪.‬‬ ‫‬


‫عن طريق جھة الخادم ‪ server-side‬باستخدام ‪.php‬‬ ‫‬

‫ما ھي األشياء التي يجب أن نتحقق منھا‬

‫التحقق من الحقول الفارغة‪.‬‬ ‫‬


‫التحقق من البريد االلكتروني‪.‬‬ ‫‬
‫طول البيانات ال ُمدخلة‪.‬‬ ‫‬
‫حقول األرقام فقط‪.‬‬ ‫‬
‫حقول الحروف فقط‪.‬‬ ‫‬
‫حقول الحروف و األرقام‪.‬‬ ‫‬
‫إزالة وسوم ‪.HTML‬‬ ‫‬

‫و لتحقيق ذلك يوجد طرق كثيرة في ‪ PHP‬و من ضمنھا التعبيرات العادية ‪ . Regular Expressions‬في ھذه‬
‫الطريقة يتم البحث عن نمط ‪ pattern‬ضمن نص محدد‪.‬‬

‫أساسيات التعبيرات العادية ‪Regular Expressions Basics‬‬


‫داخل النص‬ ‫في التعبيرات العادية ُمعظم الحروف تطابق نفسھا‪ .‬فمثال لو بحثنا عن التعبير "‪"foo‬‬
‫"‪ "John plays football‬فستتم المطابقة لظھور التعبير "‪ "foo‬داخل النص السابق‪.‬‬
‫بعض الحروف الخاصة ‪ special characters‬لھا معنى خاص في التعبيرات العادية‪.‬‬
‫فمثال عالمة ‪ $‬تُستخدم للبحث عن نمط في نھاية النص‪ .‬و العالمة ^ تُستخدم للبحث عن نمط في بداية النص‪ .‬و النقطة‬
‫‪ .‬تُستخدم للبحث عن أي حرف ماعدا السطر الجديد‪.‬‬
‫و في حال أردنا البحث عن نمط داخل نص بعدد مرات محدد فيمكن استخدام الرموز التالية‪:‬‬

‫الرمز * للبحث عن نمط داخل نص بعدد صفر أو أكثر من المرات‪.‬‬ ‫‬


‫الرمز ‪ +‬للبحث عن نمط داخل نص بعدد واحد أو أكثر من المرات ‪.‬‬ ‫‬
‫الرمز ؟ للبحث عن نمط داخل نص بعدد صفر أو واحد من المرات‪.‬‬ ‫‬
‫‪٦٩‬‬ ‫الفصل الثامن ‪ :‬التحقق من بيانات النماذج ‪Form validation‬‬

‫الرمز } { للبحث عن نمط داخل نص بعدد مرات مختلف‪ .‬فمثال }‪ {n‬على فرض أن ‪ n‬عبارة عن رقم‬ ‫‬
‫صحيح تعني عدد مرات ظھور النمط داخل النص‪ .‬و التعبير }‪ {n,m‬تعني مرات ظھور النمط داخل النص‬
‫على األقل ‪ n‬و على األكثر ‪. m‬‬

‫الجدول التالي يحتوي على عدد من األمثلة عن التعبيرات العادية‪.‬‬

‫سيتم مطابقة‪..‬‬ ‫التعبير العادي ‪Regular Expression‬‬


‫سيتم مطابقة الكلمة ‪foo‬‬ ‫‪foo‬‬
‫سيتم مطابقة الكلمة ‪ foo‬في بداية النص‬ ‫‪^foo‬‬
‫سيتم مطابقة الكلمة ‪ foo‬في نھاية النص‬ ‫‪foo$‬‬
‫يجب أن يحتوي النص على الكلمة ‪ foo‬فقط‪.‬‬ ‫‪^foo$‬‬
‫سيتم مطابقة ‪ b ، a‬أو ‪c‬‬ ‫]‪[abc‬‬
‫أي حرف صغير‬ ‫]‪[a-z‬‬
‫سيتم مطابقة إما ‪ gif‬أو ‪jpeg‬‬ ‫)‪(gif|jpeg‬‬
‫سيتم مطابقة أي حرف صغير بعدد مرات ظھور مرة أو أكثر‪.‬‬ ‫‪[a-z]+‬‬
‫سيتم مطابقة أي رقم أو نقطة أو اشارة سالب‬ ‫]‪[0-9\.\-‬‬
‫سيتم مطابقة كلمة واحدة فقط تحتوي على األقل على حرف أو‬ ‫‪^[a-zA-Z0-9_]{1,}$‬‬
‫رقم أو شرطة سفلية‪.‬‬
‫أي رمز ) يجب أن ال يكون حرفا أو رقما(‬ ‫]‪[^A-Za-z0-9‬‬
‫سيتم مطابقة أي كلمة تحتوي على ثالثة أحرف أو أربعة أرقام‪.‬‬ ‫)}‪([A-Z]{3}|[0-9]{4‬‬

‫كل األنماط عند استخدامھا بشكل عملي يجب أن توضع بين شرطتين مائلة ‪./ /‬‬

‫للمزيد حول التعبيرات العادية ‪ Regular Expressions‬يمكن زيارة الموقع التالي‪:‬‬


‫‪http://www.regular-expressions.info/‬‬

‫مطابقة األنماط ‪Matching Patterns‬‬

‫أخيرا لمطابقة األنماط في ‪ PHP‬سنقوم بإستخدام الدالة ) (‪ . preg_match‬يتم تمرير عدد من المعطيات‬
‫‪ parameters‬لھذه الدالة‪ .‬من ضمن ھذه المعطيات ‪ ،‬النمط ‪ pattern‬و النص ‪ string‬الذي سيتم البحث داخله‪ .‬في‬
‫حال و جدت الدالة النمط داخل النص ستقوم بإرجاع القيمة ‪) 1‬التي تماثل ‪ (true‬بخالف ذلك ستقوم بإرجاع القيمة ‪0‬‬
‫)التي تماثل ‪.(false‬‬
‫‪<?php‬‬
‫;"‪$string = "abcdef‬‬
‫;'‪$pattern = '/^def/‬‬
‫;)‪echo preg_match($pattern,$string‬‬
‫‪ %‬ن ا
‪//٠ B‬‬
‫>?‬
٧٠ Form validation ‫ التحقق من بيانات النماذج‬: ‫الفصل الثامن‬

<?php
$string = "defabc";
$pattern = '/^def/';
echo preg_match($pattern,$string);
//١ B
‫ ن ا‬%
?>

‫تطبيق عملي‬

‫ في ھذا التطبيق لن يتمكن الزائر من إرسال النموذج إال بعد‬.‫في ھذا التطبيق سنقوم بتصميم نموذج تسجيل زائر جديد‬
‫ كما يجب أن تكون المعلومات ال ُمدخلة صحيحة و لتحقيق ذلك سنقوم باستخدام‬.‫أن يقوم بتعبئة كامل النموذج‬
.validation ‫ للقيام بعملية التحقق‬preg_match() ‫ مع الدالة‬Regular Expressions ‫التعبيرات العادية‬
:‫ قم بكتابة الشفرة التالية‬.‫ بعد ذلك سيقوم البرنامج بإنشاء مساحة عمل فارغة‬.Notepad++ ‫قم بفتح برنامج‬

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8" />
<title>`
‫ ذج‬3</title>
<style type="text/css">
body{
direction:rtl;
}

form input{
border:1px solid #CCC;
}
#result{
font-weight:bold;
color:#930;
text-align:center;
}

table{
border:2px solid #0C3;
width:500px;
padding:10px;
}
table caption{
background-color:#0C3;
font-weight:bold;
}
.submit{
width:75px;
}

.errorMessage{
text-align:right;
٧١ Form validation ‫ التحقق من بيانات النماذج‬: ‫الفصل الثامن‬

font-weight:normal;
}
</style>
</head>
<body>
<form action="" method="post">
<table align="center">
<caption>!! ‫ ذج
` )`!م‬3</caption>
<tr><td colspan="2" id="result">
<?php
if(array_key_exists('register',$_POST))
{
$errors=array();

if(empty($_POST['name']))
{
array_push($errors,'%| ? ‫اء إد@ل‬.');
}
elseif(preg_match('/[\'\/~`\!@#\$%\^&\*\(\)_\-
\+=\{\}\[\]\|;:"\<\>,\.\?\\\]/', $_POST['name']))
{
array_push($errors,' Q ? / ‫ ي‬S @!‫ ا‬%‫ا‬
SP.');
}

if(empty($_POST['username']))
{
array_push($errors,' %² ? ‫اد@ل‬ ‫اء‬
‫;)'ا`!م‬
}
elseif(!preg_match("/^[A-Za-z][A-Za-z0-
9_]+$/",$_POST['username']))
{
array_push($errors,' ‫ ا`!م‬%² @!‫ا‬ -‫ا‬
SP Q.');
}

if(empty($_POST['password']))
{
array_push($errors,'  ? ‫اد@ل‬ ‫اء‬
‫;)'اور‬
}
elseif(!preg_match("/^[A-Za-z0-9_]*[A-Z][A-Za-z0-
9_]*$/",$_POST['password']))
{
array_push($errors,' ‫ ا!@  اور‬-‫ا‬
SP Q.');
}
٧٢ Form validation ‫ التحقق من بيانات النماذج‬: ‫الفصل الثامن‬

elseif(strlen($_POST['password'])<6)
{
array_push($errors,' ٦ ( -
 ‫آ اور  أن‬
‫ت‬3@.');
}
elseif($_POST['password2'] !== $_POST['password'])
{
array_push($errors,' ‫
¿آ! آ اور    آ‬
@!ُ
‫;)'اور ا‬
}
if(empty($_POST['email']))
{
array_push($errors,' ! ? ‫اء اد@ل‬
3‫;)'او‬
}
elseif(!preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-
9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})]*$/",$_POST['email']))
{
array_push($errors,' ! @!‫ا‬ -‫ا‬
SP Q 3‫و‬²‫ا‬.');
}

if(empty($_POST['phone']))
{
array_push($errors,'u
, ? ‫;)'اء اد@ل‬
}
elseif(!preg_match("/^[0-9]{10,12}$/",$_POST['phone']))
{
array_push($errors,' Q u
, @!‫ ا‬-‫ا‬
SP.');
}

if(empty($_POST['gender']))
{
array_push($errors,'•` !!S
‫;)'اء‬
}

if(empty($_POST['from']))
{
array_push($errors,'‫!! !ك‬S
‫اء‬.');
}

if(empty($_POST['agreement']))
{
array_push($errors,' ‫…وط‬ / -&‫ا ا‬ ‫اء‬
`‫ا‬.');
}
٧٣ Form validation ‫ التحقق من بيانات النماذج‬: ‫الفصل الثامن‬

if($errors)
{
echo'<ol class="errorMessage">';
foreach($errors as $value)
{
echo '<li>'.$value.'</li>';
}
echo'</ol>';
}
else
{
echo'.‫  ا` ح‬t
‫! أ‬- • ‫;'…ا‬
}
}
?>
</td></tr>
<tr>
<td>|)‫ آ‬%‫<ا‬/td>
<td><input name="name" id="name" size="20" maxlength="20"
type="text" value="<?php echo @$_POST['name']?>"/>*</td>
</tr>
<tr>
<td>‫ ا`!م‬%‫<ا‬/td>
<td><input name="username" id="username" size="20"
maxlength="20" type="text" value="<?php echo
@$_POST['username']?>"/>*</td>
</tr>
<tr>
<td>‫<آ اور‬/td>
<td><input name="password" id="password" size="20"
maxlength="15" type="password">*</td>
</tr>
<tr>
<td>‫<
¿آ! آ اور‬/td>
<td><input name="password2" id="password2" size="20"
maxlength="15" type="password">*</td>
</tr>
<tr>
<td>3‫<ا! او‬/td>
<td><input name="email" size="35" maxlength="30"
type="text" value="<?php echo @$_POST['email']?>">*</td>
</tr>
<tr>
<td>u
,‫<ر? ا‬/label></td>
<td><input name="phone" size="15" maxlength="15"
type="text" value="<?php echo @$_POST['phone']?>">*</td>
</tr>
<tr>
<td>‫<ا‬/td>
<td>‫<ذآ‬input name="gender" type="radio" value="male"><br
/>
٧٤ Form validation ‫ التحقق من بيانات النماذج‬: ‫الفصل الثامن‬

/*3‫<أ‬input name="gender" type="radio" value="female">*


</td>
</tr>
<tr>
<td>!‫<ا‬/td>
<td>
<select name="from">
<option value="" selected></option>
<option value="‫<ا`' د>"ا`' د‬/option>
<option value=" ?"> ?</option>
<option value="t ‫>"ا‬t ‫<ا‬/option>
</select>*
</td>
</tr>
<tr>
<td>`‫ …وط ا‬/ -&‫<ا ا‬/td>
<td><input name="agreement" type="checkbox"/></td>
</tr>
<tr>
<td><input name="register" value="`
" type="submit"
class="submit"/></td>
<td align="left">*   ) ‫ ل‬-S‫<ا‬/td>
</tr>
</table>
</form>
</body>
</html>

:‫ و من النافذة التالية قم بما يلي‬. ‫ قم بالنقر على زر حفظ‬، ‫بعد االنتھاء من كتابة الشفرة السابقة‬
.C:\xammp\htdocs ‫ قم بتغيير مكان الحفظ عن طريق االنتقال للمجلد‬.١
. form.php ‫ قم بتسمية الملف باسم‬.٢
PHP Hypertext ‫ أو‬All types(*.*) ‫ من القائمة المنسدلة ليصبح‬Save as type ‫ غير نوع الملف‬.٣
.Preprocessor files
.Save ‫ انقر على الزر‬.٤

‫ و من‬http://localhost/form.php :‫افتح متصفح االنترنت و اكتب العنوان التالي‬، ‫بعد االنتھاء من عملية الحفظ‬
.‫ثم الحظ الناتج‬
‫‪٧٥‬‬ ‫الفصل الثامن ‪ :‬التحقق من بيانات النماذج ‪Form validation‬‬

‫في حال قام الزائر بإرسال النموذج بدون إدخال بيانات فسيتم عرض رسائل الخطأ التالية‪.‬‬

‫شرح التطبيق‪:‬‬
‫‪ .١‬قمنا بتعريف المصفوفة ‪ $errors‬لتخزين رسائل األخطاء التي ستحدث أثناء عملية التحقق‪.‬‬
‫‪ .٢‬في حال حدوث أي خطأ أثناء عملية التحقق سنقوم بإدراج رسالة الخطأ المناسبة داخل المصفوفة السابقة‬
‫عن طريق استدعاء الدالة ) (‪ array_push‬و تمرير معطيين لھا‪ .‬األول يمثل إسم المصفوفة و الثاني رسالة‬
‫الخطأ‪.‬‬
‫‪ .٣‬نقوم بالتحقق من الحقول الفارغة عن طريق الدالة ) (‪ empty‬عن طريق تمرير المتغير الذي يحتوي على‬
‫قيمة الحقل المحدد‪ .‬في حال كان الحقل فارغا ستقوم الدالة بإرجاع القيمة ‪.true‬‬
‫‪ .٤‬في حقل االسم استخدمنا النمط التالي‬
‫‪/[\'\/~`\!@#\$%\^&\*\(\)_\-\+=\{\}\[\]\|;:"\<\>,\.\?\\\]/‬‬
‫و الھدف من ھذا النمط أن يتم رفض أي قيم غير الحروف و األرقام و المسافة‪.‬‬
‫‪ .٥‬في حقل اسم المستخدم استخدمنا النمط التالي‬
‫‪/^[A-Za-z][A-Za-z0-9_]*+$/‬‬
‫و ذلك لكي يتم قبول فقط الحروف واألرقم و الشرط السفلية‪.‬‬
‫‪٧٦‬‬ ‫الفصل الثامن ‪ :‬التحقق من بيانات النماذج ‪Form validation‬‬

‫‪ .٦‬في حقل كلمة المرور استخدمنا النمط‬


‫‪/^[A-Za-z0-9_]*[A-Z][A-Za-z0-9_]*$/‬‬
‫و ھنا فرضنا ان تحتوي كلمة المرور على حروف وأرقام و شرطة سفلية باإلضافة الى وجوب أن تحتوي‬
‫كلمة المرور على حرف واحد كبير على األقل‪.‬‬
‫‪ .٧‬يجب أن ال تقل كلمة المرور عن ‪ ٦‬خانات و لتحقيق ذلك استخدمنا الدالة ) (‪ strlen‬و التي تستقبل معطى‬
‫واحد يمثل المتغير الذي ستقوم بإرجاع طوله‪.‬‬
‫‪ .٨‬يجب أن تتطابق كلمة المرور ال ُمدخلة مع حقل تأكيد كلمة المرور‪.‬‬
‫‪ .٩‬في حقل البريد االلكتروني استخدمنا النمط التالي‬
‫‪/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-‬‬
‫‪]+)*(\.[a-z]{2,3})]*$/‬‬
‫و ھذا النمط يھدف إلى أن يكون البريد ال ُمدخل بريدا صالحا‪.‬‬
‫‪ .١٠‬في حقل الھاتف استخدمنا النمط ‪ /^[0-9]{10,12}$/‬و باستخدام ھذا النمط فرضنا قبول فقط قيمة‬
‫رقمية ال تقل عن عشرة أرقام و ال تزيد عن اثني عشر رقما‪.‬‬
‫‪ .١١‬بعد االنتھاء من عملية التحقق قمنا بالتأكد من أن المصفوفة ‪ $errors‬فارغة‪ ،‬و في ھذه الحالة و باستخدام‬
‫حلقة التكرار ‪ foreach‬قمنا بطباعة محتوى المصفوفة‪.‬‬
‫‪ .١٢‬بخالف ذلك‪ ،‬إذا كانت المصفوفة فارغة أي أن المستخدم أدخل كل البيانات المطلوبة بشكل صحيح ‪ ،‬عندھا‬
‫قمنا بطباعة رسالة مناسبة‪.‬‬
‫‪ .١٣‬أخيرأ‪ ،‬لضمان أن الزائر ال يقوم بتعبئة الحقول مرة أخرى قمنا بطباعة قيمة الحقل ال ُمرسلة من النموذج كما‬
‫يلي‪:‬‬
‫"‪<input name="name" id="name" size="20" maxlength="20‬‬
‫>‪type="text" value="<?php echo @$_POST['name']?>"/‬‬
‫و كما ھو مالحظ أسبقنا المتغير بالعالمة @ لمنع ظھور الخطأ قبل أن يتم إرسال النموذج‪.‬‬
‫‪٧٧‬‬ ‫الفصل الثامن ‪ :‬التحقق من بيانات النماذج ‪Form validation‬‬

‫أسئلة نھاية الفصل‬

‫‪ .١‬ما أھمية التحقق من البيانات ال ُمدخلة في النموذج؟‬

‫‪ .٢‬أيھما أفضل التحقق من البيانات بواسطة جھة العميل أو جھة الخادم مع ذكر السبب؟‬

‫‪ .٣‬ھل ھناك طريقة أخرى غير استخدام الدالة ) (‪ empty‬للتحقق من الحقول الفارغة ؟‬

‫‪ .٤‬ھل يمكن استخدام وسوم ‪ HTML‬بھدف اإلضرار بتطبيق االنترنت و كيف يمكن منع المستخدم من‬

‫إدخالھا في النموذج؟‬

‫‪ .٥‬مستخدما شبكة اإلنترنت كيف يمكن التغلب على مشكلة ‪ SPAM‬مع النماذج؟‬
‫‪٧٨‬‬ ‫الفصل التاسع ‪ :‬العمل مع ‪ Cookies‬و ‪Sessions‬‬

‫ھذا الفصل يغطي‪:‬‬

‫كيفية التعامل مع ‪.cookie‬‬ ‫‬


‫كيفية التعامل مع الجلسة ‪.Session‬‬ ‫‬
‫الطرق ال ُمستخدمة إلعادة توجيه المستخدم‪.‬‬ ‫‬

‫كما ھو معلوم أن البروتوكول المستخدم في نقل البيانات بين متصفح اإلنترنت و مواقع الويب المختلفة ھو بروتوكول‬
‫نقل النص التشعبي )‪ . HTTP( Hypertext Transfer Protocol‬لكن قد ال يعرف الكثير أن ھذا البرتوكول من‬
‫النوع ‪ stateless‬بمعنى أنه يتعامل مع كل طلب ‪ request‬بشكل مستقل بدون أن يكون ھناك أي عالقة بين الطلب‬
‫الحالي ‪ current request‬و الطلب السابق ‪ . previous request‬لشرح ھذه العملية ‪ ،‬لنتخيل معا كيف يتم العمل‬
‫في المواقع التي تتيح خدمة التسوق اإللكتروني أو ما يسمى بـ ‪ . shopping carts‬الذي يحدث أن الزائر لموقع‬
‫التسوق يقوم باستعراض المنتجات التي يقدمھا الموقع و من ثم يقوم باختيار المنتج و إضافته إلى سلة الشراء‪ .‬في‬
‫الوضع العادي ‪ ،‬إذا انتقل الزائر إلى صفحة أخرى داخل الموقع لعرض منتج آخر فإن القيمة األولى المضافة إلى سلة‬
‫الشراء و التي تمثل المنتج األول الذي قام الزائر بإضافته إلى سلة الشراء سيتم فقدھا !! و السبب كما ذكرنا أن‬
‫البروتوكول ‪ HTTP‬من النوع الذي ال يتذكر ما تم مسبقا مع الطلبات السابقة‪ .‬للتغلب على ھذه المشكلة فإن كثير من‬
‫مواقع الويب تقوم باستخدام ما يسمى بـ ‪ sessions‬و ‪ PHP . cookies‬تقدم دعم كامل لـ ‪ sessions‬و ‪cookies‬‬
‫عن طريق عدد من الدوال المبنية مسبقا و الجاھزة لالستخدام من قبل مطوري الويب‪.‬‬

‫التعامل مع الـ ‪cookies‬‬

‫‪ cookies‬عبارة عن ملفات نصية صغيرة يتم تخزينھا في جھاز المستخدم بواسطة موقع إنترنت‪ .‬ھذه الملفات تحتوي‬
‫على معلومات تسترجع من قبل موقع اإلنترنت الذي قام المستخدم بزيارته‪ .‬و كمثال عليھا المنتديات الحوارية‪ .‬عندما‬
‫يقوم المستخدم بتسجيل الدخول إلى أي منتدى للحوار يقوم بإدخال اسم المستخدم و كلمة المرور ‪ ،‬و في حال قام‬
‫بتحديد صح على مربع )تذكرني( في نموذج الدخول سيقوم الموقع بتخزين ملف ‪ cookie‬داخل جھاز المستخدم يتم‬
‫استخدامھا الحقا اذا قام المستخدم بزيارة الموقع الحقا و يتم تسجيل دخوله تلقائيا عن طريق المعلومات المخزنه داخل‬
‫جھازه‪ .‬تعاني ‪ cookies‬من كثير من النقد ألنھا تستخدم لنقل البيانات بين المستخدم و موقع الويب لذلك توصف دائما‬
‫بأنھا سيئة و غير آمنة‪ .‬لكن الحقيقة أنھا تعتبر كغيرھا من التقنيات يمكن استخدامھا بشكل سلبي أو إيجابي ‪ .‬لكن أكثر‬
‫ما يعيبھا أنه يمكن قراءتھا من قبل أي شخص يستخدم جھاز الكمبيوتر ألنھا ببساطة عبارة عن ملفات نصية‪ .‬لذلك‬
‫يجب تجنب حفظ كلمات المرور باستخدام ‪ cookie‬إال في حال أن يتم تشفير كلمة المرور قبل أن يتم حفظھا و من ثم‬
‫يتم مطابقتھا بكلمة المرور المشفرة و المخزنة على الخادم ‪.web server‬‬

‫أخيرا تتميز ‪ cookie‬بعض الخواص اآلمنة‪:‬‬

‫ملفات ‪ cookies‬يمكن قراءتھا فقط بواسطة موقع اإلنترنت الذي قام بتخزينھا‪.‬‬ ‫‬
‫كل موقع إنترنت ال يمكنه تخزين أكثر من ‪ ٢٠‬ملف ‪.cookies‬‬ ‫‬
‫أقصى حجم لملف الـ ‪ cookie‬الواحد ھو ‪ ٤‬كيلوبايت‪.‬‬ ‫‬
‫أقصى عدد لملفات ‪ cookies‬التي يمكن تخزينھا داخل جھاز المستخدم ھو ‪ ٣٠٠‬ملف‪.‬‬ ‫‬

‫ألن ملفات ‪ cookies‬سيتم تخزينھا داخل جھاز المستخدم ‪ ،‬لذلك ستكون إمكانية التحكم فيھا محدودة‪ .‬فلو‬
‫قام المستخدم بإبطال دعم ‪) cookies‬من خيارات متصفح اإلنترنت( فلن يتمكن أي موقع من تخزين ملفات‬
‫‪ cookies‬داخل جھاز المستخدم‪.‬‬
‫‪٧٩‬‬ ‫الفصل التاسع ‪ :‬العمل مع ‪ Cookies‬و ‪Sessions‬‬

‫إنشاء ملف ‪cookie‬‬

‫إلنشاء ملف ‪ cookie‬سنقوم باستدعاء الدالة ) (‪ setcookie‬و التي تأخذ القيم التالية‪:‬‬

‫المعطى ‪Parameters‬‬ ‫الوصف ‪Description‬‬


‫‪name‬‬ ‫إسم ملف ‪) cookie‬إجباري(‬
‫‪value‬‬ ‫قيمة ‪cookie‬‬
‫‪expires‬‬ ‫الوقت بالثواني لصالحية ملف ‪cookie‬‬
‫‪domain‬‬ ‫إسم موقع اإلنترنت الذي خزن ملف ‪cookie‬‬
‫‪path‬‬ ‫تقوم بتحديد ما إذا كان ملف ‪ cookie‬سيكون متاحا لكامل الموقع‬
‫أو سيكون متاح لصفحات محددة داخل مجلد يتم تحديده‪ .‬الخيار ) ‪( /‬‬
‫يعني إتاحة الملف لكامل الموقع‪.‬‬
‫‪secure‬‬ ‫ھذا الخيار يحدد أن ملف ‪ cookie‬يتطلب اتصال آمن )‪(https‬‬
‫‪httponly‬‬ ‫ھذا الخيار يتيح إمكانية الوصول لملف ‪ cookie‬فقط عن طريق‬
‫بروتوكول ‪http‬‬

‫بسبب أن ملفات ‪ cookies‬سيتم إعدادھا بواسطة ‪ HTTP headers‬فيجب وضعھا قبل أي عملية طباعة‬
‫بواسطة شفرة ‪ . PHP‬في حال كان ملف ‪ PHP‬مضمنا مع وسوم ‪ HTML‬فيجب وضع الدالة أيضا قبل‬
‫وسوم ‪.HTML‬‬

‫‪<?php‬‬
‫‪setcookie("username", "Ahmad Ali", time()+3600, "/","",‬‬
‫;)‪0,1‬‬
‫;)‪setcookie("language", "ar", time()+3600, "/", "", 0, 1‬‬
‫>?‬
‫>‪<html‬‬
‫>‪<head‬‬
‫>‪</head‬‬
‫>‪<body‬‬
‫>?"
 ا‪3‬ء )‪ u‬ا آ" ‪<?php echo‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫قراءة ملفات الـ ‪cookie‬‬

‫نستطيع قراءة ملف ‪ cookie‬عن طريق المصفوفة العامة ‪ $_COOKIE‬بنفس الطريقة التي كنا نتعامل بھا مع‬
‫النماذج‪.‬‬
‫‪٨٠‬‬ ‫الفصل التاسع ‪ :‬العمل مع ‪ Cookies‬و ‪Sessions‬‬

‫‪<?php‬‬
‫))‪if(array_key_exists('username',$_COOKIE‬‬
‫{‬
‫;'>‪echo $_COOKIE['username'].'<br/‬‬
‫;'>‪echo $_COOKIE['language'].'<br/‬‬
‫}‬
‫‪else‬‬
‫{‬
‫;'‪echo'No cookie‬‬
‫}‬
‫>?‬

‫حذف ملف الـ ‪cookie‬‬

‫لحذف ملف ‪ cookie‬كل ما علينا عمله ھو استدعاء الدالة ) (‪ setcookie‬و نقوم بكتابة نفس قيم ملف ‪ cookie‬الذي‬
‫قمنا بإنشائه مسبقا لكن مع تحديد وقت الصالحية ملف ‪ cookie‬الى وقت سابق باإلضافة ترك القيمة فارغة كالتالي‪:‬‬

‫‪<?php‬‬
‫;)‪setcookie("username", "", time()-3600, "/","", 0,1‬‬
‫;)‪setcookie("language", "", time()-3600, "/", "", 0, 1‬‬
‫>?‬
‫>‪<html‬‬
‫>‪<head‬‬
‫>‪</head‬‬
‫>‪<body‬‬
‫>?"
 ‪2#‬ف )‪ u‬ا آ" ‪<?php echo‬‬
‫>‪</body‬‬
‫>‪</html‬‬

‫العمل مع ‪sessions‬‬

‫الجلسة أو ‪ session‬تعمل نفس عمل ‪ cookie‬بتوفير طريقة لالستمرارية ) تذكر الحالة ( مع اختالف بسيط في‬
‫التعامل‪ .‬فبدال من تخزين الملف في جھاز العميل يتم تخزين الملف على جھاز الخادم ‪ web server‬في مجلد مؤقت‬
‫يتم تخزين متغيرات ‪ session‬وقيمھا داخله ‪ .‬و لھذا السبب تعتبر ‪ sessions‬أكثر أمانا من ‪.cookies‬‬
‫أخيرا تنتھي ‪ session‬بمجرد إقفال المستخدم لمتصفح اإلنترنت‪.‬‬

‫إنشاء الجلسة ‪creating session‬‬

‫إلنشاء ‪ session‬كل ما علينا عمله ھو إستدعاء الدالة ) (‪ session_start‬في بداية كل صفحة نرغب بأن تُستخدم في‬
‫الجلسة مع ضرورة االنتباه لما يلي‪:‬‬
‫ ھذه الدالة يجب أن تستدعى مرة واحدة فقط في كل صفحة‪.‬‬
‫ يجب أن نستدعي ھذه الدالة قبل طباعة أي بيانات بواسطة الشفرة البرمجية باإلضافة إلى أنھا يجب أن‬
‫تسبق وسوم ‪.HTML‬‬
‫‪٨١‬‬ ‫الفصل التاسع ‪ :‬العمل مع ‪ Cookies‬و ‪Sessions‬‬

‫إنشاء متغيرات الجلسة ‪creating session variables‬‬

‫إلنشاء متغير الجلسة ‪ ،‬نستطيع إضافته إلى المصفوفة العامة ‪ ) $_SESSION‬ترابطية ‪ ( Associative‬بنفس‬
‫الطريقة التي نتعامل بھا مع المتغيرات‪ .‬فلو أردنا مثال تخزين إسم الزائر و طباعة رسالة ترحيب له‪ .‬فسوف نقوم‬
‫بتخزين إسمه في الجلسة كالتالي‪:‬‬
‫;]'‪$_SESSION['name'] = $_POST['name‬‬

‫كما ھو واضح قمنا بتخزين إسم الزائر و المدخلة عن طريق نموذج التسجيل في المصفوفة العامة ‪.$_SESSION‬‬
‫نستطيع اآلن استخدام متغير الجلسة السابق في كل صفحة تبدأ بـ ) (‪. session_start‬‬

‫حذف متغير الجلسة ‪destroying session variable‬‬

‫في حال أصبح متغير الجلسة غير مطلوب بواسطة الشفرة البرمجية فتسطتيع تدميره‪/‬حذفه عن طريق استدعاء الدالة‬
‫) (‪ unset‬كالتالي‪:‬‬
‫;)]'‪unset($_SESSION['name‬‬
‫في ھذه لن يصبح المتغير السابق متاحا ألي صفحة‪.‬‬

‫حذف الجلسة ‪destroying session‬‬

‫في حال لم يعد ھناك أي حاجة للجلسة الحالية نستطيع تدمير الجلسة عن طريق استدعاء الدالة‬
‫) (‪.session_destroy‬‬

‫إنھاء الجلسة بعد مرور وقت محدد ‪session time-outs‬‬

‫في بعض الحاالت عند التعامل مع نظام تسجيل الدخول ‪ user login system‬في موقع االنترنت تبرز الحاجة‬
‫الستخدام طريقة تضمن انھاء الجلسة في حال لم يقم المستخدم بأي نشاط بعد مرور وقت محدد‪ .‬ھذي الطريقة تساعد‬
‫على منع استخدام النظام من قبل شخص غير مخول له بذلك‪ .‬فلك أن تتخيل في حال نسي المستخدم اقفال صفحة‬
‫حسابه البنكي أو بريده االلكتروني في مقھى انترنت‪.‬‬
‫‪<?php‬‬
‫;)(‪session_start‬‬

‪ !!S‬ا ?‪ * t‬ا‪ !S 3‬ا‪ /"?0‬ا`‪ S‬ح *‪/‬‬
‫‪!`*/‬م  س !ون ‪3‬ط دا@ ا"‪S‬‬
‫;‪$inactive = 5‬‬
‫‪// check to see if $_SESSION["timeout"] is set‬‬
‫{ ))]"‪if (isset($_SESSION["timeout‬‬
‫"‪// calculate the session's "time to live‬‬
‫;]"‪$sessionTTL = time() - $_SESSION["timeout‬‬
‫{ )‪if ($sessionTTL > $inactive‬‬
‫;)(‪session_destroy‬‬
‫ا‪ S‬ا‪ t,3‬اء إ!@ ل )ة أ@ى '‪echo‬‬ ‫ا`‬
‫;'œم‬
‫}‬
‫}‬
‫>? ;)(‪$_SESSION["timeout"] = time‬‬
‫‪٨٢‬‬ ‫الفصل التاسع ‪ :‬العمل مع ‪ Cookies‬و ‪Sessions‬‬

‫إعادة توجيه المستخدم ‪redirecting user‬‬

‫في أحيان كثيرة تكون ھناك حاجة إلعادة توجيه المستخدم إلى صفحة أخرى ‪ .‬فلو أردنا مثال منع وصول زوار الموقع‬
‫لصفحة من صفحات الموقع ) بسبب سرية محتوى الصفحة و لتقييد الوصول ( فنستطيع تحقيق ذلك بإعادة توجيه‬
‫متصفح الزائر إلى صفحة أخرى غير الصفحة الحالية التي وصل إليھا ) بكتابة عنوانھا مباشرة في ‪ . ( URL‬إلعادة‬
‫توجيه المستخدم إلى صفحة أخرى نستطيع استخدام إحدى الطرق التالية‪:‬‬

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

‫المثال التالي يوضح كيفية التعامل مع الدالة ) (‪:header‬‬

‫‪<?php‬‬

‫))]'‪if(!isset($_POST['login‬‬
‫{‬
‫;)"‪header("Location:login.php‬‬
‫}‬

‫>?‬

‫في حال أردنا استخدام شفرة جافا سكربت بدال من ذلك فنستطيع عمل ذلك كما في المثال التالي‪:‬‬

‫‪<?php‬‬

‫))]'‪if(!isset($_POST['login‬‬
‫{‬
‫;"‪ • S
%.‬ا´ن إ‪ `
SP /‬ا!@ ل" ‪echo‬‬
‫"‪echo‬‬
‫>‪<script‬‬
‫;'‪window.location = 'login.php‬‬
‫>‪</script‬‬
‫;"‬
‫}‬

‫>?‬
‫‪٨٣‬‬ ‫الفصل التاسع ‪ :‬العمل مع ‪ Cookies‬و ‪Sessions‬‬

‫أسئلة نھاية الفصل‬

‫‪ .١‬ما الفرق بين ‪ cookie :‬و ‪.session‬‬

‫‪ .٢‬كيف نستطيع حفظ ملف ‪ cookie‬و جعله متاحا للمجلد ‪./foo/‬‬

‫‪ .٣‬ما الفرق بين إستخدام ) (‪ unset‬و ) (‪ session_destroy‬مع الجلسات‪.‬‬

‫‪ .٤‬ما الطرق المستخدمة في إعادة توجيه المستخدم و ما الفرق بينھا‪.‬‬


‫‪٨٤‬‬ ‫الفصل العاشر ‪ :‬التعامل مع قواعد البيانات‬

‫ھذا الفصل يغطي‪:‬‬

‫كيفية االتصال بقاعدة البيانات ‪.‬‬ ‫‬


‫كيفية انشاء وتنفيذ االستعالمات‪.‬‬ ‫‬
‫كيفية استرجاع السجالت من قاعدة البيانات والعمل معھا‪.‬‬ ‫‬

‫واحدة من أھم مزايا ‪ PHP‬أنھا تدعم العمل مع أغلب أنظمة قواعد البيانات المعروفة و الشھيرة‪ .‬من ھذه النظم‬
‫الشھيرة يبرز نظام قواعد البيانات ‪ .MySql‬و كما سبق أن اشرنا في أول فصل بأن ‪ PHP‬و ‪ MySql‬من االنظمة‬
‫مفتوحة المصدر و باستخدامھما معا سيوفر مطور الويب الكثير من األموال لشراء حقوق االستخدام من الشركات‬
‫المنتجة‪.‬‬

‫كيفية االتصال بقاعدة البيانات‬

‫ھناك أكثر من طريقة في ‪ PHP‬لالتصال بقاعدة البيانات ‪ .MySql‬و من ھذه الطرق استخدام اإلضافة ‪ mysqli‬و‬
‫التي تسمح لنا باالتصال بنظام قاعدة البيانات ‪ MySql 4.1‬فما أعلى‪ .‬و يجب اإلشارة أن ھذه االضافة لن تعمل إال‬
‫مع النسخة الخامسة من ‪ PHP‬فما أعلى‪.‬‬

‫إنشاء اتصال بنظام قواعد البيانات ‪MySql‬‬

‫إلنشاء اتصال بـ ‪ MySql‬نقوم باستدعاء الدالة ) (‪ mysqli_connect‬و التي تأخذ أربع معطيات كالتالي‪:‬‬

‫"(‪mysqli_connect‬‬ ‫‪hostname‬‬ ‫‪",‬‬


‫"‬ ‫‪username‬‬ ‫‪",‬‬
‫"‬ ‫‪password‬‬ ‫‪",‬‬
‫"‬ ‫‪database‬‬ ‫;) "‬

‫‪ : hostname‬اسم الجھاز أو عنوانه الذي يحتوي على ‪ ) MySql‬غالبا ما يكون ‪.( localhost‬‬
‫‪ : username‬اسم مستخدم النظام‪.‬‬
‫‪ : password‬كلمة مرور مستخدم النظام‪.‬‬
‫‪ :database‬اسم قاعدة البيانات‪.‬‬

‫‪<?php‬‬

‫;)'‪$conn = mysqli_connect('localhost', 'user30','db456','test‬‬


‫)‪if($conn === false‬‬
‫{‬
‫;)(‪echo "Connection failed! Reason:".mysqli_connect_error‬‬
‫}‬

‫>?‬

‫الدالة ) (‪ mysqli_connect_error‬ال ُمستخدمة في المثال السابق تقوم بعرض وصف نصي آلخر‬
‫خطأ حدث أثناء االتصال بقاعدة البيانات‪.‬‬
‫‪٨٥‬‬ ‫الفصل العاشر ‪ :‬التعامل مع قواعد البيانات‬

‫إغالق االتصال بقاعدة البيانات ‪closing the connection‬‬

‫بالرغم من أن االتصال يتم قطعه بمجرد االنتھاء من تنفيذ الشفرة البرمجية إال انه ينصح إغالقه برمجيا عند االنتھاء‬
‫من العمل مع ‪ MySql‬و ذلك عن طريق استدعاء الدالة ) (‪ . mysqli_close‬ھذه الدالة ستقوم بإرجاع ‪ true‬في‬
‫حال تم اغالق االتصال بخالف ذلك ستقوم بإرجاع ‪.false‬‬

‫‪<?php‬‬

‫;)'‪$conn = mysqli_connect('localhost', 'user30','db456','test‬‬


‫)‪if($conn === false‬‬
‫{‬
‫;)(‪echo "Connection failed! Reason:".mysqli_connect_error‬‬
‫}‬
‫)‪mysqli_close($conn‬‬
‫>?‬

‫تنفيذ االستعالم ‪executing query‬‬

‫عند التعامل مع ‪ MySql‬كنظام قواعد بيانات فيجب أن يكون لدينا القدرة على كتابة االستعالمات باستخدام لغة ‪SQL‬‬
‫)‪ .(Structured Query Language‬و لتنفيذ أي استعالم بواسطة ‪ PHP‬نقوم باستدعاء الدالة‬
‫) (‪ mysqli_query‬و التي تأخذ معطيين األول المتغير الذي يحتوي على معلومات االتصال بقاعدة البيانات و‬
‫الثاني يحتوي على االستعالم‪.‬‬
‫تقوم ھذه الدالة بإرجاع ‪ false‬في حال فشلت في تنفيذ االستعالم‪ .‬و في حال نجحت في تنفيذ االستعالم فلھا حالتين‪:‬‬

‫في حال أن االستعالم سيقوم بإرجاع سجالت من قاعدة البيانات مثل ‪select , describe ,show and‬‬ ‫‬
‫‪ ، explain‬ففي ھذه الحالة ستقوم الدالة بإرجاع مجموعة نتائج ‪ MySql Result Set‬نتعامل معھا الحقا‬
‫بواسطة الدالة ) (‪.mysqli_fetch_array‬‬
‫أما في حال أن االستعالم لن يقوم بإرجاع سجالت من قاعدة البيانات مثل ‪update , delete , insert ,….‬‬ ‫‬
‫فستقوم الدالة بإرجاع ‪.true‬‬

‫إنشاء جدول ‪crating database table‬‬

‫نستطيع إنشاء جدول باستخدام ‪ PHP‬في خطوات بسيطة كما يلي‪:‬‬

‫‪ .١‬إنشاء اتصال بقاعدة البيانات باستخدام الدالة ) (‪. mysqli_connect‬‬


‫‪ .٢‬كتابة جملة ‪ SQL‬التي ستقوم بإنشاء الجدول‪.‬‬
‫‪ .٣‬تنفيذ االستعالم باستخدام الدالة ) (‪. mysqli_query‬‬

‫على افتراض أنه لدينا قاعد بيانات باسم ‪ ، test‬سنقوم اآلن بإنشاء جدول لتخزين معلومات عن الكتب‪.‬‬
‫‪٨٦‬‬ ‫الفصل العاشر ‪ :‬التعامل مع قواعد البيانات‬

‫و قبل البدء في إنشاء الجدول يجب نحدد البيانات التي يجب أن نعرفھا عن الكتاب و التي بمعرفتھا سنقوم بإنشاء‬
‫الجدول‪:‬‬

‫رقم الكتاب و يجب أن يكون رقما مميزا غير متكرر ‪.‬‬ ‫‬
‫اسم الكتاب سيكون نصا بطول ‪ ١٠٠‬حرف‪.‬‬ ‫‬
‫اسم المؤلف و سيكون نصا بطول ‪ ٦٠‬حرفا‪.‬‬ ‫‬
‫الناشر و سيكون نصا بطول ‪ ٦٠‬حرفا‪.‬‬ ‫‬
‫تاريخ النشر و نوعه تاريخ‪.‬‬ ‫‬
‫سعر الكتاب و نوعه رقم ‪.‬‬ ‫‬

‫اآلن لم يتبق علينا إال معرفة انواع البيانات ‪ data types‬في ‪ MySql‬و الموضحة في الجداول التالية‪:‬‬

‫الوصف‬ ‫النوع‬
‫سلسلة نصية ثابتة دائما يتم ازاحتھا ناحية اليمين بواسطة مسافة فارغة للوصول للطول المحدد‬ ‫‪char‬‬
‫و بحد أقصى ‪ ٢٥٥‬حرف‪.‬‬
‫سلسلة نصية متغيرة بحد أقصى ‪ ٢٥٥‬حرف‪.‬‬ ‫‪varchar‬‬
‫سلسلة نصية تصل إلى طول ‪ ٦٥٥٣٥‬حرف‪.‬‬ ‫‪text‬‬
‫سلسلة نصية تصل إلى طول ‪ ١٦٧٧٧٢١٥‬حرف‪.‬‬ ‫‪mediumtext‬‬
‫سلسلة نصية تصل إلى طول ‪ ٤٢٩٤٩٦٧٢٩٥‬حرف‪.‬‬ ‫‪longtext‬‬
‫رقم صحيح صغير جدا يتراوح بين ‪ ١٢٨-‬إلى ‪ ١٢٧‬و من ‪ ٠‬إلى ‪ ٢٥٥‬للرقم الصحيح‬ ‫‪tinyint‬‬
‫الموجب‪.‬‬
‫رقم صحيح يتراوح بين ‪ ٢١٤٧٤٨٣٦٤٨-‬إلى ‪ ٢١٤٧٤٨٣٦٤٧‬و من ‪ ٠‬إلى‬ ‫‪int‬‬
‫‪ ٤٢٩٤٩٦٧٢٩٥‬للرقم الصحيح الموجب‪.‬‬
‫رقم صغير مع عالمة عشرية‪.‬‬ ‫‪float‬‬
‫رقم كبير مع عالمة عشرية‪.‬‬ ‫‪double‬‬
‫تاريخ بالصيغة ‪YYYY-MM-DD‬‬ ‫‪date‬‬
‫تركيبة من التاريخ و الوقت بالصيغة ‪YYYY-MM-DD HH:MM:SS‬‬ ‫‪datetime‬‬
‫الطابع الزمني ‪YYYYMMDDHHMMSS‬‬ ‫‪timestamp‬‬
‫الوقت بالصيغة ‪HH:MM:SS‬‬ ‫‪time‬‬

‫ويمكن االطالع على تفصيل أكثر عن أنواع البيانات من خالل زيارة الموقع الرسمي لـ ‪ MySql‬التالي‬
‫‪http://dev.mysql.com/doc/refman/5.0/en/data-type-overview.html‬‬

‫اآلن سنقوم بإنشاء بكتابة شفرة ‪ PHP‬التي ستقوم بإنشاء الجدول ‪. books‬‬

‫‪<?php‬‬
‫ا ة او‪ /‬ه ا
"ل ‪!-‬ة ا‪3‬ت ا‪!S‬دة‪//‬‬
‫;)'‪$conn=mysqli_connect('localhost','root','','test‬‬
‫)‪if($conn === false‬‬
‫{‬
‫‪echo‬‬ ‫"‬ ‫و‬ ‫ا‪3‬ت‬ ‫‪!-‬ة‬ ‫ا
"ل‬ ‫أŽء‬ ‫@ ¿‬ ‫‪!#‬ث‬
‫;)(‪".mysqli_connect_error‬ا`‬
‫}‬
‫‪٨٧‬‬ ‫الفصل العاشر ‪ :‬التعامل مع قواعد البيانات‬

‫‪else‬‬
‫{‬
‫ ‪ sql‬ا
‪ -‬م ˜‪3‬ء ا!ول‪//‬‬
‫(‪$query = " CREATE TABLE books‬‬
‫‪isbn‬‬ ‫)‪varchar(16‬‬ ‫‪not‬‬
‫‪null,‬‬
‫‪title‬‬ ‫)‪varchar(100‬‬
‫‪null,‬‬
‫‪author‬‬ ‫)‪varchar(60‬‬ ‫‪null ,‬‬
‫‪publisher‬‬ ‫)‪varchar(60‬‬ ‫‪null,‬‬
‫‪publish_date‬‬ ‫‪date‬‬ ‫‪null,‬‬
‫‪price float null,‬‬
‫)‪primary key(isbn‬‬
‫;")‬
‫ا´ن ‪ -3‬م ‪ 2‬ا‪|'%‬م‪//‬‬
‫;)‪$result = mysqli_query($conn,$query‬‬
‫)‪if($result‬‬
‫{‬
‫;"
 ا‪3‬ء ا!ول ا‪!S‬د ح" ‪echo‬‬
‫}‬
‫‪else‬‬
‫{‬
‫‪echo‬‬ ‫"‬ ‫و‬ ‫ا!ول‬ ‫ا‪3‬ء‬ ‫أŽء‬ ‫)‬ ‫‪!#‬ث‬
‫;)‪:".mysqli_error($conn‬ا`‬
‫}‬
‫}‬
‫;) ‪mysqli_close( $conn‬‬
‫>?‬

‫عند تنفيذ الشفرة السابقة سيكون الناتج‪.‬‬

‫تم إنشاء الجدول المحدد بنجاح‬

‫و في حال أعدنا تنفيذ الشفرة السابقة فستظھر رسالة الخطأ التالية‪:‬‬

‫حدث مشكلة أثناء انشاء الجدول و السبب '‪:Table 'books‬‬


‫‪already exists‬‬

‫و معنى رسالة الخطأ أن الجدول ‪ books‬موجود مسبقا و ال يسمح بإنشائه مرة أخرى‪.‬‬

‫عرض رسائل األخطاء ‪printing error messages‬‬

‫في أحيان كثيرة قد نواجه كثير من األخطاء عند كتابة االستعالمات‪ .‬لذلك من الجيد أن نقوم بعرض رسائل األخطاء‬
‫التي تنتج عند تنفيذ االستعالمات لكي يتم التعامل معھا‪ .‬لعرض رسائل األخطاء نقوم باستدعاء الدالة‬
‫) (‪ mysqli_error‬و التي تأخذ معطى واحد كالتالي‪:‬‬
‫;)‪echo mysqli_error($conn‬‬
‫حيث ‪ $conn‬يمثل المتغير الذي يحتوي على معلومات االتصال بقاعدة البيانات‪.‬‬
‫‪٨٨‬‬ ‫الفصل العاشر ‪ :‬التعامل مع قواعد البيانات‬

‫إضافة البيانات ‪inserting data‬‬

‫إلضافة بيانات داخل جدول في قاعدة البيانات نقوم باستخدام األمر ‪ insert‬أحد أوامر ‪ SQL‬و الذي يستخدم إلدراج‬
‫البيانات‪.‬‬
‫لكن يجب الحذر عند اضافة البيانات داخل قاعدة البيانات لكي ال تتضرر من قيام المستخدم بإدخال قيم غير صحيحة‬
‫بھدف االضرار بقاعدة البيانات‪.‬‬
‫و لتفادي ذلك يجب علينا القيام بالخطوات التالية‪:‬‬

‫ إجراء عملية التحقق باستخدام الدالة ) (‪ ) preg_match‬تم شرحھا سابقا في الفصل الثامن( أو أي دالة‬
‫أخرى تقوم بعمل مشابه للتحقق من البيانات المرسلة من خالل النموذج )على افتراض ان البيانات ستُرسل‬
‫لقاعدة البيانات باستخدام نموذج ‪. (HTML‬‬
‫ بعد ذلك يجب أن نقوم باستخدام الدالة ) (‪ mysqli_real_escape_string‬لتجاھل أي رموز خاصة‬
‫يكون لھا داللة في ‪ SQL‬كعالمات االقتباس‪.‬‬

‫اآلن سنقوم بإضافة سجل جديد داخل الجدول السابق ‪ books‬كما يلي‬

‫‪<?php‬‬
‫;)'‪$conn=mysqli_connect('localhost','root','','test‬‬
‫)‪if($conn === false‬‬
‫{‬
‫‪echo‬‬ ‫"‬ ‫و‬ ‫ا‪3‬ت‬ ‫‪!-‬ة‬ ‫ا
"ل‬ ‫أŽء‬ ‫@ ¿‬ ‫‪!#‬ث‬
‫;)(‪".mysqli_connect_error‬ا`‬
‫}‬
‫‪else‬‬
‫{‬
‫;'‪$isbn = '978-603-500-045-1‬‬
‫;'‪ PHP‬ا‪3‬ء
‪-‬ت ا‪!% t33‬ام' = ‪$title‬‬
‫;'أ‪ !#‬ا'!‪$author = 'T‬‬
‫;'دار ا' = ‪$publisher‬‬
‫;'‪$publish_date ='2006-05-20‬‬
‫;'‪$price ='123.25‬‬

‫;)‪$isbn = mysqli_real_escape_string($conn,$isbn‬‬
‫;)‪$title = mysqli_real_escape_string($conn,$title‬‬
‫;)‪$author = mysqli_real_escape_string($conn,$author‬‬
‫;)‪$publisher = mysqli_real_escape_string($conn,$publisher‬‬
‫‪$publish_date‬‬ ‫=‬
‫;)‪mysqli_real_escape_string($conn,$publish_date‬‬
‫;)‪$price = mysqli_real_escape_string($conn,$price‬‬

‫‪$query‬‬ ‫=‬ ‫‪"insert‬‬ ‫‪into‬‬


‫)‪books(isbn,title,author,publisher,publish_date,price‬‬

‫‪values('$isbn','$title','$author','$publisher','$publish_date',$‬‬
‫;")‪price‬‬

‫;)‪$result = mysqli_query($conn,$query‬‬
‫‪٨٩‬‬ ‫الفصل العاشر ‪ :‬التعامل مع قواعد البيانات‬

‫)‪if($result‬‬
‫{‬
‫;"
‪ t‬ا‪ &Ã‬ا‪3‬ت  ‪echo "O3‬‬
‫}‬
‫‪else‬‬
‫{‬
‫‪echo‬‬ ‫"‬ ‫و‬ ‫ا‪3‬ت‬ ‫ا‪&Ã‬‬ ‫أŽء‬ ‫)‬ ‫‪!#‬ث‬
‫;)‪:".mysqli_error($conn‬ا`‬
‫}‬
‫}‬
‫;) ‪mysqli_close( $conn‬‬
‫>?‬

‫عند تنفيذ الشفرة السابقة سيكون الناتج‪.‬‬

‫تمت اضافة البيانات بشكل ناجح‬

‫و في حال أعدنا تنفيذ الشفرة السابقة فستظھر رسالة الخطأ التالية‪:‬‬

‫حدث مشكلة أثناء اضافة البيانات و السبب ‪:Duplicate entry‬‬


‫'‪'978-603-500-045-' for key 'PRIMARY‬‬

‫و السبب ألن الحقل ‪ isbn‬يحتوي على القيد ‪ primary key‬و الذي ال يسمح بتكرار القيم‪.‬‬

‫استرجاع البيانات ‪retrieving data‬‬

‫بعد أن أصبح اآلن لدينا مجموعة من البيانات داخل قاعدة البيانات ‪ ،‬فمن المھم أن نستطيع استرجاع تلك البيانات و‬
‫من ثم التعامل معھا‪ .‬و السترجاع سجالت من قاعدة البيانات نتبع الخطوات التالية‪:‬‬

‫إنشاء اتصال بقاعدة البيانات باستخدام الدالة ) (‪. mysqli_connect‬‬ ‫‪.١‬‬


‫إنشاء االستعالم عن طريق كتابة أمر ‪. select‬‬ ‫‪.٢‬‬
‫تنفيذ االستعالم باستخدام الدالة ) (‪. mysqli_query‬‬ ‫‪.٣‬‬
‫نقوم باستخالص نتائج االستعالم عن طريق استدعاء الدالة ) (‪.mysqli_fetch_array‬‬ ‫‪.٤‬‬
‫نستخدم حلقة التكرار ‪ while‬لكي نتمكن من قراءة كل السجالت التي قام بإرجاعھا االستعالم‪.‬‬ ‫‪.٥‬‬

‫‪<?php‬‬
‫;)'‪$conn=mysqli_connect('localhost','root','','test‬‬
‫)‪if($conn === false‬‬
‫{‬
‫‪echo‬‬ ‫"‬ ‫و‬ ‫ا‪3‬ت‬ ‫‪!-‬ة‬ ‫ا
"ل‬ ‫أŽء‬ ‫@ ¿‬ ‫‪!#‬ث‬
‫;)(‪".mysqli_connect_error‬ا`‬
‫}‬
‫‪else‬‬
‫{‬
‫;"‪$query = "select * from books‬‬
٩٠ ‫ التعامل مع قواعد البيانات‬: ‫الفصل العاشر‬

$result = mysqli_query($conn,$query);
$numberOfRows = mysqli_num_rows($result);
if($result)
{
if($numberOfRows>0)
{
echo'<table border="1" align="center">';
echo'<tr><th> %‫ا‬
‫<اب‬/th><th>uš‫<ا‬/th><th>…‫<ا‬/th><th> ‹‫
ر‬
‫<ا‬/th><th>‫' اب‬%</th></tr>';
while($row = mysqli_fetch_array($result))
{

echo'<tr><td>'.$row['title'].'</td><td>'.$row['author'].'<
/td><td>'.$row['publisher'].'</td><td>'.$row['publish_date'].'<
/td><td>'.$row['price'].'</td></tr>';
}
}
else
{
echo'#  ‫ت‬3 !  ‫;' ا‬
}

}
else
{
echo " ‫و‬ ‫ت‬3‫ا‬ &Ã‫ا‬ ‫أŽء‬ ) ‫!ث‬#
`‫ا‬:".mysqli_error($conn);
}
}
mysqli_close( $conn );

?>

‫عند تنفيذ الشفرة السابقة فسيكون الناتج كما يلي‬

‫معرفة عدد نتائج االستعالم‬

‫ كما فعلنا في‬mysqli_num_rows() ‫لمعرفة عدد النتائج )عدد السجالت( الستعالم ما نستطيع استدعاء الدالة‬
.‫ ھذه الدالة تأخذ معطى واحد يمثل المتغير الذي يحتوي على ناتج االستعالم‬.‫المثال السابق‬

mysqli_num_rows( $result )
‫‪٩١‬‬ ‫الفصل العاشر ‪ :‬التعامل مع قواعد البيانات‬

‫إفراغ الذاكرة من ناتج االستعالم األخير‬

‫في بعض الحاالت قد نحتاج لتنفيذ أكثر من استعالم داخل الشفرة البرمجية الواحدة‪ .‬لذلك يُنصح في ھذا الحالة أن يتم‬
‫إفراغ الذاكرة من ناتج االستعالم األخير لكي يتم استخدامه من قبل استعالم آخر‪ .‬و نستطيع تحقيق ذلك عن طريق‬
‫استدعاء الدالة ) (‪ mysqli_free_result‬و التي تأخذ معطى واحد يمثل المتغير الذي يحتوي على ناتج االستعالم‬
‫كما يلي‬
‫) ‪mysqli_free_result( $result‬‬

‫تطبيق عملي‬

‫في ھذا التطبيق سنقوم بتصميم سجل للزوار ‪.‬ھذا التطبيق سيمسح لزائر بطرح تعليقاته حول الموقع‪ .‬و قبل أن نبدأ في‬
‫كتابة شفرة سجل الزوار سنقوم بكتابة شفرة ‪ PHP‬تقوم بإنشاء الجدول ‪ guestbook‬و الذي سيُستخدم لتخزين‬
‫تعليقات الزوار‪.‬‬
‫قم بفتح برنامج ‪ .Notepad++‬بعد ذلك سيقوم البرنامج بإنشاء مساحة عمل فارغة‪ .‬قم بكتابة الشفرة التالية‪:‬‬

‫‪<?php‬‬
‫;)'‪$conn=mysqli_connect('localhost','root','','test‬‬
‫)‪if($conn === false‬‬
‫{‬
‫‪echo‬‬ ‫"‬ ‫و‬ ‫ا‪3‬ت‬ ‫‪!-‬ة‬ ‫ا
"ل‬ ‫أŽء‬ ‫@ ¿‬ ‫‪!#‬ث‬
‫;)(‪".mysqli_connect_error‬ا`‬
‫}‬
‫‪else‬‬
‫{‬
‫(‪$query = " CREATE TABLE guestbook‬‬
‫‪id‬‬ ‫‪int primary‬‬ ‫‪key‬‬
‫‪auto_increment,‬‬
‫‪name‬‬ ‫‪varchar(50) not null,‬‬
‫‪email‬‬ ‫‪varchar(50) not null ,‬‬
‫‪comment‬‬ ‫‪text not null,‬‬
‫‪date‬‬ ‫‪datetime‬‬ ‫‪not null‬‬
‫;")‬
‫;)‪$result = mysqli_query($conn,$query‬‬
‫)‪if($result‬‬
‫{‬
‫;"
 ا‪3‬ء ا!ول ا‪!S‬د ح" ‪echo‬‬
‫}‬
‫‪else‬‬
‫{‬
‫‪echo‬‬ ‫"‬ ‫و‬ ‫ا!ول‬ ‫ا‪3‬ء‬ ‫أŽء‬ ‫)‬ ‫‪!#‬ث‬
‫;)‪:".mysqli_error($conn‬ا`‬
‫}‬
‫}‬
‫;) ‪mysqli_close( $conn‬‬

‫>?‬
٩٢ ‫ التعامل مع قواعد البيانات‬: ‫الفصل العاشر‬

:‫ و من النافذة التالية قم بما يلي‬. ‫ قم بالنقر على زر حفظ‬، ‫بعد االنتھاء من كتابة الشفرة السابقة‬
.C:\xammp\htdocs ‫ قم بتغيير مكان الحفظ عن طريق االنتقال للمجلد‬.١
. createTable.php ‫ قم بتسمية الملف باسم‬.٢
PHP Hypertext ‫ أو‬All types(*.*) ‫ من القائمة المنسدلة ليصبح‬Save as type ‫ غير نوع الملف‬.٣
.Preprocessor files
.Save ‫ انقر على الزر‬.٤
.http://localhost/createTable.php ‫ قم بتنفيذ الملف عن طريق كتابة العنوان‬.٥

.‫عند تنفيذ الشفرة السابقة سيكون الناتج‬

‫تم انشاء الجدول المحدد بنجاح‬

:‫ و من ثم قم بكتابة الشفرة التالية‬Notepad++ ‫ قم بفتح برنامج‬، ‫بعد ذلك‬

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8" />
<title>Untitled Document</title>
<style>
body{
direction:rtl;
}
table{
border:1px solid #666;
background-color:#CCC;
}

#messages{
border:1px solid #666;
background-color:#fff;
padding:2px;
}

#messages th{
background-color:#0FC;
}

#messages td{
background-color:#0FF;
}

#addMessage{
margin-right:400px;
color:#960;
font-weight:bold;
}
٩٣ ‫ التعامل مع قواعد البيانات‬: ‫الفصل العاشر‬

hr{
border:1px solid #666;
width:800px;
}
</style>
</head>

<body>
<form id="form1" name="form1" method="post" action="">
<table width="40%" align="center" cellpadding="3">
<tr>
<td width="27%">%‫<ا‬/td>
<td width="73%"><label for="name"></label>
<input type="text" name="name" id="name"
size="50px"/></td>
</tr>
<tr>
<td>3‫<ا! او‬/td>
<td><label for="email"></label>
<input type="text" name="email" id="email"
size="50px"/></td>
</tr>
<tr>
<td>'‫<ا‬/td>
<td><label for="comment"></label>
<textarea name="comment" id="comment" cols="45"
rows="5"></textarea></td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="add" id="add"
value="‫& ارآ‬Ã‫ "إ‬/></td>
</tr>
</table>
</form>
<hr />
<?php
$conn = mysqli_connect('localhost','root','','test');
if(!$conn)
{
exit(mysqli_connect_error());
}
else
{
if(isset($_POST['add']))
{
echo'<div id="addMessage">';
$errors = array();
if(empty($_POST['name']) || empty($_POST['email']) ||
empty($_POST['comment']))
{
٩٤ ‫ التعامل مع قواعد البيانات‬: ‫الفصل العاشر‬

array_push($errors,'‫ ل‬-S‫ } ا‬¢'


‫;)'اء‬
}
if(preg_match('/[\'\/~`\!@#\$%\^&\*\(\)_\-
\+=\{\}\[\]\|;:"\<\>,\.\?\\\]/', $_POST['name']))
{
array_push($errors,' Q ? / ‫ ي‬S @!‫ ا‬%‫ا‬
SP.');
}
if(!preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-
9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})]*$/",$_POST['email']))
{
array_push($errors,' 3‫و‬²‫ ا!@ ! ا‬-‫ا‬
SP Q.');
}

if($errors)
{
echo'<ol class="errorMessage"> OS"
‫اء‬
‫@ ء ا‬0‫;'ا‬
foreach($errors as $value)
{
echo '<li>'.$value.'</li>';
}
echo'</ol>';
}
else
{
$name =
mysqli_real_escape_string($conn,$_POST['name']);
$email =
mysqli_real_escape_string($conn,$_POST['email']);
$comment =
mysqli_real_escape_string($conn,$_POST['comment']);

$insertQuery = "insert into


guestbook(name,email,comment,date)

values('$name','$email','$comment',NOW())";

$result = mysqli_query($conn,$insertQuery);

if($result)
{
echo' •-'
&Ã‫ا‬ 
!- ، • ‫…ا‬
‫;'ح‬
}

else
{
echo mysqli_error($conn);
٩٥ ‫ التعامل مع قواعد البيانات‬: ‫الفصل العاشر‬

}
}
echo'</div>';
}
$query = "select * from guestbook order by date";
$result = mysqli_query($conn,$query);
$numberOfRows = mysqli_num_rows($result);
echo'<table align="center" id="messages" cellspacing="1"
cellpadding="3">';
if($numberOfRows>0)
{
echo'<tr><th>%‫<ا‬/th><th> !‫ا‬
3‫<او‬/th><th>%‫<ا‬/th><th>%‫<
ر‹ ا‬/th></tr>';
while($row = mysqli_fetch_array($result))
{

echo'<tr><td>'.$row['name'].'</td><td>'.$row['email'].'</td
><td>'.$row['comment'].'</td><td>'.$row['date'].'</td></tr>';
}
}
else
{
echo'<tr><td> }? ‫ زوار ا‬% & ‫  ! )رآت‬
#.</td></tr>';
}
echo'<table>';
}
?>
</body>
</html>

:‫ و من النافذة التالية قم بما يلي‬. ‫ قم بالنقر على زر حفظ‬، ‫بعد االنتھاء من كتابة الشفرة السابقة‬
.C:\xammp\htdocs ‫ قم بتغيير مكان الحفظ عن طريق االنتقال للمجلد‬.١
. guestbook.php ‫ قم بتسمية الملف باسم‬.٢
PHP Hypertext ‫ أو‬All types(*.*) ‫ من القائمة المنسدلة ليصبح‬Save as type ‫ غير نوع الملف‬.٣
.Preprocessor files
.Save ‫ انقر على الزر‬.٤
.http://localhost/guestbook.php ‫ قم بتنفيذ الملف السابق عن طريق كتابة العنوان‬.٥
‫‪٩٦‬‬ ‫الفصل العاشر ‪ :‬التعامل مع قواعد البيانات‬

‫و عند إضافة سجل جديد سيكون الناتج كما يلي‪:‬‬

‫و كما ھو واضح في الشفرة السابقة فقد قمنا بإجراء عملية التحقق ‪ validation‬على البيانات ال ُمدخلة قبل إضافتھا‬
‫لقاعدة البيانات‪.‬‬

‫الدالة )(‪ NOW‬ال ُمستخدمة في المثال السابق في جملة ‪ insert‬من دوال ‪ SQL‬و تُستخدم لطباعة‬
‫التاريخ و الوقت الحالي و ال توضع بين عالمات االقتباس‪.‬‬
‫‪٩٦‬‬ ‫الفصل العاشر ‪ :‬التعامل مع قواعد البيانات‬

‫أسئلة نھاية الفصل‬

‫‪ .١‬ما ھي أنظمة قواعد البيانات التي تدعمھا ‪ ) PHP‬استخدم شبكة االنترنت للبحث (‪.‬‬

‫‪ .٢‬كيف نستطيع إنشاء اتصال بقاعدة البيانات ) ‪. ( user‬‬

‫‪ .٣‬ما الفرق بين كال من ‪ mysqli_connect_error( ) :‬و ) (‪.mysqli_error‬‬

‫‪ .٤‬كيف نستطيع معرفة عدد نتائج استعالم ما‪.‬‬

‫‪ .٥‬ما الفائدة من استخدام الدالة ) (‪. mysqli_free_result‬‬

You might also like