![]() |
|
كيف يتم اظهار سجلات جدول فقط تلك التي تحتوي على اسم المستخدم ؟؟ - نسخة قابلة للطباعة +- منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب (http://vb4arb.com/vb) +-- قسم : قسم برمجة وتطوير المواقع (http://vb4arb.com/vb/forumdisplay.php?fid=51) +--- قسم : قسم PHP (http://vb4arb.com/vb/forumdisplay.php?fid=58) +--- الموضوع : كيف يتم اظهار سجلات جدول فقط تلك التي تحتوي على اسم المستخدم ؟؟ (/showthread.php?tid=26914) |
كيف يتم اظهار سجلات جدول فقط تلك التي تحتوي على اسم المستخدم ؟؟ - sandanet - 13-10-18 السلام عليكم ورحمة الله وبركاته عندي جدول بيانات اسمه docs وفيه حقول كما هو مبين في الصورة [attachment=19830] عندما يقوم المستخدم بتسجيل دخوله فإن المتغير $user يخزن اسمه على سبيل المثال الاسم Peter السؤال هو كيفية جعل الجدول يظهر له السجلات التي تحتوي على اسمه فقط ، يعني اظهار السجلات التي فيها حقل users يحتوي على اسم المستخدم الداخل الى الصفحة والذي اسمه مخزن في المتغير $user أنا حاولت عمل استعلام كالتالي لكن للأسف لم يجدي نفعاً PHP كود : $q="SELECT * FROM docs WHERE docs_name != '' AND $user IN ('join(',',users)')";ارجو المساعدة في ذلك .. ولكم مني جزيل الشكر RE: كيف يتم اظهار سجلات جدول فقط تلك التي تحتوي على اسم المستخدم ؟؟ - محمد كريّم - 13-10-18 كود : WHERE `users` LIKE '%{$user}%'RE: كيف يتم اظهار سجلات جدول فقط تلك التي تحتوي على اسم المستخدم ؟؟ - sandanet - 13-10-18 شكراً استاذ محمد على الحل الذي طرحته لكنه يأتي حتى بالصفوف التي تحتوي على جزء من الاسم مثلاً لو اعتبرنا قيمة المتغير = Peter فإن الشرط السابق سوف يجلب اي سطر فيه اسم Peter يعني انه سيجلب 3 اسطر من الجدول السابق وهذا بالطبع غير صحيح فالاسم Peter لوحده ليس مثل Peter Filipe يعني المفروض لايتم احتساب الصف الثاني RE: كيف يتم اظهار سجلات جدول فقط تلك التي تحتوي على اسم المستخدم ؟؟ - الكاتب - 14-10-18 السلام عليكم ورحمة الله الاخ sandanet طريقة الادخال للبيانات ومعالجتها و( الاستعلامات ) لديك يفضل تغييرها وذلك 1 - لديك خطأ منطقي ما الحكمة لأستخدام اكثر من يوزر في حقل واحد وعند الدخول يضهر له باقي اليوزرات المرتبطه بالمتغير $user 2 - لنفرض تم دخول Peter ولديه اليوزرات التالية ( Thomas brad , Richter David , Peter) سيذهب Peter الى users ويقوله عطني اليوزرات بتاعي هيقوله users الله هو انا عارف اليوزرات بتاعك ايه هيقوله Peter بص حضرتك اديني الي معايا بالحقل بتاعي ! هــيرد عليه users بص حضرتك لحسن متبوظنيش ولا بوضكش انهم انت الاول ولا التاني ولا الاخير ! هيرد عليه Peter انا الاخير ياعم هيقول users خذ ياعم ! كود : SELECT * FROM docs WHERE docs_name != '' && users LIKE '%_Peter'ولو تم تغيير مكان Peter بالحقل تضطر في كل مره تغيير الاستعلام يعني هذا Peter ,Thomas brad , Richter David ليس كهذا Thomas brad , Richter David , Peter ولو تم تسجيل Peter اخر بحقل اخر مثل ( Lito William , Peter , David Mortensen ) تضطر تغير الاستعلام إلى : كود : SELECT * FROM docs WHERE docs_name != '' && users LIKE '%_Peter_%' حدث لدينا فيض وتخرج لنا احتمالات مالا نهاية : كود : العضو اخر اعضاء الحقللماذا هذا المنطق هتخرج لك مشاكل في الاستعلامات مستقبلا مشاكل ..............الخ افضل طريقة لك من ناحية الحماية والدخول الامن استخدم --رقم معرف-- number مرتبط بجميع عمليات الدخول للموقع واضافة اليوزرات ذات العلاقة ! --حقل رئيسي-- docs_name --اسم المستخدم-- Peter من الناحية التنظيمية هذا امن لك ^ php & mysql كود : <?phptable كود : CREATE TABLE `docs` (جمال التنظيم وروعته PHP كود : <?phpRE: كيف يتم اظهار سجلات جدول فقط تلك التي تحتوي على اسم المستخدم ؟؟ - sandanet - 14-10-18 اشكرك جزيل الشكر استاذي الفاضل الكاتب على هذا التوضيح والحمد لله تمكنت من حل المشكلة لكن دعني اوضح فكرة البرنامج لدي ولماذا قمت بعمل الجدول بهذا الشكل اولاً الفكرة تتلخص بعملية رفع ملفات واعطاء تصريح لاشخاص معينين بالاطلاع عليها .. عملية رفع الملفات تتم عن طريق المدير حيث يختار مجموعة مستندات ومن ثم يعطي عنوان ما لمجموعة الملفات هذه وبعدها يختار اشخاص معينين من القائمة ليكون لديهم حق الاطلاع على تلك الملفات في حال قاموا بتسجيل الدخول لذلك الجدول سيكون شكله كما ارفقته في اول مشاركة والحمد لله تمكنت من ادراج البيانات بذلك الشكل فكما تلاحظ يوجد اسم الملف الذي تم رفعه (قمت بازالة العنوان فقط للتسهيل) وبجانبه الاشخاص الذين اختارهم المدير للاطلاع على هذا الملف ثانياً بعدما يسجل احد هؤلاء الاشخاص دخوله فان فإن المتغير السابق سوف يخزن اسمه ومن ثم تتم فلترة الجدول لاظهار الصفوف التي فيها اسم هذا الشخص فقط لكي يطلع على الملفات التي صرحت له من قبل المدير قمت بعمل استعلام كالتالي "SELECT * FROM docs WHERE users LIKE '%".$users1."%' وبما ان الشرط في الاستعلام سوف يبحث عن اسم المستخدم بأي جزء من الاسماء وبالتالي سوف يعطي الصفوف التي فيها اسم Peter وهما صفين فقط بالاضافة الى Peter Filipe وهو صف واحد طبعاً Peter Filipe ليس نفسه Peter ولايجب ظهور ملفاته لـ Peter لذلك عدلت المتغير &user باضافة فاصلة للمتغير كالتالي $users1 = trim($users) . "," بالتالي سيكون اسم المستخدم المخزن هو Peter, وهو نفس الموجود في الجدول بينما Peter Filip لايحتوي على فاصلة بعد الاسم الأول وبذلك تم حل المشكلة بنجاح ^_^ RE: كيف يتم اظهار سجلات جدول فقط تلك التي تحتوي على اسم المستخدم ؟؟ - عبدالله الدوسري - 14-10-18 بالإضافة لما ذكروه الأخوان هذة طريقة أخرى : PHP كود : SELECT * FROM docs WHERE docs_name != '' AND FIND_IN_SET('Peter', REPLACE(users, ', ', ',')) > 0; وإذا أحببت أن تجرب جملة الإستعلام من على هذا الرابط , https://sqltest.net/#299452 يوجد زر في الأسفل ( Execute SQL ) RE: كيف يتم اظهار سجلات جدول فقط تلك التي تحتوي على اسم المستخدم ؟؟ - محمد كريّم - 14-10-18 كما تفضل الاخ الكاتب وحلل المشكلة في تصميم الملفات اقترحتعديل الجدول او اضافة جدول اخر يدرج فيه الـ users المخولين لعرض الملف ولكن باضافة صف لكل مستخدم مخول لعرض ملف بحيث يحتوي الحقل على مستخدم واحد فقط لضمان سلامة البحث والتعديل وما الى ذلك دون الحاجة الى تحويل محتوى الحقل الى array والبحث عن الفواصل بين الاسماء RE: كيف يتم اظهار سجلات جدول فقط تلك التي تحتوي على اسم المستخدم ؟؟ - sandanet - 14-10-18 ماشاء الله على هذا الحل الجميل المقدم من الاستاذ الدوسري لكن السؤال الذي يطرح نفسه هو هل ان استعمال طريقة الـ REPLACE تبطيء عملية اظهار النتائج ام طريقة LIKE '%".$users1."%' في حال كان عدد السجلات كبير جداً ؟؟ RE: كيف يتم اظهار سجلات جدول فقط تلك التي تحتوي على اسم المستخدم ؟؟ - عبدالله الدوسري - 15-10-18 (14-10-18, 05:52 PM)sandanet كتب : ماشاء الله على هذا الحل الجميل المقدم من الاستاذ الدوسري لكن السؤال الذي يطرح نفسه هو هل ان استعمال طريقة الـ REPLACE تبطيء عملية اظهار النتائج ام طريقة LIKE '%".$users1."%' في حال كان عدد السجلات كبير جداً ؟؟ هذة الطريقة الأكيد أنها ليست الأفضل, إذا كان بالإمكان ( فصل اسماء المستخدمين في جدول منفصل ) ( وجدول آخر يربط المستخدمين بالوثائق المصرحة لهم) فهو أفضل بكثير وهو الحل الأمثل . لكن إذا كان المبرمج مجبر هلى شكل قاعدة البيانات أن تظل كما هي , ما لك إلى أن تستخدم طرق بديلة . REPLACE فقط لأنه يوجد مسافة بعد كل فاصلة بإمكانك الإستغناء عن الأمر REPLACE ولكن يجب أن تظيف مسافة في كلمة لبحث : PHP كود : SELECT * FROM docs WHERE docs_name != '' AND FIND_IN_SET(' Peter', users) > 0; طبعاً إذا تبحث عن ملايين السجلات أكيد ستجد ضعف في الأداء , بسبب إستخدام Function في جملة الإستعلام , وهو أمر غير مستغرب لأنه تصميم القاعدة ليس مهيء لعمل علاقة بين المستخدم والوثيقة. إذا كنت ترى الـ mysql profiler وهو الذي يقوم بتسجيل عمليات التنفيذ على قاعدة البيانات ستجد أن الـ Function يتم إستدعائها في كل سجل مما يعني لو لديك مليون سجل سيتم إستدعائها مليون مرة . RE: كيف يتم اظهار سجلات جدول فقط تلك التي تحتوي على اسم المستخدم ؟؟ - sandanet - 15-10-18 مشكور استاذي الفاضل عبدالله على هذا التوضيح انا بالفعل لدي جدولين واحد خاص باسماء المستخدمين الذين تم تسجيل بياناتهم من قبل المدير وجدول اخر فيه الملفات المرفوعة وكل ملف يرفع يتم تخصيص اشخاص معينين له للإطلاع عليه من قبل المدير كما هو موضح في الجدول في بداية المشاركة لذلك ارتأيت ان تخزن اسماء الاشخاص المصرح لهم برؤية الملف في خانة واحدة تفصل بينهم فاصلة وبما ان عدد الاشخاص الذين سوف يتم تسجيل بياناتهم في جدول المستخدمين لايتجاوز العشرين مستخدم فقط لذلك اتوقع ان لايكون هنالك مشكلة في عملية الفرز لكني اوافقك الرأي في ان استخدام دالة Find_IN_SET قد تكون مرهقة للبرنامج لذلك قررت التعامل مع الطريقة الأخرى وهي LIKE '%".$users1."%' |