الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

برمجة مواقع الويب باستخدام واجهات Cgi ولغة سي ++

بدأه time1 في 6 سبتمبر 2008 · 0 رد · 1,739 مشاهدة · في المواضيع والدروس
مشاركة: واتساب X فيسبوك تيليجرام
#1

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

والصلاة والسلام على اشرف الخلق سيدنا محمد وعلى آله وصحبه اجمعين .

سنكمل مشوار حديثنا حول برمجة مواقع الويب باستخدام واجهات 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;

}

post-82612-1220731953_thumb.jpg

********************************************************************************

***

ثانيا : 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> .

post-82612-1220731963_thumb.jpg

الحالات الاخرى :

اذا كان الطلب name=Ali

   else if( query == "name=Ali" )
	  cout << "<p>The query name is: " << "Ali is ready" << "</p>";

post-82612-1220731970_thumb.jpg

وبعدها Bdr

واخيرا اذا كان الطلب غير تلك الحالات

  else
	  cout << "<p>The query name is: " << "Unknow is ready" << "</p>";

post-82612-1220731975_thumb.jpg

بعدها يتم اغلاق الوسوم <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 >

post-82612-1220731984_thumb.jpg

post-82612-1220731989_thumb.jpg

إلى هنا اكون قد وصلت إلى نهاية درسي الثاني , على امل ان اكمل البقية بإذن الله .

تحياتي . . .

llback.jpg

اشهد ان لا إله إلا الله وان محمدا ً رسول الله

مواضيع مشابهة