مقارنة keyword المدخله من المستخدم بالموجودة بDB
السلام عليكم
واجهتني مشكلة في محرك البحث الخاص، وهي انه يطلب من المستخدم ادخال كلمات مفتاحية ويبحث عنها بالداتابيس داخل كل صف ويطبع لي الصف المنشود.
المشكله اني لم استطيع حل كيف (ياخذ كلمات بينها مسافه او فاصله) ويبحث عنها كلمة كلمة داخل العامود 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)
وعليكم السلام ورحمة الله وبركاته
هل ممكن مشاركة ملف قاعدة البيانات لمعرفة طريقة بنائها وطريقة توزيع البيانات لحل المشكلة
لان عملية البحث في قواعد البيانات لها طرق عديدة وتختلف باختلاف طريقة بناء الجداول والعلاقات بينهم
في 4/13/2016 at 10:51, Ali Majrashi said:وعليكم السلام ورحمة الله وبركاته
هل ممكن مشاركة ملف قاعدة البيانات لمعرفة طريقة بنائها وطريقة توزيع البيانات لحل المشكلة
لان عملية البحث في قواعد البيانات لها طرق عديدة وتختلف باختلاف طريقة بناء الجداول والعلاقات بينهم
الداتابيس ماتحتوي الا على هذا الجدول لايوجد علاقات ثانية،ومبدا البحث يعمل على كل الأعمدة بوقت واحد .
وللتاكيد: اريد ان يدخل المستخدم كلمات مفصوله بمسافه او فاصله وتخزن بمتغير keyword$ ثم ياخذ الكلمات ويقارنها صف صف بالموجودة في العامود Keyword ثم يطبع لي الصف كامل .
@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 للاتصال بقاعدة البيانات وهي الافضل لمرونتها وسهولتها
شكررااا شككككرااا اخوي @Ali Majrashi ، جزاك الله خير ..
الكود اشتغل معي وتمت عملية البحث.
الله يوفقك ويكثر من أمثالك .
1 ساعه مضت, Albatool-saud said:شكررااا شككككرااا اخوي @Ali Majrashi ، جزاك الله خير ..
الكود اشتغل معي وتمت عملية البحث.
الله يوفقك ويكثر من أمثالك .
يعافيك ربي
لايوجد لديك حساب في عالم البرمجة؟
تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !