هذا كود برمجي يختص بخانة البحث في قاعدة البيانات ولكنه يقوم بالبحث عن الكلمة فقط اذا كتبتها بالحرف الواحد
انا اريده يبحث بالكلمة ولو كتبها الشخص بالخطاء مثال : شخص يريد سيارة فكتب شيارة فهنا اريد الكود ياتي له بالسيارات
وشخص اخر كتب كماب بدل ان يكتب كتاب فاريد الكود يبحث عن كلمة كتاب وليس ان يظهر له رسالة بان البحث الذي قام به ليس موجود :
<?php
if(isset($_POST['search_btn'])){
$search_box = $_POST['search_box'];
$search_box = filter_var($search_box, FILTER_SANITIZE_STRING);
$select_products = $conn->prepare("SELECT id,name,image,price,date FROM `products`
WHERE name LIKE '%{$search_box}%'
UNION
SELECT id,name,image,price,date FROM `car`
WHERE name LIKE '%{$search_box}%'
UNION
SELECT id,name,image,price,date FROM `sellhome`
WHERE name LIKE '%{$search_box}%'
UNION
SELECT id,name,image,price,date FROM `wod`
WHERE name LIKE '%{$search_box}%'
UNION
SELECT id,name,image,price,date FROM `alic`
WHERE name LIKE '%{$search_box}%'
UNION
SELECT id,name,image,price,date FROM `shos`
WHERE name LIKE '%{$search_box}%'
UNION
SELECT id,name,image,price,date FROM `moto`
WHERE name LIKE '%{$search_box}%'
UNION
SELECT id,name,image,price,date FROM `big`
WHERE name LIKE '%{$search_box}%'
UNION
SELECT id,name,image,price,date FROM `tool`
WHERE name LIKE '%{$search_box}%'
UNION
SELECT id,name,image,price,date FROM `job`
WHERE name LIKE '%{$search_box}%'
UNION
SELECT id,name,image,price,date FROM `honey`
WHERE name LIKE '%{$search_box}%'
UNION
SELECT id,name,image,price,date FROM `mid`
WHERE name LIKE '%{$search_box}%'
");
$select_products->execute();
if($select_products->rowCount() > 0){
while($fetch_products = $select_products->fetch(PDO::FETCH_ASSOC)){
?>
التعليقات
يمكنك استخدام تقنية تسمى تقريب النص هناك عدة طرق لتحقيق ذلك في قاعدة البيانات، وأحد الحلول الشائعة هو استخدام دالة SOUNDEX أو LEVENSHTEIN لتقييم مدى التشابه بين الكلمات.
في حالتك يمكن استخدام مكتبة PHP مثل levenshtein أو similar_text لتحديد مدى التشابه بين الكلمات، ولكن بما أن الحل يجب أن يكون في قاعدة البيانات، يمكن استخدام دالة LEVENSHTEIN المتوفرة في MySQL.
جرب تعديل الكود ليشمل هذا النوع من البحث بالشكل التالي:
<?php
if(isset($_POST['search_btn'])){
$search_box = $_POST['search_box'];
$search_box = filter_var($search_box, FILTER_SANITIZE_STRING);
// تحديد المسافة القصوى المسموح بها للبحث (يمكن تعديلها حسب الحاجة)
$max_distance = 2;
$query = "
SELECT id, name, image, price, date FROM (
SELECT id, name, image, price, date FROM `products`
UNION
SELECT id, name, image, price, date FROM `car`
UNION
SELECT id, name, image, price, date FROM `sellhome`
UNION
SELECT id, name, image, price, date FROM `wod`
UNION
SELECT id, name, image, price, date FROM `alic`
UNION
SELECT id, name, image, price, date FROM `shos`
UNION
SELECT id, name, image, price, date FROM `moto`
UNION
SELECT id, name, image, price, date FROM `big`
UNION
SELECT id, name, image, price, date FROM `tool`
UNION
SELECT id, name, image, price, date FROM `job`
UNION
SELECT id, name, image, price, date FROM `honey`
UNION
SELECT id, name, image, price, date FROM `mid`
) AS combined
WHERE LEVENSHTEIN(name, '{$search_box}') <= {$max_distance}
";
$select_products = $conn->prepare($query);
$select_products->execute();
if($select_products->rowCount() > 0){
while($fetch_products = $select_products->fetch(PDO::FETCH_ASSOC)){
// قم بعرض النتائج هنا
}
} else {
echo "لا توجد نتائج للبحث.";
}
}
?>
نستخدم الدالة LEVENSHTEIN لتحديد المسافة بين الكلمة المدخلة والكلمات المخزنة في قاعدة البيانات، و يمكنك تعديل $max_distance لتحديد مدى التباعد المقبول بين الكلمات، قيمة أقل تعني تطابق أكثر دقة، وقيمة أعلى تعني مرونة أكبر في البحث.
بالتوفيق إن شاء الله.