بسم الله الرحمن الرحيم
والصلاة والسلام على اشرف الخلق سيدنا محمد وعلى آله وصحبه اجمعين .
سنكمل مشوار حديثنا حول برمجة مواقع الويب باستخدام واجهات Cgi ولغة سي ++ .
وللاطلاع على الدرس الاول , مــن هـــنا
سنكمل امثلتنا السابقة بمثالنا الاخير ولكن هذه المرة سنتعرف على شئ جديد يسمى environment variables "متغيرات البيئة " , وهذه البيئة توفر لنا معلومات عن بيئة الخادم والعميل :
DOCUMENT_ROOT,GATEWAY_INTERFACE,HTTP_ACCEPT_LANGUAGE,HTTP_CONNECTION,HTTP_HOST,
HTTP_USER_AGENT,PATH,QUERY_STRING,REMOTE_ADDR,REMOTE_PORT,
REQUEST_METHOD,REQUEST_URI,SCRIPT_FILENAME,SCRIPT_NAME,SERVER_ADDR,SERVER_ADMIN,
SERVER_NAME,SERVER_PORT,SERVER_PROTOCOL,
SERVER_SIGNATURE,SERVER_SOFTWARE.......
سنقوم بكتابة برنامج بسيط يعطينا قيم هذه المتغيرات بالنسبة للخادم والعميل وسنستخدم الدالة getenv لذلك سنقوم بتضمين المكتبة cstdlib داخل برنامجنا .
#include <cstdlib>
نقوم بعد ذلك بتعريف مصفوفة من سلاسل الحروف char *[ ] او string تحتوي على المتغيرات التي نريد طباعة قيمها .
char * ev[ 21 ] = {"DOCUMENT_ROOT", "GATEWAY_INTERFACE","HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION", "HTTP_HOST", "HTTP_USER_AGENT", "PATH","QUERY_STRING", "REMOTE_ADDR", "REMOTE_PORT","REQUEST_METHOD", "REQUEST_URI", "SCRIPT_FILENAME", "SCRIPT_NAME", "SERVER_ADDR", "SERVER_ADMIN", "SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL","SERVER_SIGNATURE","SERVER_SOFTWARE" };سنقوم بطباعة قيم المتغيرات على شكل جدول باستخدام وسم table وبواسطة الخصائص نغير حد الجدول border إلى 1
cout << "<table border = \"1\" cellspacing = \"2\">";
بعدها نقوم بطباعة المتغيرات وقيمها كلا في صف واحد من الجدول , بواسطة الوسم <tr> والوسم <td> لكل عنصر من عناصر الجدول , لذلك سيكون لكل من المتغيرات وقيم المتغيرات وسم <td> مستقل .
نقوم بطباعة المتغيرات من خلال استدعائها اما قيم المتغيرات من خلال الدالة getenv
getenv( ev[ i ] )
نقوم بإنشاء حلقة تكرار تقوم بطباعة المتغيرات وقيمها .
for ( int i = 0; i < 21; i++ ) cout << "<tr><td>" << ev[ i ] << "</td><td>" << getenv( ev[ i ] ) << "</td></tr>";
بعدها نقوم بإغلاق كلا من وسوم الجدول <table> و <body> و <html>
cout << "</table></body></html>";
ليصبح البرنامج بشكله النهائي
int main()
{
char * ev[ 21 ] = {"DOCUMENT_ROOT", "GATEWAY_INTERFACE","HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION", "HTTP_HOST", "HTTP_USER_AGENT", "PATH","QUERY_STRING", "REMOTE_ADDR", "REMOTE_PORT","REQUEST_METHOD", "REQUEST_URI", "SCRIPT_FILENAME", "SCRIPT_NAME", "SERVER_ADDR", "SERVER_ADMIN", "SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL","SERVER_SIGNATURE","SERVER_SOFTWARE" };
cout << "Content-type: text/html\n\n";
cout << "<?xml version = \"1.0\"?>"
<< "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 "
<< "Transitional//EN\" \"http://www.w3.org/TR/xhtml1"
<< "/DTD/xhtml1-transitional.dtd\">";
cout << "<html xmlns = \"http://www.w3.org/1999/xhtml\">"
<< "<head><title>Environment Variables</title></head>"
<< "<body>";
cout << "<table border = \"1\" cellspacing = \"2\">";
for ( int i = 0; i < 21; i++ )
cout << "<tr><td>" << ev[ i ] << "</td><td>" << getenv( ev[ i ] ) << "</td></tr>";
cout << "</table></body></html>";
return 0;
}********************************************************************************
***
ثانيا : Query_String :
تعاملنا بالمثال السابق مع مجموعة من المتغيرات التي تسمى بمتغيرات البيئة , ويوجد متغير من هذه المتغيرات يسمى QUERY_STRING سنقوم بالتعامل معه في موضوعنا التالي .
يقوم السيرفر بتخزين الطلب في متغير QUERY_STRING والذي يأتي بعد علامة " ؟ " على سبيل المثال :
http://localhost/cgi-bin/first.cgi?name=Ali
مثال :
سنقوم الان بتصميم برنامج ليتعامل مع استعلامات QUERY_STRING في مجموعة من الحالات :
اذا كان المتغير فارغ , اذا كان هناك استعلام عن Ali او استعلام عن Bdr او استعلام غير ماسبق .
يبدا برنامجنا بطباعة جملة على الشاشة بواسطة الوسم <?h> وبعدها يتم استقبال القيمة التي يحملها المتغير QUERY_STRING بواسطة الدالة getenv ويضعها بالمتغير query
string query = getenv( "QUERY_STRING" );
اول حالة نقوم بمعاجلتها اذا كانت قيمة المتغير QUERY_STRING فارغه .
if ( query == "" ) cout << "Empty Query, Enter any Query <br/>like " << "<a href=\"first.cgi?name=anyname\">" << "this</a>.";
نقوم في هذه الحالة بعرض رسالة تخبر المستخدم بأنه لم يدخل اي طلب لـ QUERY_STRING ويتم بعدها عرض مثال لاستخدام الطلب بواسطة الرابط التالي first.cgi?name=anyname والذي تم اعطائه لوسم الارتباط التشعبي <a> .
الحالات الاخرى :
اذا كان الطلب name=Ali
else if( query == "name=Ali" ) cout << "<p>The query name is: " << "Ali is ready" << "</p>";
وبعدها Bdr
واخيرا اذا كان الطلب غير تلك الحالات
else cout << "<p>The query name is: " << "Unknow is ready" << "</p>";
بعدها يتم اغلاق الوسوم <body> , <html>
cout << "</body></html>";
********************************************************************************
********
ثالثا : استخدام النماذج Forms
النماذج , تستخدم كما تعلمنا لاستقبال البيانات من المستخدم وهي انواع كثيرة مثل :
input( text,password,radio,submit,........) ,textarea ,.....etc
سنقوم بتصميم مثال بسيط يحتوي على مربع نص يقوم باستقبال اسم المستخدم وعرضه على الشاشة .
اولا : نقوم بتصميم النموذج :
نستخدم الوسم <form> لانشاء النموذج ونحدد خصائص هذا النموذج method=get و action =CGI.
وبداخل النموذج نقوم بإنشاء :
* مربع نص من خلال الوسم <input> ونحدد نوع الادخال type=text ونعطي اسم للمربع , مثلا name=n .
* زر لارسال البيانات التي استقبلها النموذج إلى المكان الذي تم تحديده من خلال الخاصية action في الوسم<form>
1- cout << "<p>Enter your name:</p>" 2- << "<form method = \"get\" action = \"mycgi.cgi\">" 3- << "<input type = \"text\" name = \"n\"/>" 4- << "<input type = \"submit\" value = \"Print\"/>" 5- << "</form>";
السطر الاول يقوم بطباعة عبارة Enter your name بواسطة وسم البارقراف <p>
السطر الثاني يقوم بانشاء النموذج ويحدد خصائصه كما سبق .
السطر الثالث يقوم بانشاء مربع النص وفقا للخصائص التي ذكرناها .
السطر الرابع ينشأ زر submit ويحدد القيمة التي يحملها Print وهي التي ستظهر على مسمى الزر .
السطر الخامس , اغلاق الوسم </form>
ثانيا: نقوم بالحصول على اسم المستخدم
نقوم اولا بتعريف متغيرين من نوع string الاول ليحمل اسم المستخدم والثاني ليحمل القيمة التي يحملها المتغير QUERY_STRING
string name = ""; string query = getenv( "QUERY_STRING" );
بعد ذلك نختبر اذا كان query خاليا , مثلا عند بداية تشغيل البرنامج , سيطبع الجملة التالية : " Please enter your name
if ( query == "" ) cout << "<p>Please enter your name.</p>";
ماعدا ذلك , اذا كانت هناك قيمة مدخله , نعرف متغير x ليمثل لنا موقع اسم المستخدم من القيمة التي يحملها المتغير QUERY_STRING وهي تحديدا بعد حرفين من بداية السلسلة " =n ",
int x; x= query.find_first_of( "n=" ) + 2;
لتصبح القيمة التي سنعطيها للمتغير name والتي تمثل لنا اسم المستخدم :
name = query.substr( x );
بعدها نقوم بطباعة قيمة المتغير name
cout << " Your name is: " << name << "";
بعدها نغلق الوسوم المفتوحة <body> و <html >
إلى هنا اكون قد وصلت إلى نهاية درسي الثاني , على امل ان اكمل البقية بإذن الله .
تحياتي . . .
