تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
كيف يتم اظهار سجلات جدول فقط تلك التي تحتوي على اسم المستخدم ؟؟
#1
السلام عليكم ورحمة الله وبركاته 

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

   

عندما يقوم المستخدم بتسجيل دخوله فإن المتغير $user يخزن اسمه على سبيل المثال الاسم Peter


السؤال هو كيفية جعل الجدول يظهر له السجلات التي تحتوي على اسمه فقط ، يعني اظهار السجلات التي فيها حقل users يحتوي على اسم المستخدم الداخل الى الصفحة والذي اسمه مخزن في المتغير $user 

أنا حاولت عمل استعلام كالتالي لكن للأسف لم يجدي نفعاً

PHP كود :
$q="SELECT * FROM docs WHERE docs_name != '' AND $user IN ('join(',',users)')";
$row=mysqli_query($db,$q); 

ارجو المساعدة في ذلك .. ولكم مني جزيل الشكر
الرد
تم الشكر بواسطة:
#2
كود :
WHERE `users` LIKE '%{$user}%'

الرد
#3
شكراً استاذ محمد على الحل الذي طرحته لكنه يأتي حتى بالصفوف التي تحتوي على جزء من الاسم  مثلاً لو اعتبرنا قيمة المتغير = Peter 
فإن الشرط السابق سوف يجلب اي سطر فيه اسم Peter  يعني انه سيجلب 3 اسطر من الجدول السابق وهذا بالطبع غير صحيح 

فالاسم Peter لوحده ليس مثل Peter Filipe يعني المفروض لايتم احتساب الصف الثاني
الرد
تم الشكر بواسطة: محمد كريّم
#4
السلام عليكم ورحمة الله
الاخ sandanet
طريقة الادخال للبيانات ومعالجتها و( الاستعلامات ) لديك يفضل تغييرها وذلك
1 - لديك خطأ منطقي ما الحكمة لأستخدام اكثر من يوزر في حقل واحد وعند الدخول يضهر له باقي اليوزرات المرتبطه بالمتغير $user
2 - لنفرض تم دخول Peter ولديه اليوزرات التالية ( Thomas brad , Richter David , Peter)  Dodgy
سيذهب Peter الى users ويقوله عطني اليوزرات بتاعي هيقوله users الله هو انا عارف اليوزرات بتاعك ايه  Huh
هيقوله 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_%'  
[/code]

حدث لدينا فيض وتخرج لنا احتمالات مالا نهاية :

كود :
العضو اخر اعضاء الحقل
" SELECT * FROM docs WHERE docs_name != '' && users LIKE  '%_".$user."' "

العضو متواجد بمنتصف الاعضاء
" SELECT * FROM docs WHERE docs_name != '' && users LIKE  '%_".$user."_%' "


لماذا هذا المنطق هتخرج لك مشاكل في الاستعلامات مستقبلا مشاكل ..............الخ

افضل طريقة لك من ناحية الحماية والدخول الامن استخدم
--رقم معرف-- number مرتبط بجميع عمليات الدخول للموقع واضافة اليوزرات ذات العلاقة !
--حقل رئيسي-- docs_name
--اسم المستخدم-- Peter

من الناحية التنظيمية هذا امن لك ^

php  &   mysql

كود :
<?php

$Connection = mysqli_connect("127.0.0.1","root","pws","db");
$number = 1;
$query = mysqli_query($Connection ," SELECT * FROM docs WHERE docs_name != '' && number =  '".$number."' ");
while ($row = mysqli_fetch_array($query))
{
   $userlike = $row['users'];
   echo "<br/>";
   echo $userlike;
 }
?>


table

كود :
CREATE TABLE `docs` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`number` INT(11) NOT NULL DEFAULT '0',
`docs_name` VARCHAR(50) NOT NULL DEFAULT '0',
`users` VARCHAR(50) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=4
;


جمال التنظيم وروعته  Heart

PHP كود :
<?php
$docs 
= array(
 array(
 
"id" => 1,
 
"number" => 1,
 
"docs_name" => "doc1",
 
"users" => "Peter",
 ),
 array(
 
"id" => 2,
 
"number" => 2,
 
"docs_name" => "doc2",
 
"users" => " Ricardo William",
 ),
 array(
 
"id" => 4,
 
"number" => 1,
 
"docs_name" => "doc1",
 
"users" => "Thomas brad",
 ),
 array(
 
"id" => 6,
 
"number" => 2,
 
"docs_name" => "doc2",
 
"users" => "Peter Filip",
 ),
 array(
 
"id" => 7,
 
"number" => 2,
 
"docs_name" => "doc2",
 
"users" => " Mark Andrew",
 ),
 array(
 
"id" => 3,
 
"number" => 3,
 
"docs_name" => "doc3",
 
"users" => " David Mortensen",
 ),
 array(
 
"id" => 9,
 
"number" => 3,
 
"docs_name" => "doc3",
 
"users" => " Peter",
 ),
 array(
 
"id" => 8,
 
"number" => 3,
 
"docs_name" => "doc3",
 
"users" => "Lito William",
 ),
 array(
 
"id" => 5,
 
"number" => 1,
 
"docs_name" => "doc1",
 
"users" => "Richter David",
 ),
);
?>
الرد
تم الشكر بواسطة: عبدالله الدوسري , rnmr , محمد كريّم
#5
اشكرك جزيل الشكر استاذي الفاضل الكاتب على هذا التوضيح والحمد لله تمكنت من حل المشكلة لكن دعني اوضح فكرة البرنامج لدي ولماذا قمت بعمل الجدول بهذا الشكل
اولاً الفكرة تتلخص بعملية رفع ملفات واعطاء تصريح لاشخاص معينين بالاطلاع عليها .. عملية رفع الملفات تتم عن طريق المدير حيث يختار مجموعة مستندات ومن ثم يعطي عنوان ما لمجموعة الملفات هذه وبعدها يختار اشخاص معينين من القائمة ليكون لديهم حق الاطلاع على تلك الملفات في حال قاموا بتسجيل الدخول 
لذلك الجدول سيكون شكله كما ارفقته في اول مشاركة والحمد لله تمكنت من ادراج البيانات بذلك الشكل فكما تلاحظ يوجد اسم الملف الذي تم رفعه (قمت بازالة العنوان فقط للتسهيل) وبجانبه الاشخاص الذين اختارهم المدير للاطلاع على هذا الملف

ثانياً بعدما يسجل احد هؤلاء الاشخاص دخوله فان فإن المتغير السابق سوف يخزن اسمه ومن ثم تتم فلترة الجدول لاظهار الصفوف التي فيها اسم هذا الشخص فقط لكي يطلع على الملفات التي صرحت له من قبل المدير 

قمت بعمل استعلام كالتالي 

"SELECT * FROM docs WHERE users LIKE '%".$users1."%'

وبما ان الشرط في الاستعلام سوف يبحث عن اسم المستخدم بأي جزء من الاسماء وبالتالي سوف يعطي الصفوف التي فيها اسم Peter وهما صفين فقط بالاضافة الى Peter Filipe وهو صف واحد 

طبعاً  Peter Filipe ليس نفسه Peter ولايجب ظهور ملفاته لـ Peter لذلك عدلت المتغير &user  باضافة فاصلة للمتغير كالتالي $users1 = trim($users) . "," 
بالتالي سيكون اسم المستخدم المخزن هو Peter, وهو نفس الموجود في الجدول بينما Peter Filip لايحتوي على فاصلة بعد الاسم الأول وبذلك تم حل المشكلة بنجاح ^_^
الرد
تم الشكر بواسطة:
#6
بالإضافة لما ذكروه الأخوان 
هذة طريقة أخرى :
PHP كود :
SELECT FROM docs WHERE docs_name != '' AND FIND_IN_SET('Peter'REPLACE(users', '',')) > 0

وإذا أحببت أن تجرب جملة الإستعلام من على هذا الرابط , 
https://sqltest.net/#299452
يوجد زر في الأسفل ( Execute SQL )
الرد
تم الشكر بواسطة: rnmr , محمد كريّم
#7
كما تفضل الاخ الكاتب وحلل المشكلة في تصميم الملفات
اقترحتعديل الجدول او اضافة جدول اخر يدرج فيه الـ users المخولين لعرض الملف ولكن باضافة صف لكل مستخدم مخول لعرض ملف
بحيث يحتوي الحقل على مستخدم واحد فقط لضمان سلامة البحث والتعديل وما الى ذلك دون الحاجة الى تحويل محتوى الحقل الى array والبحث عن الفواصل بين الاسماء

الرد
#8
ماشاء الله على هذا الحل الجميل المقدم من الاستاذ الدوسري لكن السؤال الذي يطرح نفسه هو هل ان استعمال طريقة الـ REPLACE تبطيء عملية اظهار النتائج ام طريقة LIKE '%".$users1."%' في حال كان عدد السجلات كبير جداً ؟؟
الرد
تم الشكر بواسطة:
#9
(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
https://sqltest.net/#300420

طبعاً إذا تبحث عن ملايين السجلات أكيد ستجد ضعف في الأداء , بسبب إستخدام Function في جملة الإستعلام ,  وهو أمر غير مستغرب لأنه تصميم القاعدة ليس مهيء لعمل علاقة بين المستخدم والوثيقة.

إذا كنت ترى الـ mysql profiler وهو الذي يقوم بتسجيل عمليات التنفيذ على قاعدة البيانات
ستجد أن الـ Function يتم إستدعائها في كل سجل مما يعني لو لديك مليون سجل سيتم إستدعائها مليون مرة .
الرد
تم الشكر بواسطة: rnmr
#10
مشكور استاذي الفاضل عبدالله على هذا التوضيح انا بالفعل لدي جدولين واحد خاص باسماء المستخدمين الذين تم تسجيل بياناتهم من قبل المدير وجدول اخر فيه الملفات المرفوعة وكل ملف يرفع يتم تخصيص اشخاص معينين له للإطلاع عليه من قبل المدير كما هو موضح في الجدول في بداية المشاركة

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

لكني اوافقك الرأي في ان استخدام دالة Find_IN_SET قد تكون مرهقة للبرنامج لذلك قررت التعامل مع الطريقة الأخرى وهي LIKE '%".$users1."%'
الرد
تم الشكر بواسطة:


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم