[سؤال PHP - SQL] كيف يمكن حل مشكلة البحث عن حرف الالف في قاعدة البيانات

لم ادري كيف علي ان اكتب وصف المشكلة في العنوان فهي تحتاج الى قليل من الشرح

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

المشكلة:

في دالة البحث الخاصة بي استخدم LIKE لاستخراج ما يشبه كلمات البحث من قاعدة البيانات... هذا يضعني في مشكلة لم استطع حلها "لقلة خبرتي في اللغة اولاً، ولانني لم اجد مشابها لها باللغة الانجليزية فابحث عنه ثانيا"

حرف الالف في اللغة العربية له عدة اشكال: أ - إ - ا - آ

المشكلة ان البحث يأخذ عبارة البحث حرفيا:

  • مثلا عند كتابة ألف سيتم البحث عن كلمة ألف بـ: أ

  • عند كتابة آلف سيتم البحث عن كلمة آلف بـ: آ

وهكذا بباقي اشكال حرف الالف

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

لذلك ابحث عن طريقة، عندما يبحث المستخدم عن أ مثلا... يعرض له النتائج المتضمنة ل آ و إ و ا

ونفس الامر ينطبق ايضا على ال ي - ى وال ه - ة

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

أنت تعرف أنّ الحرفين أ وا هما في النهاية ألف، لكن PHP، SQL، JS، C# .. لن تعرف هذا هما في الحاسوب حرفان مختلفان في اليونيكود حرف ا هو النقطة 0627 وأ هو النقطة 0623، الحاسوب يراهما "شيئان مختلفان"؛ كالفرق بين الباء والألف!، ماذا عن الحلول الممكنة؟ -إن لم تفهم أي حل أخبرني أضع لك مثالًا برمجيًا-:

  1. توقع العمليات الممكنة: اِصنع مصفوفة ضع بداخلها أشكال الألف الممكنة يبحث المستخدم عن الف توقع ألف، إلف، الف، آلف، يبحث المستخدم عن احمد، توقع أيضًا أحمد، إحمد، آحمد، وMySqL تدعم تعدد الحالات في البحث، ولستُ متأكدًا عن دعم الـUnicode Ranges.

مميزات هذا الحل: سهل وبسيط.

عيوبه: قبيح وطويل.

  1. استخدم الألف بدون أي زوائد في ا، ثم ضع الهمزة الزائدة 0654 بعد الحرف ليكون الشكل النهائي أ لكن الألف هي ا+همزة، تجد جميع الرموز العربية هنا:

وفي حالة ما كانت الألف وحدها ضع بعدها رمزًا ليس له معنى أنصحك بـالحرف FFFD(بالنظام الستُ عشري) في اليونيكود لتكون الألف دائمًا ا+النوع، وعند البحث دائمًا ما سيكون هنالك حرفٌ بعد الألف لذا ضع %، وعند البحث ستتساوى "إستخدام" مع "استخدام" لأن الألف واحدة

مميزات هذا الحل: حل أكثر عملية من السابق.

عيوبه: سيء في استخدام الذاكرة الألف ستكون أربعة بايت بدلًا من إثنين في UTF8.

  1. استخدم آية سبل: عند إدخال البيانات إلى قاعدة البيانات استخدم تصحيحات آيةسبل، يدخل المستخدم إستخدام ستكون استخدام وعند البحث كذلك.

عيوبه: حل طويل وهنالك الكثير من الخلط قد يحدث، ليس له مميزات سوى تسهيل البحث بعملية واحدة

حلول أخرى أسوأ:

  1. تحويل جميع أحرف الألف إلى ا ثم البحث، أتوقع يمكن القيام بهذا بـSQL؛ سيأخذ بعض الوقت كتابة هكذا حل، هو الأفضل كتابيًا شيفرة البحث منفصلة في شيفرة SQL؛ لكن بالنسبة للسرعة لا أتوقع أن التحويل+التحليل للبحث سيكون سريعًا.

  2. احتفظ بنسخة للعرض، ونسخة للبحث بها الألف ا فقط، وة والهاء حرفٌ واحد أبسط الحلول ..

ما اقوم به حاليا هو احد الحلول التي ذكرتها... اعتمد الالف الغير مهموزة في كل مدخلات قاعدة البيانات

ما فكرت به منذ قليل وبعد قراءة ردك هو استخدام ال%

اي عندما يدخل احدهم كلمة البحث يقوم الكود بالبحث عن انواع الالف ويستبدلها كلها ب % ثم يبحث

غالبا سيعطي النتائج الصحيحة كون قاعدة البيانات لا تزال صغيرة... مستقبلا قد تشكل مشكلة ولكن ليس بذلك السوء

جرب استعمال stored procedure

ضع واحدة تقوم بالفلترة ووضع كل الاحتمالات الممكنة

قم بتمرير المدخل اولاُ ل

, ثانياُ قم بأستخادم القيمة معى REGEXP في mysql

$find = arquery("أحمد") ;
'SELECT * FROM `users` WHERE `username`  REGEXP '$find

حل مثالي و رائع,, شكراً جزيلاً لك ahmad

من الحلول

1- عندما يقوم المستخدم بالبحث قم باختبار كلمة البحث فإذا كانت تحتوى على (أ، ه،ي) انشئ مصفوفة مثلا بها جميع الحالات [أحمد، احمد ،آحمد ] عن طريق string replacement أو regular expression ثم ابحث عن كل المصفوفة مثلا

LIKE 'أحمد' or 'احمد ' or 'آحمد '

2- يمكنك عمل sql function تقوم بحساب minimum edit distance وهى طريقة لحساب عدد الاختلافات بين نصين فمثلا الاختلاف بين (أحمد) و (احمد ) يساوى 1 وهو حرف الألف ثم ابحث فى قاعدة البيانات باستخدام هذه function وليس LIKE .... من أشهر الخوازرميات لحساب الأختلافات levenshtein edit distance

بالإضافة الى همزة الألف يوجد حرف الواصـــــــــــــــــــــــــــــــــــــــــــــــــــــلة وَٱلْحَرَكَاْتُ ...

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

.. تستطيع البحث عن نفس المشكلة في الأحرف اللاتينية إرجاع e عند البحث عن è é ê ë لا بد من ان هناك شيء يشبه الـ regx يستخدم داخل الاجرائات المخزنة.

فما هو رأيك أخ هادي hade.alahmad1

اعتقد انني سالتزم بخطة استبدال الاحرف المتشابهة ب % ... لن يؤثر شلك على النتائج اطلاقا بعد التفكير في الموضوع مليا

السلام أخي تستطيع إستعمال طريقة

Autocomplete في خانة البحث

أي عند يكتب مستخدم آحمد فهو سوف يقدم له خيار أحمد بدلاً له

أو يضع تنبيها للمستخدمين أن الهمزة ليست هي ألف الوصل...

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

الدفع أسهل من الرفع..

أخي

ونفس الامر ينطبق ايضا على ال ي - ى وال ه - ة

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

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

أظن هذا قريبا مما عند الأعاجم لكنهم يسمونه Case sensitive

ربما هذا الموضوع يصلح كتدريب على البحث المخصص في قواعد البيانات أو باستعمال لغات البرمجة لا أكثر..