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

بناء محرك بحث في الموقع افكار وتلميحات

مغلق
بدأه Dr.Pain في 21 نوفمبر 2006 · 2 رد · 1,180 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته .......

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

ولكن ان عزمنا على تقديم خدمة محرك البحث في اكثر من موضع في الموقع فاننا سوف نضطر الى كتابة الكود الخاص بالمحرك في كل مكان نطلبه فيه ,, لذا لقد قمت بعمل محرك بحث بدائي جدا وذلك لكي تستخدمه في اي مكان تريد داخل الموقع ,, ولاحظ انني جعلته بدائياً عن عمد وذلك حتى اوضح الفكرة لا اكثر ولا اقل ,, ولكن ان اراد البعض تطوير الفكرة فسوف نتعاون على ذلك ما رأيكم ...

اخوكم Dr.Pain

Engine.rar

#2

جزاك الله خيراً ولنتعاون معاً فإني إلى الآن لم أبدأ بعمل محرك بحث لي خاص

أقترح أولاً أن يكون إجراء الاستعلام لقاعدة البيانات واحد وموحد في جميع البرنامج وعدم اختراع العجلة في كل مرة تنفذ فيه أمر sql

وسأقدم هنا اجراء ينفذد أمر sql فإن ظهر خطأ فإنه يطبع رسالة الخطأ وإلا :

فإن كان بعبارة SELECT فإنه يعيد مصفوفة بالسجلات

وإن كان insert أو update أو delete فإنه يعيد عدد السجلات المتأثرة لتتأكد تماماً أن العملية تمت بشكل صحيح.

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

function querySQL ($sql) {
	global $dbLink , $INFO;
	$result = false;
	$mun_rows = 0;
	$rows = false;
		//---------------------------------------
	$result = @mysql_query($sql,$dbLink);
	if (!$result) {
		$name = 'DB_ERROR No :'.mysql_errno($dbLink);
		$msg = sprintf( " <br>
			<blockquote><b>There appears to be an error with the {$INFO['company']} database.</b>
			<br>You can try to refresh the page by clicking
		   <a href=\"java script:window.location=window.location;\">here</a>, if this
			<p>%s</p>
   		   <b>Error Returned</b><br>
		   		<div class=\"msgError\">%s</div>
			</blockquote>", $sql, htmlspecialchars(mysql_error($dbLink)));
		echo $msg;
		//die();
		//debug_var ($name, $msg);
		return false;
	}
	//---------------------------------------
	$num_rows = @mysql_num_rows($result);
	if ($num_rows >0 ) {
		for ($i = 0; $i<$num_rows; $i++) { 
			$rows[$i] = mysql_fetch_assoc($result);
		}
	} else {
		$rows = @mysql_affected_rows($dbLink);
	} 
	//---------------------------------------
		@mysql_free_result($result);
	return $rows; 
}
//=======================================================
$rowsData = querySQL ($sql)
if (count($rowsData)>0) {
	for ($n=0; $n < count($rowsData); $n++){
		foreach ($rowsData[$n] as $key => $value){
		////
		}
		unset($key, $value);
	}	
}

تم تعديل هذه المشاركة بواسطة أبو محمد اللحياني في 22 نوفمبر 2006 في 04:58

ولو وافيت ربك دون ذنب *** وناقشك الحساب إذاً هلكتا

ولم يظلمك في عملٍ ولكن *** عسير أن تقوم بما حملتا

#3

السلام عليكم ورحمة الله وبركاته ........

اقتباس
أقترح أولاً أن يكون إجراء الاستعلام لقاعدة البيانات واحد وموحد في جميع البرنامج وعدم اختراع العجلة في كل مرة تنفذ فيه أمر sql

كلام جميل جداً جداً جداً جداً جداً جداً جداً جداً ,,, :lol: :lol: :lol:

وبصراحة اخي ابو محمد انني عندما قمت بفتح الموضوع لم تكن نيتي هي انشاء محرك بحث ,, :unsure: :unsure: :huh:

بل كانت نيتي اكبر من ذلك وهي تتلخص في الاتي :

- التعرف على كيفية بناء ادوات Controls قابلة لاعادة الاستخدام .

- بناء الادوات اعتماداً على على تقنية OOP مع تطبيق مبادئ ال Design Pattern التي شرحها اخي واستاذي الحسين غفر الله له ولوالديه ولنا ولكل اعضاء هذا المنتدى الرائع ولكل الامة الاسلامية حيث انني والله استفدت كثيراً كثيراً كثيراً من دروس الاستاذ الحسين .

- القيام بعمل توثيق لمجموعة الفئات والاداوت التي سنقوم ببنائها بواسطة UML .

- اعتماد مشروع محرك البحث من اجل تطبيق ما سبق .

وحتى لا تأخذكم بي الظنون انا لا استطيع عمل كل ذلك وحدي لانني وبصراحة اعرف قليلاً في UML وقليلاُ في ال Design Pattern وقليلاً في OOP لذا ان تظافرت الجهود اصبح هذا الموضوع مادة دراسية رائعه .

فمثلا سوف نتعرف سوية على كيفية بناء البرامج باستخدام OOP وكذا سنتعرف على كيفية توثيق الفئات وهكذا ,, لذا فانني ارى ان ياخذ هذا الموضوع وقته لانه لا يوجد احد منا في عجلة من امره فالموضوع برمته عبارة عن مادة تعليمية فقط لا غير بمعنى اننا حتى ولو لم ننجح في بناء المحرك لا سمح الله فاننا سوف نكون قد استفدنا ولو قليلاً من بعضنا البعض وذلك بالنظر الى افكاربعضنا .

اقتباس
أقترح أولاً أن يكون إجراء الاستعلام لقاعدة البيانات واحد وموحد في جميع البرنامج وعدم اختراع العجلة في كل مرة تنفذ فيه أمر sql

لو سمحت لي اخي ابو محمد ان اضع حلاً غير الذي وضعته انت وهو يقول :

بما ان الوظيفه الاساسية المحرك هي الاتصال بقاعدة بيانات واستخراج المعلومات من جداول محددة فيها ,, فلم لا نقوم بتنظيم العملية وذلك بتوفير فئات معينة يقوم المحرك بالاعتماد عليها كلياً في عملية الولوج الى قاعدة البيانات واستخراج المعلومات , بينما ينصرف المحرك الى تأدية مهام اخرى دون الحاجة الى الدخول في تفاصيل عملية الولوج الى القاعدة .

ولذلك اعرض عليكم فكرة الفئات التالية :

1 -  DataBaseObject .
2 - Connection .
3 - Command .
4 - DataReader .

والان اليك كل المعلومات المتعلقة بالفئات السابقة :

1 - DataBaseObject : -

لانشاء اتصال مع قاعدة بيانات في PHP وجب توفر اربعة شروط :

1 - اسم ال Host الذي تريد الاتصال به .

2 - اسم المستخدم .

3 - كلمة المرور .

4 - اسم قاعدة البيانات التي سيتم الاتصال بها .

اذن لماذا لا نقوم ببناء فئة تمثل ما سبق انظر الشكل التالي :

52706167.jpg

مما سبق يتضح انه لدينا فئة اسمها DataBaseObject يوجد بها اربعة اعضاء ووظيفة هذه الفئة هي تقديم خدمات الى الفئة المسماة Connection وهي نقطتنا التالية .

2 - Connection :-

وظيفة هذه الفئة هي انشاء الاتصال مع قاعدة البيانات وقطع الاتصال لا اكثر ولا اقل انظر الشكل التالي :

18070720.jpg

من الشكل نلاحظ ان ال Constructor الخاص بالفئة يستقبل فئة من نوع DataBaseObject والتي سيتم الاعتماد عليها كلياً في عملية الاتصال بواسطة الطريقة Connect .

كما اشرت قبل قليل ان الطريقة Connect وظيفتها هي انشاء الاتصال والطريقة Close من اجل قطع الاتصال .

3 - Command :-

بواسطة هذه الفئة سنقوم بكل عمليات الاضافة والحذف والتعديل وكذا ارجاع النتائج انظر الشكل :

98578144.jpg

من الشكل يتضح انه لدينا طريقتان الاولى اسمها ExcuteQuery وهي تستخدم لكلا من عمليات الاضافة والحذف والتعديل و الطريقة ExcuteDataReader لارجاع النتائج على شكل فئة من نوع DataReader .

4 - DataReader :-

هذه الفئة لا حول لها ولا قوة بمفردها إذ وجب ان تقوم الفئة Command بملائها بالنتائج انظر الشكل التالي :

63498448.jpg

من الشكل يتضح ان الطريقة FillDataReader تستخدم لاستقبال البيانات القادمة من الكائن Command , و الطريقة Read من اجل الدوران على جميع الموجودة في الفئة DataReader , والخاصية Item من اجل ان نرجع عموداً محدداً وذلك بأن يتم تمرير رقم ذلك العمود او اسمه لها .

ملاحظة :

1 - الرجاء من احد الاخوة اعادة صياغة رسم مخطط UML وبناء العلاقات بين الفئات بالشكل الصحيح والعلاقات التي اقصدها هي العلاقة بين الفئة والاخرى كعلاقة One to Many - One to One .. الخ .

2 - لم استطع التعبير عن القيمة المرجعه بواسطة الخاصية Item لذا فقد قمت بعمل فئة اسمها []Row وذلك للتعبير فقط عن القيمة المرجعه الرجاء توضيح ما يجب عمله في مثل هذه المواقف .

34304962.jpg

المخطط الكامل للفئات ( انا عارف انه ناقص وبه اخطاء ولكن هذا الذي قدرت عليه ) :

77236501.jpg

3 - تستطيع استخدام الفئات السابقة في مشاريعك العملية بعد اجراء بعض التعديلات الطفيفة فيها ( او حتى بدون اجراء اي تعديلات ) :lol: :lol:

ومن اجل توحيد النتائج ما رايكم بان نقوم باعتماد التالي :

CREATE DATABASE Engine;

USE Engine;

CREATE TABLE Products(
		ProId int ,
		ProName varchar(100) ,
		ProPictureUrl varchar(100)
);

INSERT INTO Products VALUES(1,'Milk','milk.jpg');
INSERT INTO Products VALUES(2,'Fish','Fish.jpg');
INSERT INTO Products VALUES(3,'Bread','Bread.jpg');
INSERT INTO Products VALUES(4,'Meat','Meat.jpg');

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

كلام ولا احلى سنقوم بمناقشته بعد ان نفرغ من مناقشة ما سبق ,,

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

اخوكم Dr.Pain

Engine.rar

UML.rar

هذا الموضوع مغلق.

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