مقارنة keyword المدخله من المستخدم بالموجودة بDB

Albatool-saud • منذ 8 سنوات

السلام عليكم

واجهتني مشكلة في محرك البحث الخاص، وهي انه يطلب من المستخدم ادخال كلمات مفتاحية ويبحث عنها بالداتابيس داخل كل صف ويطبع لي الصف المنشود.

المشكله اني لم استطيع حل كيف (ياخذ كلمات بينها مسافه او فاصله) ويبحث عنها كلمة كلمة داخل العامود Keyword.. جربت هذا الشرط لكن لم ينفع !.


$comma_separated = "('" . implode("','", $keyword) . "')";  

 if($match =="100"){
 $query1= "SELECT * FROM DataTable WHERE  Level= '".$level."' and PDomin ='".$pdomin."' and Indexx= '".$indexing."' and Factor='".$factor."' and Country ='".$country."' and Title LIKE '%".$title."%' and Keyword IN " .$comma_separated ;

وتم تجربة هذا ايضا


$words = mysql_real_escape_string($_POST['keyword']);
if(empty($words)){
    redirect("welcome.php?error=search_empty");
}

$sql="SELECT * FROM DataTable
     WHERE MATCH (keyword)
     AGAINST ('{$words}' IN NATURAL LANGUAGE MODE)";
$results=mysql_query($sql,$connection);
 if(!$results){
    redirect("errors/error_db.html");
 }
 else if($results){
$rows = array();
while($rows = mysql_fetch_array($results, MYSQL_ASSOC))
{
     echo" <tr><td>".$row['Name']."</td><td>".$row['Link']."</td><td>".$row['ISSN']."</td><td>".$row['FactorValue']."</td><td>".$row['Country']."</td><td>".$row['NoIssuesyear']."</td><td>".$row['FirstIssues']."</td><td><a href='".$row['Link']."'> Go to the Journal </a> </td></tr>" ;  
}
}

ارجو المساعده :(

وجزاكم الله خير.

كلمات دليلية:

ساعد بالإجابة

"إن في قضاء حوائج الناس لذة لا يَعرفها إلا من جربها، فافعل الخير مهما استصغرته فإنك لا تدري أي حسنة تدخلك الجنة."

الإجابات (5)

Ali Majrashi • منذ 8 سنوات

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

هل ممكن مشاركة ملف قاعدة البيانات لمعرفة طريقة بنائها وطريقة توزيع البيانات لحل المشكلة 

لان عملية البحث في قواعد البيانات لها طرق عديدة وتختلف باختلاف طريقة بناء الجداول والعلاقات بينهم 

 

Albatool-saud • منذ 8 سنوات
في 4/13/2016 at 10:51, Ali Majrashi said:

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

هل ممكن مشاركة ملف قاعدة البيانات لمعرفة طريقة بنائها وطريقة توزيع البيانات لحل المشكلة 

لان عملية البحث في قواعد البيانات لها طرق عديدة وتختلف باختلاف طريقة بناء الجداول والعلاقات بينهم 

 

الداتابيس ماتحتوي الا على هذا الجدول لايوجد علاقات ثانية،ومبدا البحث يعمل على كل الأعمدة بوقت واحد .

وللتاكيد: اريد ان يدخل المستخدم كلمات مفصوله بمسافه او فاصله وتخزن بمتغير keyword$ ثم ياخذ الكلمات ويقارنها صف صف بالموجودة في العامود Keyword ثم يطبع لي الصف كامل .

 

Screen Shot 2016-04-14 at 5.06.39 PM.png

Ali Majrashi • منذ 8 سنوات

@Albatool-saud قمت بعمل جدول بسيط في قاعدة البيانات باسم posts يحتوي على الحقول title, content و keywords مع ملاحظة ان keywords تخزن بالحقل مفصولين بمسافة لتتم عملية البحث 

ثم عملت ملف index.html وضعت فيه نموذج البحث وهذا محتواه


<!DOCTYPE html>
<html>
<head>
	<title>searching</title>
</head>
<body>
<form action="search.php" method="POST">
    <input id="keywords" type="text" name="keywords">
    <button id="searchButton" type="submit">search</button>
</form>
</body>
</html>

ثم قمت بعمل ملف search.php لاجراء عملية البحث طبعا مثل ماقلت لك بالبداية طرق البحث كثيره ولكن اختاري المناسب لك انا هنا اخترت الدالة REGEXP لتنفيذ التحقق من وجود نص محدد ضمن الحقل ولكن للمشاريع الكبيرة يفضل استخدام FULLTEXT لتنفيذ عمليات البحث العيب الوحيد لازم يكون اصدار قاعدة البيانات 5.6 او اعلى ليدعمه 

هنا محتوى ملف البحث 


<?php

$username = 'root';
$password = 'root';
$db = '3alampro-help';
// Create connection


// Check connection
try {
    $pdo = new PDO ('mysql:host=localhost;dbname=' . $db, $username, $password); 
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo $e->getMessage();
    die();
}

if(isset($_POST['keywords']))
{
    $keywords = str_replace(" ", '|', trim($_POST['keywords']));

    $query = "SELECT * FROM posts WHERE  keywords REGEXP '$keywords'";

    $query = $pdo->query($query);
    while ($posts = $query->fetch()) {
        echo '<li>';
           echo '<h2>' . $posts['title'] . '</h2>';
           echo '<p>' . $posts['content'] .'</p>';
        echo '</li>';
     }
}
else
{
    echo "please isnert keywords";
}

يمكنك تعديله لما يناسبك وعملك هذا الكود راح يبحث عن كلمات مفصوله بمسافة ممكن تغيره ليبحث عن كلمات مفصولة بفاصلة بتغير هذا السطر 


$keywords = str_replace(" ", '|', trim($_POST['keywords']));

وتغير اول مدخل " " المسافة الى فاصلة

بالنسبة لعملية البحث بواسطة FULLTEXT وهي الافضل نستخدم هذه الصيغة لبناء WHERE في sql


WHERE MATCH (`column`) AGAINST('+keyword1* +keyword2* +keyword3*' IN BOOLEAN MODE)

في حالة كانت قاعدة البيانات حديثه والجداول من نوع InnoDB وتدعم FULLTEXT فانه سوف تعمل بدون مشاكل 

في المثال استخدمت الكلاس PDO  للاتصال بقاعدة البيانات وهي الافضل لمرونتها وسهولتها

Albatool-saud • منذ 7 سنوات

:(شكررااا شككككرااا اخوي @Ali Majrashi ، جزاك الله خير ..

الكود اشتغل معي وتمت عملية البحث.

الله يوفقك ويكثر من أمثالك .

Ali Majrashi • منذ 7 سنوات
1 ساعه مضت, Albatool-saud said:

:(شكررااا شككككرااا اخوي @Ali Majrashi ، جزاك الله خير ..

الكود اشتغل معي وتمت عملية البحث.

الله يوفقك ويكثر من أمثالك .

يعافيك ربي :)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !