Показать список личных сообщений - PullRequest
0 голосов
/ 16 декабря 2011

У меня есть система личных сообщений на моем сайте, сделанная просто с помощью php / sql.На самом деле я сталкиваюсь с проблемой отображения их с помощью jquery.БД имеет в качестве полей: message_id, message_from, message_to, message_topic, message_subject и message_status.То, как я показываю message_topic, повторяет восемь раз следующее:

echo '<table><tr><td>';
  retrieve_msg_topic($result);
echo '</td></tr>'; //of course I won't make 8 tables!!!

вызванная функция:

function retrieve_msg_topic($result)
{
   if($row = mysql_fetch_assoc($result))
   {
    echo $row['usernombre'];
    $message_topic = stripslashes($row['message_topic']);

    echo '<div id="msg'.$row['message_id'].'">';
    echo $message_topic;
    echo '</div>';
    //this will return: <div id="msgN">message topic (title, commonly subject)</div>
   }
} //end function retrieve msg topic

Пока у меня есть список в таблице споследние восемь сообщений, отправленных пользователю.Следующая строка зарезервирована для нумерации страниц (следующая / предыдущая страница), а после этого еще одна строка, показывающая сообщение, которое я выбираю из представленного списка, как мы видим в Outlook.Вот моя головная боль.Мой подход заключается в том, чтобы вызывать другую функцию (8 раз) и скрывать их все до тех пор, пока я не нажму на одно из сообщений, например:

echo '<tr><td>';
retrieve_msg_content($result);
retrieve_msg_content($result); //repeat 8 times
echo '</td></tr></table>';

функция на этот раз будет выглядеть примерно так:

function retrieve_msg_content($result)
{
  if($row = mysql_fetch_assoc($result))
  {
  echo '<script type="text/javascript">
        $(document).ready(function(){
        $("#msg'.$row['message_id'].'").click(function(){
           $(".msgs").hide(1000);
           $("#'.$row['message_id'].'").show(1000);
           });
        });
        </script>';

  echo '<div class="msgs" id="'.$row['message_id'].'" style="display: none">'
         .$row['message_subject'].
       '</div>';
  }
   /* This function returns:
   // <script type="text/javascript">
   //   $(document).ready(function(){
   //   $("#msgN").click(function(){
   //   $(".msgs").hide(1000);
   //   $("#N").show(1000);
   //   });
   //   });
   //   </script>
   // <div class="msgs" id="N" style="display: none">Message subject (body of message)</div>
   */
} //end function retrieve msg content/subject

Я мог бы просто объяснить, что проблема в том, что это не работает, и это потому, что я делаю if($row = mysql_fetch_assoc($result)) дважды, так что во второй раз у него больше нет значений!

Другой подход, который у меня был, заключался в том, чтобы вызывать и message_topic, и message_subject в одной и той же функции, но в итоге я получаю своего рода аккордеон, чего я не хочу.

Надеюсь, я достаточно ясен.*

1 Ответ

1 голос
/ 16 декабря 2011

Самый простой способ исправить ваши проблемы - это скопировать результаты запроса MySQL в массив

while($row = mysql_fetch_assoc($result)) {
    $yourArray[] = $row;
}

А затем используйте это для построения своих таблиц.

edit: Я имел в виду следующее:

while($row = mysql_fetch_assoc($result)) {
    $yourArray[] = $row;
}

echo '<table>';
foreach($yourArray as $i) {
    retrieve_msg_topic($i);
}

echo '<tr><td>';
foreach($yourArray as $i) {
    retrieve_msg_content($i);
}
echo '</tr></td></table>';

А затем удаляет все, что связано с запросом SQL, из этих функций, например так:

function retrieve_msg_topic($result) {
    echo '<tr></td>'$result['usernombre'];

    echo '<div id="msg'.$result['message_id'].'">';
    echo stripslashes($result['message_topic']);
    echo '</div><td></tr>';
}

В данный момент вы выполняете странные клавишные mojo с ret [0] в качестве темы и $ ret [1] в качестве сообщения, что не является хорошей практикой. Кроме того, я не вижу декларации $ i в этом коде.

Ошибка предполагает, что результат пуст или запрос искажен. Я не могу быть уверен из кода, который я видел.

Несколько других замечаний: кажется странным, что вы используете stripslashes () для данных, которые прямо из БД. Вы уверены, что при вставке контента в БД вы не избегаете ничего дважды?

Всегда используйте циклы вместо того, чтобы что-то записывать x раз (как 8 раз, которые вы сказали в своем вопросе). Подумайте о ситуации, когда вам нужно что-то изменить в вызове функции (имя, параметры, что угодно). С петлями нужно отредактировать 1 место. Без, вам нужно редактировать 8 разных мест.

Кстати, еще одно решение этой проблемы - использование AJAX для загрузки контента в последнюю ячейку. Если вам интересно, я мог бы показать вам, как.

больше правок:

Для AJAX создайте свой список сообщений как обычно и оставьте целевой объект пустым. Затем добавьте вызов JQuery AJAX:

$('MSG_LIST_ELEMENT').click(function() {
    var msgId = $(this).attr('id').replace('msg','');
    $.get(AJAX_URL+'?msgID='+msgId,function(data) {
        $('TARGET_TD').html(data);
    })
});

Замените заглавные переменные на те, которые вам нужны. Что касается PHP, просто отобразите содержимое сообщения с идентификатором $ _GET ['msgID']. Тем не менее, убедитесь, что вы аутентифицируете пользователя, прежде чем выводить какие-либо сообщения, чтобы кто-то другой не мог прочитать чьи-либо сообщения, переключая номер идентификатора. Не знаю, как работает аутентификация на вашем сайте, но это можно сделать с помощью переменных сеанса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...