我正在尝试获取它,以便在通过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是一个数组,但它似乎没有用。
答案 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");
有几个很好的理由可以让数据库对数据进行排序而不是自己尝试:
答案 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;