使用while对查询中的信息进行排序?

时间:2013-02-09 23:56:26

标签: php mysql function sorting loops

我正在尝试获取它,以便在通过messageid显示到页面上之前对从此查询检索到的信息进行排序,我已将其指定为主键。我不断收到这个错误:

Warning: krsort() expects parameter 1 to be array, resource given in ...

这是我的代码:

<?php

$id = $_SESSION[id];
$messages = @mysql_query("SELECT * FROM messages WHERE receiver='$id'");
$messagecount = mysql_num_rows($messages);
krsort($messages);

if ($messagecount == 0)
{
echo "<br>You have no messages.";
}
else
{
while ($messages2 = mysql_fetch_array($messages))
    {
    echo "<table width=800 class=\"normaltable\" cellpadding=\"3\" border=\"0\"><tr>
    <td class=\"tdmessagesubject\"><b>Subject:</b><a href=message.php?id=" .   $messages2['messageid'] . "> " . $messages2['subject'] . "</a></td>
    <td class=\"tdmessagefrom\"><b>From:</b> " . $messages2['sendercallname'] . "</td>   </tr>
    </table>";
    }
 }

?>

我认为$ messages是一个数组,但它似乎没有用。

4 个答案:

答案 0 :(得分:2)

看看the manual page,mysql_query返回resource,而不是数组。

当你在那里时,请阅读那个大红色警告,那个说明mysql_系列函数已弃用的警告,其中包括你不应该在新代码中使用它们。

我还建议忘记更现代的mysqli_ successor并立即跳到PDO - 它是一个现代的,设计良好的API,可用于多个数据库引擎,最后但并非最不重要的是,它使得准备好的陈述是轻而易举的,准备好的陈述可能是对sql injection最便宜但最有效的辩护。

但是回到当天的顺序:当你希望以某种方式对数据库结果集进行排序时,最简单的方法是让数据库服务器对它进行排序,如下所示:

$messages = @mysql_query("SELECT * FROM messages WHERE receiver='$id' order by messageid");

有几个很好的理由可以让数据库对数据进行排序而不是自己尝试:

  • 这样你就不得不在内存中加载整个结果集,效率很低,结果集很大,可能耗尽php可用的内存
  • 如果您的数据库设计得很好,很可能数据已经在您要排序的列上编入索引,这意味着服务器实际上不必在返回数据时对数据进行排序,从而使整个操作成为可能很快。

答案 1 :(得分:1)

您的$messages变量不是数组。要从数据库查询构建消息数组,您应该使用:

$result = @mysql_query("SELECT * FROM messages WHERE receiver='$id'");
$messages = array();
while ($message = mysql_fetch_assoc($result)) {
    $messages[] = $message;
}

您可以在这里找到mysql_fetch_assoc:http://php.net/manual/en/function.mysql-fetch-array.php

的示例用法

如果要在数据库查询中订购消息,则应使用ORDER BY语句。例如:

$result = @mysql_query("SELECT * FROM messages WHERE receiver='$id' ORDER BY id");

答案 2 :(得分:1)

哦,除非你有充分的理由,否则不要使用@来抑制错误。

mysql_query返回一个资源:查询结果。如果要对其进行排序,则需要先将每一行拉出到数组中,或者(更好的解决方案)在查询中使用ORDER BY以按排序顺序获取结果。

答案 3 :(得分:0)

首先我要说的是,在PHP中不推荐使用Mysql,建议使用新的Mysql扩展,Mysqli

然后,您必须从资源中提取结果:

$data = array();
while($row = mysql_fetch_row($messages)) $data[] = $row;