【问题标题】:Display personal messages list显示个人消息列表
【发布时间】:2011-12-15 20:08:51
【问题描述】:

我的网站中有一个个人消息系统,只需使用 php/sql 完成。实际上,我遇到了使用 jquery 显示它们的麻烦。数据库具有以下字段:message_idmessage_frommessage_tomessage_topicmessage_subjectmessage_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,但我最终得到了一种手风琴,这不是我想要的。

我希望我已经足够清楚了。

【问题讨论】:

    标签: php jquery css message


    【解决方案1】:

    解决问题的最简单方法是将 MySQL 查询的结果复制到数组中

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

    然后用它来构建你的表。

    编辑:我的意思更像是这样的:

    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>';
    }
    

    现在您正在使用 ret[0] 作为主题而 $ret[1] 作为消息来做一些奇怪的 key mojo,这不是一个好习惯。另外,我在该代码中的任何地方都没有看到 $i 的声明。

    错误提示结果为空或查询格式错误。从我看到的代码中我无法确定。

    其他一些注意事项:您对直接来自数据库的数据使用 stripslashes() 似乎很奇怪。您确定在将内容插入数据库时​​没有两次转义内容吗?

    总是使用循环而不是写出 x 次(就像你在问题中所说的 8 次)。考虑一种情况,您必须更改函数调用的某些内容(名称、参数等)。使用循环,您必须编辑 1 个位置。如果没有,您需要编辑 8 个不同的地方。

    顺便说一句,这个问题的另一个解决方案是使用 AJAX 将内容加载到最后一个单元格中。如果你好奇,我可以告诉你怎么做。

    更多编辑:

    对于 AJAX,像往常一样构建您的消息列表并将目标 td 留空。然后,添加一个 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,只需回显 ID 为 $_GET['msgID'] 的消息内容。 但是,请确保在回显任何消息之前对用户进行身份验证,这样其他人就无法通过切换 id 号来阅读某人的消息。不确定身份验证在您的网站上是如何工作的,但这可以通过使用会话变量来完成。

    【讨论】:

    • :-?我喜欢你的想法,即使我没有那么多地使用数组。谢谢!!!!
    • 我需要更多帮助!如果我更改 if 一段时间,我会在 while 所在的行得到“mysql_fetch_assoc():提供的参数不是有效的 MySQL 结果资源”。此外,它只工作一次(对于第一条消息): function retrieve_msg_topic($result){ while($row=mysql_fetch_assoc($result)) {$topic_ret= 'something'; $message_ret= '别的东西'; $ret[$i]=$topic_ret; $i++; $ret[$i]=$message_ret; $i++;} } 返回 ($ret);} $ret = retrieve_msg_topic($result);回声 $ret[0];
    • 是的,它有效,但我很好奇!您将如何使用 Ajax 来处理它?我会提供帮助,因为我需要将消息的状态从未读更改为已读或删除,而且除了 AJAX 之外我别无选择。
    • 你太棒了,塞洛斯!!谢谢!!
    • 最后一个问题,所以我不会白白工作!如果我添加了其他功能,例如“删除”和“未读粗体”,如果我使用 AJAX,它们会在不刷新页面的情况下反映吗??
    猜你喜欢
    • 2011-01-27
    • 1970-01-01
    • 2014-06-01
    • 2013-10-06
    • 1970-01-01
    • 2020-12-05
    • 2012-04-29
    • 2011-06-14
    • 1970-01-01
    相关资源
    最近更新 更多