اذهب إلى المحتوى
  • 0

كيف يمكن انشاء برمجية لاقتراح مجموعة كلمات مخزنة في قاعدة البيانات يحتوي كل منها سلسلة نصية يتم البحث عنها في PHP؟

Our World عالمنا

السؤال

عندي مربع بحث يرسل كود أجاكس الى صفحة php ليتم معالجة الكود وتظهر النتائج .. بداخل صفحة الـ php المذكورة أبحث فى حقل عنوان المنتج وأنا أسميه  NAME  والاقتراحات التى تعود لي في مربع البحث هي كل الـعنوان  NAME .. أنا أريد ان تكون الاقتراحات العائدة  بعض الـعنوان  NAME وليس الكل؛ هذه هى الأكواد

//ajax call input search 
$("#input-search").on("keyup", function() {
  var search = $(this).val();
  var cont = $('.hidden-countryI').val();
  if ($(this).val().length > 0) {
    $.ajax({
      url: "showSearch.php",
      data: {
        sentSearch: search,
        country: cont
      },
      success: function(data) {
        $('.shown').html(data);
      }
    });
  } else {
    $('.shown').html('');
  }
});

صفحة المعالجة


if (isset($_GET['sentSearch']) && isset($_GET['country'])  ) {

          $search= $_GET['sentSearch'];
          $country= $_GET['country'];

          $stmt3=$conn->prepare(" SELECT * FROM  items
            WHERE (CONVERT(NAME USING utf8) LIKE '%$search%' )

             and country_id=? ORDER BY  item_id  DESC LIMIT 8");
          $stmt3->execute(array($country));
          $searchRslt=$stmt3->fetchAll();

          
          if (!empty($searchRslt)) {
           
                echo "<div class='close-search-div'>";
                echo "<img class='close-search' src='layout/images/close.png'>";
                echo "</div>";
                echo "<div class='show2-search'>";
                  foreach ($searchRslt as  $value) {
                      echo "<span class='spanSearch'>".$value['NAME']."</span>";
                  }  
                echo "</div>";
          }else{
            echo "<div class='show2-search'>No results</div>";
          }
        
      }

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0
بتاريخ 2 ساعات قال Our World عالمنا:

نعم اقتراحات تحتوي على الكلمة المبحوث عنها فقط؛ او اقتراحات قريبة من الكلمة مثل:

كلمة بحث:    سا 

اقتراحات:

ساعة

سات

ساب

سارية

 

يمكنك اقتصاص الكلمات التي تحتوي الجزء المبحوث عنه من السلسلة النصية الأصلية التي تعبر عن عنوان المنتج. نتبع في ذلك الخطوات التالية:

  • تجزئة نتائج البحث او العناوين الى كلمات. 
  • التحقق من احتواء كل كلمة على الجزء المبحوث عنه ثم اضافتها الى مصفوفة نتائج
  • طباعة مصفوفة النتائج

يكون ذلك وفق منطق مشابه: 

$searchRslt = $stmt3->fetchAll(); // حقن نتائج البحث في متغير
$search= $_GET['sentSearch']; // حقن الكلمة المفتاحية في سلسلة نصية

$suggestions = [];

foreach($searchRslt as $result){
    $words = explode(' ',$result); // توزيع كلمات العنوان في مصفوفة
    
    // البحث عن الجزء المبحوث عنه في كل كلمة من كلمات العنوان
    foreach($words as $word){
	     if(preg_match("/{$search}/i", $word)){ // في حالة احتواء الكلمة على الكلمة المفتاحية
		    array_push($suggestions ,$word); // اضافتها الى مصفوفة الاقتراحات
	     }
    }
}

الآن لو حاولت طباعة المصفوفة suggestions فسترى ان كل من عناصرها يحتوي الجزء المبحوث عنه. سيمكنك بهذا تشكيل مجموعة من الكلمات المفتاحية او الوسوم.

يمكنك تنظيم العملية أكثر عن طريق فصل كل جزئية كـ:

$searchRslt = $stmt3->fetchAll(); // حقن نتائج البحث في متغير
$search= $_GET['sentSearch']; // حقن الكلمة المفتاحية في سلسلة نصية

$suggestions = [];

foreach($searchRslt as $result){
    $suggestions = array_merge( $suggestions , getMatchedWordsFromString($result ,$search) );
}

function getMatchedWordsFromString($result ,$search)
{
    $words = explode(' ',$result); // توزيع كلمات العنوان في مصفوفة
    
    // البحث عن الجزء المبحوث عنه في كل كلمة من كلمات العنوان
    $suggestions = [];
    foreach($words as $word){
	     if(preg_match("/{$search}/i", $word)){ // في حالة احتواء الكلمة على الكلمة المفتاحية
		    array_push($suggestions ,$word); // اضافتها الى مصفوفة الاقتراحات
	     }
    }

    return $suggestions;
}

لنقل مثلا أن نتائج المصفوفة searchResult كانت كـ: 

$searchRslt = [
     'سيارة رباعية الدفع',
     'سيرورة العمل',
     'ممر للسير',
     'سيرة نبوية'
]; // حق

وأن الكلمة المفتاحية هي: 

$search= 'سير';

ستكون النتيجة كـ:

Array
(
    [0] => سيرورة
    [1] => للسير
    [2] => سيرة
)

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 1 ساعة قال Adnane Kadri:

ما قصدك بـ"بعض العنوان Name"؟ هل تقصد الجزء الذي يحتوي الكلمة المبحوث عنها فقط؟ هل يمكنك الاشارة الى مثال عملي؟

نعم اقتراحات تحتوي على الكلمة المبحوث عنها فقط؛ او اقتراحات قريبة من الكلمة مثل:

كلمة بحث:    سا 

اقتراحات:

ساعة

سات

ساب

سارية

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ On 13/06/2022 at 23:18 قال Adnane Kadri:

يمكنك اقتصاص الكلمات التي تحتوي الجزء المبحوث عنه من السلسلة النصية الأصلية التي تعبر عن عنوان المنتج. نتبع في ذلك الخطوات التالية:

  • تجزئة نتائج البحث او العناوين الى كلمات. 
  • التحقق من احتواء كل كلمة على الجزء المبحوث عنه ثم اضافتها الى مصفوفة نتائج
  • طباعة مصفوفة النتائج

يكون ذلك وفق منطق مشابه: 


$searchRslt = $stmt3->fetchAll(); // حقن نتائج البحث في متغير
$search= $_GET['sentSearch']; // حقن الكلمة المفتاحية في سلسلة نصية

$suggestions = [];

foreach($searchRslt as $result){
    $words = explode(' ',$result); // توزيع كلمات العنوان في مصفوفة
    
    // البحث عن الجزء المبحوث عنه في كل كلمة من كلمات العنوان
    foreach($words as $word){
	     if(preg_match("/{$search}/i", $word)){ // في حالة احتواء الكلمة على الكلمة المفتاحية
		    array_push($suggestions ,$word); // اضافتها الى مصفوفة الاقتراحات
	     }
    }
}

الآن لو حاولت طباعة المصفوفة suggestions فسترى ان كل من عناصرها يحتوي الجزء المبحوث عنه. سيمكنك بهذا تشكيل مجموعة من الكلمات المفتاحية او الوسوم.

يمكنك تنظيم العملية أكثر عن طريق فصل كل جزئية كـ:


$searchRslt = $stmt3->fetchAll(); // حقن نتائج البحث في متغير
$search= $_GET['sentSearch']; // حقن الكلمة المفتاحية في سلسلة نصية

$suggestions = [];

foreach($searchRslt as $result){
    $suggestions = array_merge( $suggestions , getMatchedWordsFromString($result ,$search) );
}

function getMatchedWordsFromString($result ,$search)
{
    $words = explode(' ',$result); // توزيع كلمات العنوان في مصفوفة
    
    // البحث عن الجزء المبحوث عنه في كل كلمة من كلمات العنوان
    $suggestions = [];
    foreach($words as $word){
	     if(preg_match("/{$search}/i", $word)){ // في حالة احتواء الكلمة على الكلمة المفتاحية
		    array_push($suggestions ,$word); // اضافتها الى مصفوفة الاقتراحات
	     }
    }

    return $suggestions;
}

لنقل مثلا أن نتائج المصفوفة searchResult كانت كـ: 


$searchRslt = [
     'سيارة رباعية الدفع',
     'سيرورة العمل',
     'ممر للسير',
     'سيرة نبوية'
]; // حق

وأن الكلمة المفتاحية هي: 


$search= 'سير';

ستكون النتيجة كـ:


Array
(
    [0] => سيرورة
    [1] => للسير
    [2] => سيرة
)

 

هناك مشكلة في الكود ورسالة الخطأ هي:

Warning: explode() expects parameter 2 to be string, array given in

وترتب عليه خطأ اخر هو

Warning: Invalid argument supplied for foreach() in

الكود كاملا:

if (isset($_GET['sentSearch']) && isset($_GET['country'])  ) {

          $search= $_GET['sentSearch'];
          $country= $_GET['country'];

          $stmt3=$conn->prepare(" SELECT * FROM  items
            WHERE (CONVERT(NAME USING utf8) LIKE '%$search%' 
                OR CONVERT(description2 USING utf8) LIKE '%$search%')

             and country_id=? ORDER BY  item_id  DESC LIMIT 8");
          $stmt3->execute(array($country));
          $searchRslt=$stmt3->fetchAll();
         

          


          
          if (!empty($searchRslt)) {
           
                echo "<div class='close-search-div'>";
                echo "<img class='close-search' src='layout/images/close.png'>";
                echo "</div>";
                echo "<div class='show-search'><span>These signs contain your search words </span>";
                            
               function getMatchedWordsFromString($result ,$search)
              {
                  $words = explode(' ',$result); // توزيع كلمات العنوان في مصفوفة
                  
                  // البحث عن الجزء المبحوث عنه في كل كلمة من كلمات العنوان
                  $suggestions = [];
                  foreach($words as $word){
                     if(preg_match("/{$search}/i", $word)){ // في حالة احتواء الكلمة على الكلمة المفتاحية
                      array_push($suggestions ,$word); // اضافتها الى مصفوفة الاقتراحات
                     }
                  }

                  return $suggestions;
              }

              $suggestions = [];

              foreach($searchRslt as $result){
                  
                  $suggestions = array_merge( $suggestions , getMatchedWordsFromString($result ,$search) );
              print_r($suggestions);
              }

              

                  //foreach ($searchRslt as  $value) {
                  echo "</div>";
          }else{
               echo "<div class='close-search-div'>";
               echo "<img class='close-search' src='layout/images/close.png'>";
               echo "</div>";
               echo "<div class='show-search'>No results</div>";
          }


        
      }

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 2 ساعات قال Our World عالمنا:

هناك مشكلة في الكود ورسالة الخطأ هي:

Warning: explode() expects parameter 2 to be string, array given in

وترتب عليه خطأ اخر هو

Warning: Invalid argument supplied for foreach() in

الكود كاملا:


if (isset($_GET['sentSearch']) && isset($_GET['country'])  ) {

          $search= $_GET['sentSearch'];
          $country= $_GET['country'];

          $stmt3=$conn->prepare(" SELECT * FROM  items
            WHERE (CONVERT(NAME USING utf8) LIKE '%$search%' 
                OR CONVERT(description2 USING utf8) LIKE '%$search%')

             and country_id=? ORDER BY  item_id  DESC LIMIT 8");
          $stmt3->execute(array($country));
          $searchRslt=$stmt3->fetchAll();
         

          


          
          if (!empty($searchRslt)) {
           
                echo "<div class='close-search-div'>";
                echo "<img class='close-search' src='layout/images/close.png'>";
                echo "</div>";
                echo "<div class='show-search'><span>These signs contain your search words </span>";
                            
               function getMatchedWordsFromString($result ,$search)
              {
                  $words = explode(' ',$result); // توزيع كلمات العنوان في مصفوفة
                  
                  // البحث عن الجزء المبحوث عنه في كل كلمة من كلمات العنوان
                  $suggestions = [];
                  foreach($words as $word){
                     if(preg_match("/{$search}/i", $word)){ // في حالة احتواء الكلمة على الكلمة المفتاحية
                      array_push($suggestions ,$word); // اضافتها الى مصفوفة الاقتراحات
                     }
                  }

                  return $suggestions;
              }

              $suggestions = [];

              foreach($searchRslt as $result){
                  
                  $suggestions = array_merge( $suggestions , getMatchedWordsFromString($result ,$search) );
              print_r($suggestions);
              }

              

                  //foreach ($searchRslt as  $value) {
                  echo "</div>";
          }else{
               echo "<div class='close-search-div'>";
               echo "<img class='close-search' src='layout/images/close.png'>";
               echo "</div>";
               echo "<div class='show-search'>No results</div>";
          }


        
      }

 

يعني الخطأ انك تستعمل الوظيفة explode بشكل خاطئ. 

لاحظ اين يتم وصف هاته الوظيفة:

function getMatchedWordsFromString($result ,$search)
{
                  $words = explode(' ',$result); // توزيع كلمات العنوان في مصفوفة
                  
                  // البحث عن الجزء المبحوث عنه في كل كلمة من كلمات العنوان
                  $suggestions = [];
                  foreach($words as $word){
                     if(preg_match("/{$search}/i", $word)){ // في حالة احتواء الكلمة على الكلمة المفتاحية
                      array_push($suggestions ,$word); // اضافتها الى مصفوفة الاقتراحات
                     }
                  }

                  return $suggestions;
}

اين اننا نقوم بتوزيع كلمات العنوان في مصفوفة. هل نمرر سلسلة نصية الى الوظيفة getMatchedWordsFromString كمعامل ثان بالفعل؟ اين نقوم بذلك؟ هنا:

foreach($searchRslt as $result){
                  
  $suggestions = array_merge( $suggestions , getMatchedWordsFromString($result ,$search) );
  print_r($suggestions);
}

هل result القادمة من حلقة foreach التي نمررها الى وظيفتنا سلسلة نصية؟

تأكد من ذلك

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 23 دقائق مضت قال Adnane Kadri:

يعني الخطأ انك تستعمل الوظيفة explode بشكل خاطئ. 

لاحظ اين يتم وصف هاته الوظيفة:


function getMatchedWordsFromString($result ,$search)
{
                  $words = explode(' ',$result); // توزيع كلمات العنوان في مصفوفة
                  
                  // البحث عن الجزء المبحوث عنه في كل كلمة من كلمات العنوان
                  $suggestions = [];
                  foreach($words as $word){
                     if(preg_match("/{$search}/i", $word)){ // في حالة احتواء الكلمة على الكلمة المفتاحية
                      array_push($suggestions ,$word); // اضافتها الى مصفوفة الاقتراحات
                     }
                  }

                  return $suggestions;
}

اين اننا نقوم بتوزيع كلمات العنوان في مصفوفة. هل نمرر سلسلة نصية الى الوظيفة getMatchedWordsFromString كمعامل ثان بالفعل؟ اين نقوم بذلك؟ هنا:


foreach($searchRslt as $result){
                  
  $suggestions = array_merge( $suggestions , getMatchedWordsFromString($result ,$search) );
  print_r($suggestions);
}

هل result القادمة من حلقة foreach التي نمررها الى وظيفتنا سلسلة نصية؟

تأكد من ذلك

ليست سلسلة نصية والدليل ان البرنامج يصفها بذلك. ما رأيك؟ انا ارسلت الكود كاملا.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 3 دقائق مضت قال Our World عالمنا:

ليست سلسلة نصية والدليل ان البرنامج يصفها بذلك. ما رأيك؟ انا ارسلت الكود كاملا.

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

راجع الاجابة المرفقة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 9 ساعات قال Adnane Kadri:

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

راجع الاجابة المرفقة.

تداركت الخطأ ؛ وبعد تطبيق الكود التالي :

function getMatchedWordsFromString($result ,$search)
              {
                  $words = explode(' ',$result); // توزيع كلمات العنوان في مصفوفة
                  
                  // البحث عن الجزء المبحوث عنه في كل كلمة من كلمات العنوان
                  $suggestions = [];
                  foreach($words as $word){
                     if(preg_match("/{$search}/i", $word)){ // في حالة احتواء الكلمة على الكلمة المفتاحية
                      array_push($suggestions ,$word); // اضافتها الى مصفوفة الاقتراحات
                     }
                  }

                  return $suggestions;
              }

              $suggestions = [];

              foreach($searchRslt as $result){
                 
                $words = explode(' ',$result);

                  foreach ($words as $word) {

                    if(preg_match("/{$search}/i", $word)){
                     array_push($suggestions, $word);
                     $res=join(' ',$suggestions);
                     ?><span class='spanSearch'><?php print_r ($res).'<br>';?></span><?php
                    }//preg_match

                }//foreach ($words as $word)
            } //foreach($searchRslt as $result)
 

البحث يكون بخصوص كلمات فى العنوان ؛ فاذا كان العنوان:

flash memory from japan

عند كتابة حرف m  فى صندوق البحث ؛ تكون النتيجة:

 

memory

memory from

memory from memory

memory from memory from

 

كيف يتم تدارك هذا الخطأ؟ بحيث تكون النتيجة هكذا فقط:

memory

from

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...