【问题标题】:Retrieving chat messages检索聊天消息
【发布时间】:2015-02-04 18:38:15
【问题描述】:

我正在尝试从我的 phpmyadmin 数据库中获取聊天消息(其中有 2 条消息),但我的查询有问题。这里是:

$query = "SELECT * FROM chat WHERE (user_from='". $_SESSION['username'] ."' AND user_to='". $result['username'] ."') OR (user_from='". $result['username'] ."' AND user_to='". $_SESSION['username'] ."') ORDER BY id DESC";
$chatlog = $db->query($query);
$message = $chatlog->fetch_array(MYSQLI_ASSOC);

运行此代码时:echo $message['message']; 只显示第一条消息,我也尝试过使用 foreach,但这似乎也不起作用。

【问题讨论】:

  • 将 ORDER BY id DESC 更改为 ASC 时,仅显示第二条消息
  • fetch_array 只获取查询的一行(第一行)。您可能希望使用循环将所有行提取到数组中。或者,您可以使用fetch_all if your system supports it。
  • 为了清楚起见:当我说“第一行”时,我仅指您的具体上下文。 fetch_array 获取查询的 next 行,由结果指针的位置标识。在您的情况下,这是第一行。

标签: php sql foreach


【解决方案1】:

您只会收到一条消息,因为这就是 fetch_array 所做的 - 它以数组的形式获取下一条记录。

如果您想获取多条记录,您需要遍历行并为每一行调用fetch_array:

while ($message = $chatlog->fetch_array(MYSQLI_ASSOC)) {
   $messages[] = $message;
}

另外,使用参数化查询或prepared statements 来避免 SQL 注入

【讨论】:

    【解决方案2】:

    非常感谢大家,使用 fetch_all 时它工作了,现在是我的代码:

    $query = "SELECT * FROM chat WHERE (user_from='". $_SESSION['username'] ."' AND user_to='". $result['username'] ."') OR (user_from='". $result['username'] ."' AND user_to='". $_SESSION['username'] ."') ORDER BY id DESC";
    $chatlog = $db->query($query);
    $message = $chatlog->fetch_all(MYSQLI_ASSOC);
    foreach ($message as $chat) {
    echo $chat['message'];
    }
    

    【讨论】:

    • 太棒了!请注意,(according to php.net)fetch_all“可能会消耗更多内存”,需要“会进一步影响性能的循环结构”,并且“仅应在将获取的结果集发送到另一层的情况下使用用于处理”。随心所欲。
    猜你喜欢
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 2013-08-28
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多