2016-03-12 28 views
0

我在messages.php中列出了一个列表,其中显示登录用户($username)拥有的所有活动对话。PHP数组未按预期工作

什么被归类为“积极对话”? (应该在里面列出什么)

  • 假设我以Alice身份登录。 Alice向Fred发送消息,这是一个积极的对话,其中$username(Alice)发送消息给$user(Fred)。
  • 假设我以Alice的身份登录。 Fred向Alice发送消息。这也是一个积极的对话。
  • 摘要:任何消息到$username(登录用户)和任何消息从$username应列出,只有一次。

当前行为:

目前,用下面的代码显示,正在为每个消息发送我(在涉及$usernameprivate_messages表中的每一行)产生的li

例如:

  • 同样,假设我登录的爱丽丝。
  • Alice向Fred发送一条消息 - “Hello Fred”。
  • 生成一个列表元素,陈述Fred的名字。
  • 如果作为Alice向Fred发送另一条消息,它仍然会显示一个li元素为Fred - 哪个好,这是我想要的,作为登录用户,我想看看我正在使用的用户用。
  • 但是,如果我注销,登录Fred,并回复给爱丽丝,它将生成另一个li元素,但这次使用登录的用户凭据,因此将生成一个名为Fred的名字等的li等。
  • 我需要的是所有这一切都在一个li因为对话是在两个人之间。

这是我当前的代码

<?php 
$displayed = []; 
// get number of messages from a specific user to the logged in user 
$get_mess = mysqli_query ($connect, "SELECT * FROM private_messages WHERE message_to = '$username' AND message_from ='$user'"); 
$num_msgs = mysqli_num_rows($get_mess); 

// getting all the conversations which concern the user logged on. 
$con = mysqli_query ($connect, "SELECT * FROM private_messages WHERE message_from='$username' OR message_to='$username'"); 
while ($get_con = mysqli_fetch_assoc($con)){ 
    $msg_from = $get_con['message_from']; 
    $msg_to = $get_con['message_to']; 

    // get other persons firstname  
    $u_name = mysqli_query($connect, "SELECT * FROM users WHERE username ='$msg_to'"); 
    $get_cu = mysqli_fetch_assoc($u_name); 
    $got_ufn = $get_cu['first_name']; 
    $got_uln = $get_cu['last_name'];  

    if ($msg_to == $username || $msg_from == $username){ 
     if(!in_array($msg_to, $displayed)) { 
      echo "<li class='list' role='presentation'> 
         <div class='parent'> 
          <div class='disp_pic'> 
           <img class='img-rounded' src='$profile_pic2'/> 
          </div> 
          <div class='user_d'> 
           <a href='messages.php?u=$msg_from'> $got_ufn $got_uln</a> 
          </div>"; 
      if ($num_msgs == 0){ 
       // dont display badge 
      }else { 
       echo "<span id='num_of_msgs_from' class='badge'>"; 
       if ($user == $user){ 
        $num_msgs == 0; 
        echo "$num_msgs </span>"; 
       }else { 
        echo " $num_msgs </span>"; 
       } 
      } 
      echo" 
       </div> 
      </li>"; 
      $displayed[] = $msg_to; 
     } 
    } 
} // while closed 
?> 
+1

解释什么是不工作,并尝试产生一个[MCVE]。 – axiac

+1

可能是其他(未登录)用户名在'$ msg_from'或'$ msg_to'中。但是你的大部分代码都假设它在'$ msg_to'中。例如,'SELECT * FROM users WHERE username ='$ msg_to''。我的建议是创建一个名为'$ other_user'的变量,并在脚本的顶部有逻辑来确定它是否应该设置为'$ msg_from'或'$ msg_to'。 – mkasberg

+0

另外,这行'if($ msg_to == $ username || $ msg_from == $ username)'什么都不做,因为你在一个总是为真的结果集迭代。 – mkasberg

回答

1

你需要让其他用户像这样的东西:

$other_user = ($msg_to == $username) ? $msg_from : $msg_to; 

而且完整的代码将是这样的:

<?php 
$displayed = []; 
// get number of messages from a specific user to the logged in user 
$get_mess = mysqli_query ($connect, "SELECT * FROM private_messages ". 
    "WHERE message_to = '$username' AND message_from ='$user'"); 
$num_msgs = mysqli_num_rows($get_mess); 

// getting all the conversations which concern the user logged on. 
$con = mysqli_query ($connect, "SELECT * FROM private_messages ". 
    "WHERE message_from='$username' OR message_to='$username'"); 
while ($get_con = mysqli_fetch_assoc($con)){ 
    $msg_from = $get_con['message_from']; 
    $msg_to = $get_con['message_to']; 

    $other_user = ($msg_to == $username) ? $msg_from : $msg_to; 

    // get other persons firstname  
    $u_name = mysqli_query($connect, "SELECT * FROM users ". 
     "WHERE username ='$other_user'"); 
    $get_cu = mysqli_fetch_assoc($u_name); 
    $got_ufn = $get_cu['first_name']; 
    $got_uln = $get_cu['last_name']; 

    if ($msg_to == $username || $msg_from == $username){ 
     if(!in_array($other_user, $displayed)) { 
      echo "<li class='list' role='presentation'> 
         <div class='parent'> 
          <div class='disp_pic'> 
           <img class='img-rounded' src='$profile_pic2'/> 
          </div> 
          <div class='user_d'> 
           <a href='messages.php?u=$other_user'> $got_ufn $got_uln</a> 
          </div>"; 
      if ($num_msgs == 0){ 
       // dont display badge 
      }else { 
       echo "<span id='num_of_msgs_from' class='badge'>"; 
       if ($user == $user){ 
        $num_msgs == 0; 
        echo "$num_msgs </span>"; 
       }else { 
        echo " $num_msgs </span>"; 
       } 
      } 
      echo" 
       </div> 
      </li>"; 
      $displayed[] = $other_user; 
     } 
    } 
} // while closed 
?> 
+0

谢谢,这已经解决了我的一些问题。事情是,它仍然在单独的“li”元素中显示与“其他用户”相同的对话。例如,Alice向Fred发送一条消息,其中一条生成。弗雷德然后答复爱丽丝,这会产生另一个李,即使它是相同的谈话? – Freddy

+0

所以你只需要显示每个对话者一次? –

+0

我改变了这个代码的答案:'$ displayed [] = $ other_user;' –