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

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

بدأه time1 في 10 سبتمبر 2008 · 3 رد · 3,525 مشاهدة · في المواضيع والدروس
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

نواصل حديثنا الذي بدئناه حول برمجة مواقع الويب باستخدام واجهات Cgi و لغة سي ++ من خلال الدرس الاول و الدرس الثاني

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

اولا : التعامل مع النماذج باستخدام Post

سنقوم الان بتطبيق البرنامج السابق لكن هذه المرة باستخدام Post مع النماذج .

اولا: انشاء النماذج

نقوم بإنشاء النماذج ولكن هذه المرة نغير الخاصية method إلى post .

   cout << "<p>Enter your name:</p>"
		<< "<form method = \"post\" action = \"3.cgi\">"
		<< "<input type = \"text\" name = \"n\" />"
		<< "<input type = \"submit\" value = \"Print\" />"
		<< "</form>";

نستخدم cin.read لقراءة المدخلات بالعدد الذي يحمله المتغير CONTENT_LENGTH

   char post[ 50 ] = "";
   int Length = 0;

   if ( getenv( "CONTENT_LENGTH" ) )
	  Length = atoi( getenv( "CONTENT_LENGTH" ) );
	  cin.read( post, Length );
string str = post;

ثانيا : نختبر الحالات :

الحالة الاولى اذا كانت هناك مدخلات , وعندها :

نحدد بداية الاسم وهو الطلب المرسل بعد حرفين "=n" في المتغير x

وبما ان المدخلات يتم صياغتها على شكل ازواج تفصل بينها العلامة "&" ستكون نهاية الاسم من بين الطلب إلى ماقبل العلامة & بحرف .

	  int x = str.find_first_of( "n=" ) + 2;

	  int y = str.find_first_of( "&" ) - 1;

لتصبح النتيجة التي تمثل لنا الاسم بالشكل التالي :

	  name = str.substr( x,y - x);

بعدها يمكن طباعة الاسم كما قمنا بالمثال السابق

cout << "
Your name is: " << name << "";

لتصبح النتيجة النهائية بالشكل التالي :

//first
   char post[ 50 ] = "";
   int Length = 0;

   if ( getenv( "CONTENT_LENGTH" ) )
	  Length = atoi( getenv( "CONTENT_LENGTH" ) );
	  cin.read( post, Length );
	string str = post;
//Second
	string name = "";

   if ( Length > 0 ) {
	  int x = str.find_first_of( "n=" ) + 2;

	  int y = str.find_first_of( "&" ) - 1;

	  name = str.substr( x,y - x);

	  if ( name == "" )
		 cout << "<p>Please enter your name.</p>";


	  else
		 cout << "<p>Your name is: " << name << "</p>";

   } 

   else
	  cout << "<p>Please enter your name.</p>";

   cout << "</body></html>";

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

Cookies

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

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

post-82612-1221012041_thumb.jpg

html.zip

لاحظ عزيزي القارئ بأنني قمت بتعديل الخاصية action في النموذج إلى

<form method = "post"
		 action = "http://localhost/cgi-bin/write.cgi">

و write.cgi هو الـ Cgi الذي سنقوم بكتابته بعد قليل ليتعامل مع البيانات التي يدخلها المستخدم .

اولا : كتابة الكوكيز .

اول مانقوم به هو تحديد تاريخ معين لنهاية الكوكيز في كمبيوتر المستخدم expires , على سبيل المثال :

   string expires = "Sunday, 12-APRIL-09 20:00:00 GMT";

بعدها نحدد الطول من المتغير CONTENT_LENGTH كما تعلمنا سابقا :

  
	char query[ 200 ] = "";
	string data = "";
 if ( getenv( "CONTENT_LENGTH" ) ) {
	  Length = atoi( getenv( "CONTENT_LENGTH" ) );

بعد ذلك نستقبل الاستعلام بواسطة الدخل وبالطول الذي اوجدناه مسبقا :

  

   cin.read( query, Length );
   data = query;

كان لدينا من خلال النموذج الذي قمنا بتصميمه سابقا اسم المستخدم وبريده الالكتروني , والان نقوم باختطاف هذه البيانات من خلال الاستعلام الموجود لدينا واول مانبدأ به هو تحديد موقع البيانات :

	  string name = "";
	  string email = "";

	  int NameStart = data.find( "name=" ) + 5;
	  int NameEnd = data.find( "&" );

	  int EmailStart = data.find( "email=" ) + 6;
	  int EmailEnd = data.find( "&button" );

ولتتضح لك المفاهيم اكثر أنظر إلى هذا الاستعلام :

name=UserName&email=UserEmail&button=%CF%CE%DC%DC%DC%DC%DC%DC%DC%E6%E1

اعتقد بأن الامور اصبحت واضحة الان .

بعد ان حصلنا على مواقع البيانات نقوم الان بوضع البيانات في متغيرات :

	  name = data.substr( NameStart, NameEnd - 
		 NameStart );

	  email = data.substr( EmailStart, EmailEnd - 
			EmailStart );

الان وبعد ان اعدينا كل مانحتاجه نقوم بضبط الكوكيز .

	  cout << "Set-cookie: Name=" << name << "Email:"
		   << email << "; expires=" << expires << "; path=\n";

الان لم يتبقى لنا إلا اكمال الجمل الاساسية والتي نكتبها في كل مثال :

   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>Cookie</title></head>"
		<< "<body>";

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

post-82612-1221012050_thumb.jpg

   cout << "<p>شكرا لك, تم تسجيل دخولك"<< "<p>لاستعراض بياناتك المسجلة لدينا <a href=\"/cgi-bin/read.cgi\">"
		<< "انقر هنا</a> </p>"
		<< "</body></html>";

post-82612-1221012057_thumb.jpg

ثانيا : قراءة الكوكيز المسجلة .

هل لاحظت عزيزي القارئ السطر التالي :

 <a href=\"/cgi-bin/read.cgi\">

كنا نخبر المستخدم بأنه بالامكان الاطلاع على بياناته المسجلة لدينا في الكوكيز من خلال النقر على هذا الارتباط التشعبي

والذي يقوم باستدعاء الـread.cgi وهو ماسنقوم بكتابته الان :

بداية نقوم بالتقاط البيانات الموجودة بالمتغير HTTP_COOKIE

   char *data = getenv( "HTTP_COOKIE" );

   string str = data;

بعدها نقوم كما قمنا بالمرة السابقة بتحديد البيانات المراد عرضها من خلال تحديد مواقع البيانات كلا على حده :

   int nameStart = str.find( "Name=" ) + 5;
   int nameEnd = str.find( "Email:" );

   int emailStart = str.find( "Email:" ) + 6;

وهي كما يتضح في هذا المثال :

Name=UserNameEmail:UserEmail

الان وبعد ان حددنا مواقع البيانات نقوم بفصلها بمتغيرات خاصة :

   string name =name = str.substr( nameStart, nameEnd - 
	  nameStart );

   string email = str.substr( emailStart );

بعد ذلك نكرر الاسطر التي تعلمناها في الدروس السابقة :

   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>Cookies</title></head>"
		<< "<body>";

اخيرا تأتي مرحلة عرض البيانات المسجلة بالكوكيز للمستخدم .

	  cout << "<p>بياناتك المسجلة لدينا"<< " </p>"
		   << "<p>Name: "  << name  << "<br/></p>"
		   << "<p>Email: "   << email   << "<br/></p>";

اغلاق الوسوم المفتوحة :

   cout << "</body></html>";

post-82612-1221012067_thumb.jpg

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

تقبلوا تحياتي . . .

1
llback.jpg

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

#2

وفقك الله أخي درس قيم وشامل و أسلوبك في العرض مميز بارك الله فيك.

tvquran_6.gif

#3

بارك الله بك اخي الأستاذ(الشاعر كمان) time1

:happy:

.,.,,..,.,.,,.,.,.

من شوي عاملة رفع لروابط الدروس التلات بالموضوع المثبت بالقسم (كتاب اعضاء المنتدى)...

.,.,,.,..,.,.,.,.,

اطيب المُنى

[وسط]

♥ Countess ♥

57899411.gif

♥

[/وسط]

#4

يعطيك الف عافية

(دخلتني عالم جديد)

وااصل ابداعك ونسأل الله لك التوفيق والهداية

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