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

السؤال

نشر

السلام عليكم اخواني الاعزاء

أولا - لدي كود يستدعي الرسائل الواردة للعضو من قاعدة البيانات

<?php
$stmt = $db->prepare('SELECT * FROM messages WHERE recipient_id = ? Order By id desc');
$stmt->bind_param('i', $_SESSION['id']);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) 
{
echo '<div class="div_messages"><a href="index.php?to='.$row['sender_id'].'"> تم استلام رسالة من  <br />'.$row['sender_name'].'<br />'.$row['date'].'</a></div>' ;
}
$stmt->close();
?>

طبعا

$sender_id=$_SESSION['id'];
$recipient_id=$_GET['to'];

لكن الكود يظهر جميع الرسائل فمثلا لو ان هناك 50 رسالة من العضو A  سوف تظهر كلها فهل هناك طريقة لاظهار اخر رسالة فقط للعضو مثلا  العضو A  وأحدث رسالة فقط للعضو B  وهكذا على ان ترتب الأحدث اولا لكل عضو ارسل رسالة

ثانيا -الكود الثاني يعرض الرسائل

<?php
$stmt = $db->prepare('SELECT * FROM messages WHERE recipient_id = ? AND sender_id =? Order By id desc');
$stmt->bind_param('ii', $_SESSION['id'], $_GET['to']);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) 
{

echo '<div class="div_messages">'.$row['sender_name'].'<br />'.$row['date'].'<br />'.$row['message'].'</div>' ;  
}
$stmt->close();
?>

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

سؤال اخير كيف يتم اظهار ان العضو اونلاين او اوفلاين وكيف يتم عمل تنبيه عندما يتم وصول رسالة كما فى هذا الموقع

p_19012h01c1.png

Recommended Posts

  • 1
نشر

في هذا الكود ابسط طريقة وهي إذا لا تريد أحداث تغييرات في الكود يمكنك إضافة limit.

<?php
$stmt = $db->prepare('SELECT * FROM messages WHERE recipient_id = ? Order By id desc');
$stmt->bind_param('i', $_SESSION['id']);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) 
{
echo '<div class="div_messages"><a href="index.php?to='.$row['sender_id'].'"> تم استلام رسالة من  <br />'.$row['sender_name'].'<br />'.$row['date'].'</a></div>' ;
}
$stmt->close();
?>

يصبح 

<?php
$stmt = $db->prepare('SELECT * FROM messages WHERE recipient_id = ? Order By id desc limit 1');
$stmt->bind_param('i', $_SESSION['id']);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) 
{
echo '<div class="div_messages"><a href="index.php?to='.$row['sender_id'].'"> تم استلام رسالة من  <br />'.$row['sender_name'].'<br />'.$row['date'].'</a></div>' ;
}
$stmt->close();
?>

في الكود الثاني ممكن تغيير الشرط بحيث يصبح OR و ليس And . ولكن يتم التحديد ومساعدتك بشكل أفضل إذا أرفقت مجلد المشروع كاملا.

اقتباس

سؤال اخير كيف يتم اظهار ان العضو اونلاين او اوفلاين وكيف يتم عمل تنبيه عندما يتم وصول رسالة كما فى هذا الموقع

هنا يتم استخدام ajax لجلب البيانات بدون تحديث الصفحة. بحيث تقوم بكتابة كود PHP يرجع قيمة عدد الاشعارات بصيغة json و من ثم استخدام ajax لجلب القيمة بدون تحديث للصفحة.

  • 0
نشر

اخي @بلال زيادة استخدام limit 1  سوف يعرض اخر رسالة فى الجدول كله انا اريد اخر رسالة للعضو فقط نفترض ان اكثر من عضو ارسلو رسائل اريد ان تظهر اخر رسالة فقط للعضو الاول ثم اخر رسالة للعضو الثانى والعضو الذي يرسل اخر رسالة يظهر فى بداية القائمة

سوف استخرج لك الاكواد واحملها كاملة ان شاء الله

  • 1
نشر
بتاريخ 34 دقائق مضت قال Hamada Ahmed:

اخي @بلال زيادة استخدام limit 1  سوف يعرض اخر رسالة فى الجدول كله انا اريد اخر رسالة للعضو فقط نفترض ان اكثر من عضو ارسلو رسائل اريد ان تظهر اخر رسالة فقط للعضو الاول ثم اخر رسالة للعضو الثانى والعضو الذي يرسل اخر رسالة يظهر فى بداية القائمة

سوف استخرج لك الاكواد واحملها كاملة ان شاء الله

هنا يجب استخدام inner join كي تستطيع جلب أخر رسالة لكل عضو فمثلا: 

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

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

SELECT m.msg, u.name FROM messages m INNER JOIN users u ON m.recipient_id  = u.id

فلاحظ أننا استخدمنا اسماء مستعارة للجداول فجدول users قمنا بإعطائه الاسم المستعار u و جدول messages قمنا بإعطائه الاسم المستعار m و قمنا في الاستعلام السابق بجلب نص الرسالة مع اسم العضو الذي قام بارسالها وقمنا بالتعويض عن اسم الجدول باسمه المستعار.

  • 0
نشر
بتاريخ 3 ساعات قال بلال زيادة:

هنا يجب استخدام inner join كي تستطيع جلب أخر رسالة لكل عضو فمثلا: 


SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

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


SELECT m.msg, u.name FROM messages m INNER JOIN users u ON m.recipient_id  = u.id

فلاحظ أننا استخدمنا اسماء مستعارة للجداول فجدول users قمنا بإعطائه الاسم المستعار u و جدول messages قمنا بإعطائه الاسم المستعار m و قمنا في الاستعلام السابق بجلب نص الرسالة مع اسم العضو الذي قام بارسالها وقمنا بالتعويض عن اسم الجدول باسمه المستعار.

هذا فولدر مبسط للمشروع بدون تنسيقات

script.rar

  • 1
نشر

الحل الأفضل هو عمل جدول خاص بالمحادثات (يحوي على id_user1 & id_user2) مع معرفآخر رسالة مشتركة مثلا بالإضافة لوضع معرف المحادثة في جدول الرسائل عند كل رسالة مشتركة بينهما، أي وضع معرّف خاص لكل محادثة كحقل إضافي في جدول الرسائل messages مثلا ..

ثم يتم الاستعلام بعمل group by عن طريق معرّف المحادثة و جلب آخر رسالة، أو استخدام الكلمة المفتاحية distinct على جدول الرسائل وتمرير حقل المحادثة ليتم جلب الرسالة الأخيرة من كل محادثة مختلفة.

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

_____________________________________________

أو يمكنك استخدام الاستعلام التالي:

select m.*
from
  messages m inner join (
    select
      least(sender_ID, receiver_ID) as user_1,
      greatest(sender_ID, receiver_ID) as user_2,
      max(ID) as last_id,
      max(timestamp) as last_timestamp
    from
      messages
    group by
      least(sender_ID, receiver_ID),
      greatest(sender_ID, receiver_ID)
  ) s on least(sender_id, receiver_id)=user_1
         and greatest(sender_id, receiver_id)=user_2
         and m.id = s.last_id -- or last timestamp

 

  • 0
نشر
بتاريخ 8 ساعات قال Wael Aljamal:

الحل الأفضل هو عمل جدول خاص بالمحادثات (يحوي على id_user1 & id_user2) مع معرفآخر رسالة مشتركة مثلا بالإضافة لوضع معرف المحادثة في جدول الرسائل عند كل رسالة مشتركة بينهما، أي وضع معرّف خاص لكل محادثة كحقل إضافي في جدول الرسائل messages مثلا ..

ثم يتم الاستعلام بعمل group by عن طريق معرّف المحادثة و جلب آخر رسالة، أو استخدام الكلمة المفتاحية distinct على جدول الرسائل وتمرير حقل المحادثة ليتم جلب الرسالة الأخيرة من كل محادثة مختلفة.

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

_____________________________________________

أو يمكنك استخدام الاستعلام التالي:


select m.*
from
  messages m inner join (
    select
      least(sender_ID, receiver_ID) as user_1,
      greatest(sender_ID, receiver_ID) as user_2,
      max(ID) as last_id,
      max(timestamp) as last_timestamp
    from
      messages
    group by
      least(sender_ID, receiver_ID),
      greatest(sender_ID, receiver_ID)
  ) s on least(sender_id, receiver_id)=user_1
         and greatest(sender_id, receiver_id)=user_2
         and m.id = s.last_id -- or last timestamp

 

اخى هذا مجلد مبدئي للمشروع هل تتكرم وتنظر فيه لو فية اي اخطاء

script.rar

  • 1
نشر
بتاريخ On 17‏/3‏/2021 at 07:23 قال Hamada Ahmed:

اخى هذا مجلد مبدئي للمشروع هل تتكرم وتنظر فيه لو فية اي اخطاء

script.rar

في ملف index.php قم بتبديل التالي 

SELECT * FROM messages WHERE recipient_id = ? Order By id desc

إلى التالي

SELECT *, u.id,u.username FROM messages m INNER JOIN users u ON m.recipient_id = u.id Order By id desc

 

  • 0
نشر
بتاريخ 20 ساعات قال بلال زيادة:

في ملف index.php قم بتبديل التالي 


SELECT * FROM messages WHERE recipient_id = ? Order By id desc

إلى التالي


SELECT *, u.id,u.username FROM messages m INNER JOIN users u ON m.recipient_id = u.id Order By id desc

 

كيف يمكن تعديله على هذه الطريقة

<?php
$stmt = $db->prepare('SELECT *, u.id,u.username FROM messages m INNER JOIN users u ON m.recipient_id = u.id Order By id desc');
$stmt->bind_param('i', $_SESSION['id']);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc())
{
echo '<div class="div_messages"><a href="index.php?to='.$row['sender_id'].'"> تم استلام رسالة من  <br />'.$row['sender_name'].'<br />'.$row['date'].'</a></div>' ;
}
$stmt->close();
?>

 

  • 1
نشر
بتاريخ On 3/18/2021 at 19:15 قال Hamada Ahmed:

كيف يمكن تعديله على هذه الطريقة


<?php
$stmt = $db->prepare('SELECT *, u.id,u.username FROM messages m INNER JOIN users u ON m.recipient_id = u.id Order By id desc');
$stmt->bind_param('i', $_SESSION['id']);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc())
{
echo '<div class="div_messages"><a href="index.php?to='.$row['sender_id'].'"> تم استلام رسالة من  <br />'.$row['sender_name'].'<br />'.$row['date'].'</a></div>' ;
}
$stmt->close();
?>

 

هل ظهر لك أي رسالة خطأ؟

  • 1
نشر
بتاريخ On 3/20/2021 at 19:15 قال Hamada Ahmed:

الكود بهذه الطريقة توقف عن العمل بشكل كامل يمكنك ان تجرب بنفسك اخى الفاضل @Wael Aljamal

script.rar

يوجد خطأين يسببان مشاكل حاليا؛

index.php 145 وما بعده: التأكد من وجود دليل المصفوفة قبل محاولة قراءة القيمة

  <?php
  if (isset($_GET['to'])){
    $to = intval($_GET['to']);
    include("show.php");
    }
  ?>

show.php  42

$message="";
if (isset($_REQUEST['text'])){
    $$message = $_GET['to'];
}

سأرى موضوع الرسائل 

  • 0
نشر
بتاريخ 2 ساعات قال Wael Aljamal:

يوجد خطأين يسببان مشاكل حاليا؛

index.php 145 وما بعده: التأكد من وجود دليل المصفوفة قبل محاولة قراءة القيمة


  <?php
  if (isset($_GET['to'])){
    $to = intval($_GET['to']);
    include("show.php");
    }
  ?>

show.php  42


$message="";
if (isset($_REQUEST['text'])){
    $$message = $_GET['to'];
}

سأرى موضوع الرسائل 

ما يهمنى هو موضوع الرسائل - كيفية عرض اخر رسالة للعضو فى الشريط العلوي وعرض المحادثة كاملة فى منطقة عرض الرسائل

  • 1
نشر
بتاريخ الآن قال Hamada Ahmed:

ما يهمنى هو موضوع الرسائل - كيفية عرض اخر رسالة للعضو فى الشريط العلوي وعرض المحادثة كاملة فى منطقة عرض الرسائل

مرحبا, 

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

 

  • 1
نشر
بتاريخ On 3/22/2021 at 16:57 قال Hamada Ahmed:

ما يهمنى هو موضوع الرسائل - كيفية عرض اخر رسالة للعضو فى الشريط العلوي وعرض المحادثة كاملة فى منطقة عرض الرسائل

مرحبا، يمكنك استخدام التعليمة بالشكل التالي:

select * FROM messages WHERE recipient_id = 1  GROUP BY sender_id ORDER BY id DESC

سوف يتم تجميع الرسائل حسب المرسل و إعادة الرسالة الأحدث

sql-chat.JPG

  • 0
نشر
بتاريخ On ٢٦‏/٣‏/٢٠٢١ at 22:54 قال Wael Aljamal:

مرحبا، يمكنك استخدام التعليمة بالشكل التالي:


select * FROM messages WHERE recipient_id = 1  GROUP BY sender_id ORDER BY id DESC

سوف يتم تجميع الرسائل حسب المرسل و إعادة الرسالة الأحدث

sql-chat.JPG

نعم قمت بالتجربة

<?php

$stmt = $db->prepare('select * FROM messages WHERE recipient_id = ?  GROUP BY sender_id ORDER BY id DESC');
$stmt->bind_param('i', $_SESSION['id']);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc())
{
echo '<div class="div_messages"><a href="index.php?to='.$row['sender_id'].'"> تم استلام رسالة من  <br />'.$row['sender_name'].'<br />'.$row['date'].'</a></div>' ;
}
$stmt->close();
?>

اما عن مشكلة عرض المحادثة بين العضوين فسوف اطرحة فى موضوع منفصل

شكرا لكم

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...