【问题标题】:My data from my loop is being mismatched, not sure why我的循环中的数据不匹配,不知道为什么
【发布时间】:2019-11-03 22:29:49
【问题描述】:

我有一个代码可以在用户之间来回显示消息。出于某种原因,数据不匹配,我不确定我的代码中哪里有错误。我试图改变我的 $x < $sender 的 if 语句,但这没有用。

但显示的数据与数据库信息不一致。

“测试 2”消息是从 woof3 发送的,因此当以 woof 身份登录时,它应该是绿色而不是蓝色。并且“再次测试”是从woof发送的,所以以woof登录时应该是蓝色的

在下面编辑工作代码,没有 pdo,因为我还没有完成这个项目,我将它们保存到最后以使测试更容易。

<?php

include "../Site/db.php";

$url = $_SERVER['REQUEST_URI'];
$urlArray = explode('=', $url);
$Username = $urlArray[sizeof($urlArray) - 1];

$Myself = $_SESSION['username'];

$sql = "SELECT * FROM messages ORDER BY `Id` ASC";
$result = $conn->query($sql);

// Header of message box
echo '<div id="messages" class="messagePersonBox shadow">
        <span class="usersname" name="receiver"><a href="Account?='.$Username.'">'.$Username.'</a></span>
<hr style="margin-top:24px">
<div id="allMessages"class="allMessages">
';

// $sql2 = "SELECT * FROM messages WHERE Sender = '$Myself' ORDER BY `Id` ASC";
// $result2 = $conn->query($sql2);

$sql3 = "SELECT *  FROM messages 
        WHERE (Sender = '$Myself' AND Receiver = '$Username')
           OR (Receiver = '$Myself' AND Sender = '$Username') ORDER BY `MessageTime` ASC";


$result3 = $conn->query($sql3);
print_r($result3);
$x = 0;

$sql4 = "SELECT * FROM messages WHERE Sender = '$Myself'";
$result4 = $conn->query($sql4);

$sql5 = "SELECT * FROM messages WHERE Receiver = '$Myself'";
$result5 = $conn->query($sql5);

$totalSender = mysqli_num_rows($result4);
$totalReceiver = mysqli_num_rows($result5);

// might have to add both totals for while loop
// to get total messages
$totalmessages = mysqli_num_rows($result);

// For receiving
while ($x < $totalmessages) {

    // output data of each row

     if ($result3->num_rows > 0) {
         if ($row = $result3->fetch_assoc()) {
             $Sender = $row['Sender'];
             $Message = $row['Message'];
             $Receiver = $row['Receiver'];
             $TimeSent = $row['MessageTime'];
         }
     }
       $class = $Sender == $Myself ? 'messageDisplay' : 'messageDisplay2';


     // sending a message

         echo '<div id="messages2" class="'.$class.'">'.$Message.'<span style="float: right;margin-top:2px"><font size=1>'.time_elapsed_string($TimeSent).'</span></font></div>';



$x++;
}

// Typing part of message
echo '</div>
      <input type="text" id="messagetosend" name="message" class="messagetype" placeholder="Type a message..."><span id="send" class="messageSend">↩</span>

</div>';
?>

如果需要,我可以添加更多信息。

【问题讨论】:

  • 您的conversationID 不一定是唯一的。如果您有两个名为woof3woof 的用户在聊天怎么办?这可以为他们提供与woofwoof3 相同的对话ID。同样做$Username$Myself会在对方登录时反转。
  • 为什么不使用JOIN,而不是使用这么多查询?
  • @Qirel 对话 ID 是最后一分钟添加的,只是为了测试这个,所以我不需要两个不同的查询。其他两个查询(sql4 和 5)只计算发送的消息和接收的消息。 ,使用 Join 会解决我的数据不匹配问题吗?

标签: php mysql loops if-statement


【解决方案1】:

我建议你退后一步,稍微调整一下这种方法。

例如,您不需要conversationID(至少不是当前格式),因为您可以从SenderReceiver 中扣除它,这样更准确。您也不需要MessageDate,因为MessageTime 是一个包含日期和时间的日期时间值。所以,conversationIDMessageDate 可以被删除。

然后,我们可以清理查询的数量。您希望在您是发件人而其他用户是收件人的情况下获取所有邮件,您是收件人而其他用户是该邮件的发件人。然后我们按日期(而不是 ID!)排序,并根据该行的 Sender 值检查消息是绿色还是蓝色 - 如果发件人是当前,则设置一个带有蓝色值的 $class 变量用户,否则为绿色。

请注意,当输出 HTML 块时,您可以退出 PHP,这样更易​​于阅读(并处理引号)。您还拥有具有相同 ID 的 HTML 元素,这是不允许的。

在处理查询中的变量时,您还应该使用准备好的语句。

<?php

include "../Site/db.php";

$url = $_SERVER['REQUEST_URI'];
$urlArray = explode('=', $url);
$Username = $urlArray[sizeof($urlArray) - 1];

$Myself = $_SESSION['username'];

$sql = "SELECT Message, MessageTime, Sender, Receiver
        FROM messages 
        WHERE (Sender = ? AND Receiver = ?)
           OR (Receiver = ? AND Sender = ?)
        ORDER BY `MessageTime` ASC");
if (!$stmt = $conn->prepare($sql)) {
    error_log($conn->error);
    die("An error occurred fetching messages");
}
$stmt->bind_param("ssss", $Myself, $Username, $Myself, $Username);
$stmt->bind_result($message, $timeSent, $sender, $received);
if (!$stmt->execute()) {
    error_log($stmt->error);
    die("An error occurred fetching messages");
}
?>
<!-- Header of message box -->
<div id="messages" class="messagePersonBox shadow">
    <span class="usersname" name="receiver"><a href="Account?=<?php echo $Username; ?>"><?php echo $Username; ?></a></span>
    <hr style="margin-top:24px">
    <div id="allMessages" class="allMessages">
        <?php 
        while ($stmt->fetch()) {
            $class = $sender == $Myself ? 'messageDisplay' : 'messageDisplay1'; // Check which class should be used; if I'm the sender, show messageDisplay, if not show MessageDisplay1 
            ?>
            <div class="<?php echo $class; ?>
                <?php echo $message; ?>
                <span style="float: right; margin-top: 2px">
                    <?php echo time_elapsed_string($timeSent); ?>
                </span>
            </div>
            <?php 
        }
        ?>
    <!-- Typing part of message -->
    </div>
    <input type="text" id="messagetosend" name="message" class="messagetype" placeholder="Type a message..."><span id="send" class="messageSend">↩</span>
</div>
<?php 
$stmt->close();

【讨论】:

  • 感谢您提供帮助并提供有关准备好的语句的有用提示,我将确保从现在开始这样做。我收到了一个错误`未捕获的错误:在 C:\Xammp\htdocs\SocialMedia\Admin\Users\message.php:17 中调用布尔值上的成员函数 bind_param() 堆栈跟踪:#0 C:\Xammp\htdocs \SocialMedia\Site\Account.php(890): include() #1 {main} 在第 17 行的 C:\Xammp\htdocs\SocialMedia\Admin\Users\message.php 中抛出,我不确定这是什么意味着因为我从来没有真正使用过准备好的语句
  • 表示$stmt为假,因为查询失败。请参阅我修改后的代码以捕获这些错误(然后检查您的错误日志)。
  • 当做$sql = "SELECT Message, MessageTime, Sender, Receiver FROM messages WHERE (Sender = 'woof' AND Receiver = 'woof3') OR (Receiver = 'woof' AND Sender = 'woof3') ORDER BY MessageTime`ASC)";`尽管实际上是相同的值,但它仍然显示为假。我在将数据输入数据库之前修剪了空格,因为我之前遇到过这个问题。编码时。
  • 就像我说的,检查你的错误日志(现在添加了error_log()),它们更有帮助。在查询中留下问号,您会得到实际的错误消息。
  • 我认为问题在于我将此代码用作单独的文件,然后为它执行 php include,因此这两个文件上的代码存在冲突。
猜你喜欢
  • 2018-06-05
  • 1970-01-01
  • 2022-10-23
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
相关资源
最近更新 更多