Warning [2] Trying to access array offset on value of type null - Line: 5 - File: inc/functions.php(3442) : eval()'d code PHP 8.1.2-1ubuntu2.19 (Linux)
أفتتح هذا الموضوع لمعرفة إذا كان يهمكم أن نقوم بدروس عملية للغة ال PHP.
خطر لي هذا الموضوع بعد مراسلة بيني و بين صديق يسألني بعض الأسئلة حول هذه اللغة و لغة قواعد المعطيات ال MYSQL.
فأحببت أن أعرض بعض هذه الدروس هنا ليستفيد منها العدد الأكبر من الأصدقاء .
سأقوم بعرض الدرس الأول البسيط المبسط. على حلقات. و يمكنكم طرح أي أسئلة خلال هذه الدروس.
سأبدأ في البداية بعرض عام و مختصر للغة ال PHP و قواعد المعطيات MYSQL.
بالإضافة لعرض آخر للأدوات و البرامج التي يمكن استخدامها لتعلم اللغة, و متابعة الدروس.
سأستخدم موقعي لعرض أمثلة الدروس. و يفضل إعادة تركيبها على أجهزتكم الخاصة و تجربتها.
سأبدأ بهذه الدروس غداً, ثم أضيف درسا ًواحداً باليوم.
أما بعد , و بعد
الصلاة و السلام على أطيب الخلق و خالق المعرفة "الإنسان":
مقدمة:
1- تعريف:
لغة ال PHP و تعني أحرفها "Personnal Home Page", هي لغة برمجة تختص بإنشاء صفحات الويب (جهة سيرفر/مخدم الويب) و هي لغة وليدة و قريبة من اللغة المشهورة PERL(أنظر للمحة التاريخية) .
و كما PERL فإنها لغة "مترجمة" (Interpreté) و ليست لغة معالجة (Compilé) (راجع تفسير المصطلحين في جزء شرح مبادئ اللغة).
تتميز هذه اللغة بكونها لا تعتمد على نظام التشغيل للسيرفر و لذلك انتشرت بسهولة في عالم الأنترنت الذي يعتبر مكاناً لأنظمة خليطة و متنوعة.
كما تتميز بسهولتها مقارنة مع اللغات الأخرى التي كانت شائعة قبلها (C, Perl ...).
2- لمحة تاريحية عن لغة ال PHP :
في البدء كان ال PERL و كانت لغة منتشرة بكثرة في الأنترنت و خاصة بأنظمة عالم (يونيكس) [1].
لكن لغة ال PERL و التي تعتبر لغة أقدم من الأنترنت نفسه و تعتمد أساساً للبرمجة التقليدية ضمن أنظمة التشغيل , اعتبرت صعبة و قليلة المرونة في عالم الويب.و شرح هذه اللغة يحتاج لكتب ليست هذه اللمحة التاريخية مجالها.
لذا ففي البداية قام أحد الطلاب "Rasmus Lerdorf" بإنشاء "مكتبة" أدوات في لغة ال PERL في عام 1995 لتسهيل كتابة ال CV الشخصية على الأنترنت و نشر مكتبته هذه على الويب و أسماها :
"Personnal Home Page Tools"
ثم قام بإعادة كتابتها بلغة ال C مضيفاً إليها شيئاً فشيئاً أدوات لمعالجة قواعد المعطيات .. الخ.
بعد نشره لمكتبته الكبيرة على الأنترنت ليستفيد منها أكبر عدد ممكن من المستخدمين و المبرمجين و ليقوموا كذلك بالإضافة لها, تحولت المكتبة للغة حملت اسم:
(PHP/FI)"Personal Home Page / Forms Interpreter"
أخيراً نشأت لغة ال PHP 3.0 بإعادة كتابتها و بالتعاون بين ثلاثة أشخاص:
Rasmus Lerdorf, Andi Gutmans,Zeev Suraski
و ذلك عام 1998
3- شرح مختصر لمبادئ لغة ال PHP
-الفرق بين ال PHP و ال HTML
بل أن السؤال الحقيقي يجب أن يكون ما هو الرابط بينهما.
ال HTML هي "لغة" عرض للصفحات, و هي حقائب يفهمها المتصفح و ليست لغة بالمعنى الحقيقي للكلمة.
فال HTML هي لغة يفهمها المتصفح و يعرف من خلالها كيفية عرض المعطيات و النصوص , فهذا نص كبير و هذا لونه أخضر و ذاك أحمر أو مخطط, و كذلك ترتيب الأسطر و توزيع الجداول .. الخ.
بينما لغة ال PHP فهي لغة معالجة تعالج المعطيات التي تحصل عليها من قاعدة المعطيات أو من المتصفح و يقوم بتنفيذها السيرفر نفسه. أما النتيجة النهائية لبرنامج PHP فهو محتوى HTML.
ربما سيتضح الأمر أكثر بمثال عملي.
لناخذ كمثال صفحات نادي الفكر العربي. فما الذي يحدث عندما نكتب بالمتصفح هذا العنوان: http://www.nadyelfikr.net/index.php
المتصفح هو الزبون و عندما تكتب هذا العنوان فيه فسيفهم أنك تريد الوصول لصفحة index.php في موقع : nadyelfikr.net و أنت تريد الوصول إليها عن طريق البروتوكول http
لذا فيقوم بإرسال طلب على الأنترنت للحصول على هذه الصفحة.
بعد عبور للشبكة,و "المرمطة" بالمواصلات سيصل الطلب لسيرفر النادي.
السيرفر سيحول الطلب - لأن البروتوكول هو HTTP - لسيرفر الويب (Apache عادة)
عندما يعرف سيرفر الويب أن المطلوب هي صفحة PHP سيوزعه للمعالج PHP ليترجم الصفحة و تعليماتها و يرسل له النتيجة.
هذا المعالج سيقوم بمعالجة الصفحة و ترجمة كل تعليمة فيها , مثلاً الإتصال بقاعدة المعطيات و طلب المعلومات التي بها أو جزء منها.
أو حسابات معقدة ... الخ
بالنهاية فإن البرنامج سيصمم محتوى HTML بناء على النتائج التي عنده و بناء على طريقة برمجة الصفحة و يرسلها لسيرفر الويب و الذي سيحولها بدوره للجهاز و المتصفح الذي طلب الصفحة.
بينما لو كانت الصفحة هي صفحة HTML فإن السيرفر سيبعث محتوى الصفحة كما هو بدون أي معالجة.
لنفهم هذا الفارق يمكن أن نقارن في مطعم ما الذي يحصل عندما نطلب وجبة أو نطلب شوكة.
فعندما نطلب فاصولياء بالرز مثلاً من السيرفر (الخادم) فإنه سيذهب و يطلب من طباخيه أن يطبقوا وصفة الفاصولياء بالرز ثم يأتيك بالوجبة بعد معالجتها. أي أنه لن يأتيك بالرز الني و الفاصولياء النية.
بينما عندما تطلب شوكة فسيعطيك الشوكة دون أي معالجة وسيطة.
الزبون بحالتنا هو المتصفح و ليس المستخدم النهائي.
نحن هنا سندخل للمطبخ و نحاول فهم طريقة عمل الوجبات. :)
- لغة ويب عملية و سهلة , مستويات البرمجة:
لغة ال PHP هي لغة Interpretation و ليست لغة Compilation
أي أنها لغة تحتاج بكل طلب من السيرفر لمترجم يحول تعليماتها لتعليمات مفهومة من نظام التشغيل. بعكس لغة مثل ال C بحيث تكون نتيجتها النهائية برنامج مكتوب أو معالج للغة النظام نفسه.
لغة ال Compilation ميزتها سرعتها, و مشكلتها أنها تعتمد على نواة النظام المستخدم من قبل السيرفر, لذلك تم الإستغناء عنها في أغلب برامج الأنترنت الذي يحتوي أنظمة هجينة و مختلفة.
أي تعتبر لغة ال PHP ملائمة تماماً للأنترنت.
كما أنها لغة متطورة بما أنها مجانية و كودها موجود لكل من يرغب بتطويرها, و بكثرة استخدمها تطورت هي بذاتها بشكل سريع جداً.
هذه اللغة تستغل قواعد المعطيات كلها و لا سيما ال MYSQL بسهولة, و يمكن معها بسهولة أيضاً إحترام فصل المستويات الثلاث لأي برنامج.
المستويات الثلاث هي :
المعطيات , المعالجة, العرض.
بحالة برنامج النادي فيمكن أن نعرف هذه المستويات الثلاثة ب :
المعطيات : قاعدة MYSQL
المعالجة : لغة ال PHP
العرض : HTML
البرامج الأفضل هي التي تفصل العرض (HTML) عن المعالجة, و رغم صعوبة هذا العمل في البداية فلقد أصبح أكثر سهولة في السنوات الأخيرة.
في الأمثلة التي سنراها قريباً سنفهم أهمية الفصل بين ال HTML و ال PHP.
- أهمية فصل المعطيات عن العرض :
في برامج البوابات و المنتديات الأولى التي ظهرت على الأنترنت كانت الصفحات تحفظ بشكل HTML من خلال برامج PERL يختلط بها المعطيات بالعرض لها.
هذا الأمر يجعل أي مهمة لتطوير البرنامج مهمة شبه مستحيلة.
استخدام قواعد المعطيات ظهرت كرد على هذه المشكلة العويصة. فنقوم حالياً بحفظ المعطيات : كنصوص الردود بالمواضيع و المعلومات المتعلقة بها. و جميع المعلومات التي لا تتعلق بالمظهر للمنتدى.
بينما يحفظ المظهر أو العرض بصفحات HTML أو حتى يمكن حفظ المحتوى HTML بقاعدة المعطيات على شكل : TEMPLATE
و ال TEMPLATE هو نوع من النمذجة لطريقة معينة لظهور صفحة بغض النظر عن المعطيات التي تحتويها.
يمكن أن نفهم ذلك من خلال بعض الأمثلة لاحقاً.
سأحاول المتابعة مع الدرس الأول اليوم أو غداً.
لكني سأبدأ قبل ذلك بعرض بسيط للأدوات الضرورية للبرمجة على نظام ويندوز و التجربة "محلياً".
مع فائق تحياتي.
ابن سوريا.
[1] اليوم هذه اللغة تطورت كثيراً و صارت متوفرة في عالم الويندوز (Active PERL)
في البداية لا بد من التذكير أن الدروس تحتاج معرفة أساسية بلغات البرمجة و قواعد المعطيات. و لو بسيطة.
الأمثلة لن تكون معقدة و لكن بعض المعرفة بالبرمجة و بال HTML لا يضر.
ستفصل الأمثلة بغالبيتها بين ال HTML و ال PHP.
لذلك يمكن استخدام برنامجك المعهود و المفضل لتصميم مواقع ال HTML بشكل منفصل.
سأقوم بشرح حول لغة PHP و MYSQL من خلال مثال عملي سأقوم بتعديله شيئاً فشيئاً و تطويره خلال الشرح.
أولاً لنعتبر أننا نريد إنشاء برنامج صغير على موقع لإستقبال رسائل الأعضاء و حفظها ثم معاينتها فيما بعد من قبل مدير للموقع.
أولاً علينا تعريف المعطيات في قاعدة المعطيات , من الواضح أننا بحاجة لtable لحفظ رسائل الزوار. لكننا أيضاً بحاجة ل TABLE تحمل معلومات الأعضاء التي تسمح لنا أن نعرف إذا كان العضو مديراً أو لا.
لنعتبر أن قاعدة المعطيات تسمى : v_test
و نعتبر سيرفر قاعدة المعطيات هو : localhost
و مستخدم قاعدة المعطيات : root
و كلمة السر : test
سنقوم بإنشاء ملف php لحفظ هذه المعلومات حتى لا نقوم بإعادة تعريفها في بقية الصفحات كل مرة.
لننشئ الملف تحت اسم :
config.php
و نضع فيه المتحولات التالية كما يلي :
و لنعتبر أن لدينا TABLE اسمها v_message
و هذا ال sql request للقيام بإنشائها :
CREATE TABLE v_message (
id bigint(20) NOT NULL auto_increment,
name varchar(40) NOT NULL default '',
email varchar(40) NOT NULL default '',
dateline bigint(30) NOT NULL default '0',
subject varchar(75) NOT NULL default '',
message longtext NOT NULL,
PRIMARY KEY (id),
) TYPE=MyISAM;
الآن سنقوم بإنشاء صفحة خاصة باستقبال الرسائل و حفظها في قاعدة المعطيات.
المبدأ يقوم بإنشاء "فورمولير" FORM بال HTML يحتوي المعلومات التي يكتبها الزائر ثم إرسالها للسيرفر للقيام بمعالجتها.
سأبدأ بالشرح نقطة نقطة , ثم أضع في النهائية النسخة الكاملة للملف:
نبدأ بال HTML الذي يجب وصعه (يمكننا طبعاً وضع كود ال HTML في ملف خاص به و هي أفضل طريقة لفصل ال HTML عن ال PHP أي فصل ال PRESENTATION عن المعالجة أو ال PROGRAMMATION) و لكن هذه العملية صعبة بعد الشيء لمثال للشرح.
ال FORM بسيط و يجب أن يحتوي خانات لوضع الإسم و عنوان البريد الإلكتروني و الرسالة:
سأقوم هنا بشرح هذا الفورميلير.
يمكن ملاحظة أن هناك خانات من نوع INPUT و TEXTAREA و قد عرفت لها NAME
قيمة هذا ال NAME مهمة جداً فيما بعد عند معالجة محتويات هذا الفورمولير.
الآن سنقوم بإنشاء الصفحة التي سنقوم بها بإظهار و مشاهدة المعلومات المحفوظة:
لنسمي هذا الملف :
view_message.php
سنبدأ بالبداية بعرض المعلومات دون تحقق من صلاحية المستخدم.
ثم سنطور الصفحة لتقوم بالتحقق المطلوب. كما سنقوم باستخدام functions فيما بعد و سنضعها بملف مختلف. لا سيما من أجل معالجة النص و عدم عرضه كما هو.
مثل الصفحة السابقة سنقوم بالبداية بالإتصال بسيرفر قاعدة المعطيات و اختيار القاعدة المناسبة:
mysql_connect($dbhost, $dbuser, $dbpw) or die(mysql_error());
mysql_select_db($dbname) or die(mysql_error());
ثم سنقوم بكتابة ال request لإستخراج المعلومات من قاعدة المعطيات
$query_messages = mysql_query("SELECT * FROM v_message") or die(mysql_error());
هذا الأمر سيقوم بإرسال جميع البيانات في ال TABLE علينا الآن عمل حلقة لمعالجة كل صف من الصفوف (أو البيانات) و إرساله للمتصفح .
و هذا كود الصفحة كاملاً.
require "./config.php";
mysql_connect($dbhost, $dbuser, $dbpw) or die(mysql_error());
mysql_select_db($dbname) or die(mysql_error());
$query_messages = mysql_query("SELECT * FROM v_message") or die(mysql_error());
$no_message =0;
echo "Messages :
من ناحية أخرى فسأكتفي حالياً بهذا الدرس و ربما أعود للموضوع بحال وجود حاجة لذلك.
مع فائق الإحترام.
شروح لبرنامج Notes :
أولاً : هدف البرنامج:
هدف البرنامج هو إنشاء صفحة يستطيع طالب من خلالها و بعد إدخال رقم التسجيل و كلمة سر الحصول على نتيجته في الامتحانات.
ثانياً : طريقة عمل البرنامج:
في الصفحة المسماة login.html يضع الطالب رقم تسجيله و كلمة السر, فيقوم البرنامج بتحويل المعلومات لصفحة PHP مسماة : ResultPage.php هذه الصفحة هي برنامج يقوم بالتحقق أولاً من معلومات دخول الطالب فإذا كانت المعلومات غير صحيحة , يقوم بكتابة عبارة بهذا المعنى (Login incorrect)
أما إذا كانت المعلومات صحيحة فإن البرنامج سيبحث عن نتيجة الطالب من خلال رقم تسجيله و يعرض النتيجة له من خلال صفحة html .
كما نرى هنا فنحن بحاجة لبيانيين (TABLE) واحدة لحفظ أرقام التسجيل للطلاب و كلمات السر.
و أخرى لحفظ النتائج لكل طالب.
سأشرح الآن كيفية عمل ذلك.
ثالثاً : شرح كيفية عمل البرنامج:
كما رأينا سابقاً فنحن بحاجة لجدولين في قاعدة المعطيات فإنشاء البرنامج لا بد أن يبدأ بإنشاء هذين الجدولين , ثم سننشئ صفحة الدخول و هي صفحة بسيطة كما سنرى و يمكن تعديلها بال HTML فقط.
و أخيراً لا بد لنا أن نكتب البرنامج PHP الذي سيقوم بمعالجة المعلومات المبعوثة من صفحة الدخول و عرض النتيجة بحال وجودها و بحال كانت معلومات الدخول صحيحة.
1- قاعدة المعطيات :
سنحتاج لبيانيين واحد لحفظ معلومات الطلاب (رقم التسجيل,كلمة السر ...)
و سنسميها : v_users و هذه طريقة بناء الجدول بقاعدة المعطيات من نوع MYSQL ضمن برنامج مخصص لهذا الغرض (PPMYADMIN مثلاً)
# بنية الجدول `v_users`
#
CREATE TABLE v_users (
uid bigint(20) NOT NULL auto_increment,
username varchar(100) NOT NULL default '',
password varchar(100) NOT NULL default '',
PRIMARY KEY (uid)
) TYPE=MyISAM;
الحقل username سيحتوي رقم التسجيل للطالب.
لنقوم الآن بإضافة بعض المحتويات لهذا الجدول مثلاً عن طريق هذا الكود:
INSERT INTO v_users VALUES (1, 'Tarek', 'toto');
INSERT INTO v_users VALUES (2, 'jadmoon', 'titi');
الجدول الثاني سيحتوي معلومات الطلاب لنسميه : v_results
#
# بنية الجدول `v_results`
#
CREATE TABLE v_results (
rid bigint(20) NOT NULL auto_increment,
refid varchar(100) NOT NULL default '',
note varchar(100) NOT NULL default '',
PRIMARY KEY (rid)
) TYPE=MyISAM;
و لنضع هذه النتيجة في الجدول :
INSERT INTO v_results VALUES (1, 'Tarek', '99/100');
2- تصميم صفحة الدخول :
صفحة الدخول هي صفحة HTML بسيطة يمكن كتابتها بأي برنامج مخصص لل HTML و المهم لل PHP لاحقاً هم حقول معلومات الدخول و الصفحة التي سنحول إليها المعلومات بعد الضغط على زر "GO"
أي أهم ما في الصفحة login.html هو ال FORM التالي :
الكود التالي : ACTION="ResultPage.php"
هو الذي يحدد لأي صفحة سنحول الفورميلير عندما سنضغط على submit أو زر "Get Result".
الأمر التالي هو أهمية خاصية name للحقلين المخصصين لرقم التسجيل و كلمة السر و اللذين سيتحولان لمتحولات في صفحة ال PHP.
3- تصميم صفحتي النتائج :
أولاً سنصمم صفحة المعالجة المعلومات ResultPage.php هذه الصفحة ستقوم كما في الدرس الماضي بالاتصال بقاعدة المعطيات.
الجديد هنا أننا وضعنا function (تابع) في صفحة منفصلة و أسميتها functions.php
لإستخدام ال function الموجود في هذا الملف يجب إضافته للصفحة الحالية كما يلي :
require "./functions.php";
العمل الآن سيكون على دفعتين :
أولاً سنتحقق من معلومات الدخول , لهذا الغرض يجب أن نحصل على معلومات الدخول التي أرسلتها لنا صفحة الدخول أي : login.php كما يلي :
$v_refid = $_POST['v_refid'];
$v_password = $_POST['v_password'];
الآن سنقوم بالطلب من قاعدة المعطيات إن كانت المعلومات التي لدينا صحيحة كما يلي :
$query = mysql_query("SELECT * FROM v_users WHERE username='$v_refid' AND password='$v_password'") or die(mysql_error());
if($query && mysql_num_rows($query) == 1){
$member = mysql_fetch_array($query);
$v_refid = $member[username];
}
else{
echo " Login Incorrect - Please login again";
exit;
}
كما نرى فإننا نبدأ بالطلب من قاعدة المعطيات إذا كان لديها بيان موافق للمعلومات التي لدينا.
ثم إذا وجدنا أن هناك نتيجة نقوم بالحصول على المعلومات الإضافية في البان الذي حصلنا عليه, و إذا لم نحصل على شيء فهذا معناه أن معلومات الدخول خاطئة و نعرض تنويهاً بسيطاً بذلك للمستخدم و نطلب منه بالعودة لصفحة الدخول و المحاولة من جديد :
echo " Login Incorrect - Please login again";
أما التعليمة exit فتعني انتهاء المعالجة و الصفحة في هذه الحالة.
ثم نتابع , و المتابعة بالصفحة تعني أننا في حالة معلومات دخول صحيحة. إذاً فسنبحث الآن على نتيجة الطالب و نعرضها له.
نطلب من قاعدة المعطيات و من الجدول v-results إإإذا كان هناك بيان يحتوي على نتيجة للطالب:
$query = mysql_query("SELECT * FROM v_results WHERE refid='$v_refid' ") or die(mysql_error());
إذا حصلنا على نتيجة سنعرضها باستخدام ال function الذي كتبناه في صفحة أخرى. و إلا فليس هناك نتيجة بعد للطالب و نكتب له رسالة بهذا المعنى:
الآن سأشرح بشكل مفصل ماذا يحصل في الحالة التي وجدنا بها النتيجة في هذه السطور :
$result = mysql_fetch_array($query);
$note = $result[note];
$html = template("ResultPage.html");
eval("echo stripslashes("$html");");
أول سطرين سهلين فنحن نقوم بالحصول على النتيجة التي وصلتنا من قاعدة المعطيات ووضعها بمتحول ($note)
ثم نستخدم ال function , template للحصول على محتويات ال HTML للصفحة ResultPage.html.
بعد الحصول عليها نستخدم function eval لاستبدال المتحولات بقيمتها ثم عرضها على المستخدم.
لنفهم النقطة الأخيرة : أي استبدال المتحولات بقيمتها سنلقي نظرة على ما تحتويه الصفحة ResultPage.html :
Result Page
$v_refid
$note
كما تلاحظ فإنها صفحة HTML عادية عدا أنها تحتوي على بعض المتحولات كصفحات ال PHP المتحولات هي :
$v_refid
$v_note
و مكانها هو مكان المعلومات التي تتغير بحسب الطالب , كما نلاحظ أنها متطابقة مع بعض المتحولات التي حصلنا عليها في صفحة ResultPage.php.
هذه المتحولات هي التي قمنا باستبدالها بقيمتها باستخدام ال function eval.
أتمنى أن الشرح كان كافياً. و لا تتردوا بسؤالي عن أي شيء استعصى عليكم.
كانت قراءة سريعة لضيق الوقت، الكثير لم أستطع هضمه من القراءة الأولى.
لي عودة بعد التطبيق العملي للدروس، لكن ربما متأخرة، على كل الأحوال تابع، فنحن نتابع.