0

このクエリから取得した情報が、主キーとして割り当てたメッセージIDによってページに表示される前に並べ替えられるように取得しようとしています。しかし、私はこのエラーを受け取り続けます:

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

4 に答える 4

2

マニュアルページを見てください。mysql_queryはresource配列ではなく配列を返します。

そして、そこにいる間に、mysql_ファミリーの関数が非推奨になったことを示す大きな赤い脂肪の警告を読んでください。これは、とりわけ、新しいコードでそれらを使用して はならないことを意味します。

また、最新のmysqli_後継者を忘れて、すぐにPDOにスキップすることをお勧めします。これは最新の適切に設計されたAPIであり、複数のデータベースエンジンで使用できます。最後に、プリペアドステートメントの操作が簡単になります。ステートメントは、おそらく最も安価ですが、SQLインジェクションに対する最も効果的な防御です。

しかし、その日の順序に戻ります。データベースの結果セットを何らかの方法で順序付けする場合、最も簡単な方法は、次のようにデータベースサーバーに並べ替えさせることです。

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

dbにデータをソートさせ、自分でソートさせないようにする理由はいくつかあります。

  • そうすると、結果セット全体をメモリにロードする必要があります。これは非効率的であり、結果セットが大きいと、phpで使用可能なメモリを使い果たす可能性があります。
  • データベースが適切に設計されている場合は、並べ替える列でデータのインデックスが作成されている可能性があります。つまり、サーバーがデータを返すときに実際にデータを並べ替える必要がないため、操作全体が大幅に高速化されます。
于 2013-02-10T00:02:16.307 に答える
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");
于 2013-02-10T00:01:43.597 に答える
1

@本当に正当な理由がない限り、エラーを抑制するために使用しないでください。

mysql_queryリソースを返します:クエリ結果。並べ替える場合は、最初にすべての行を配列に抽出するか、(より適切な解決策として)ORDER BYクエリで使用して結果を並べ替えた順序で取得する必要があります。

于 2013-02-10T00:02:04.807 に答える
0

最初に、MysqlはPHPで非推奨になっていると言いたいのですが、新しいMysql拡張機能であるMysqliを使用することをお勧めします。

次に、リソースから結果を抽出する必要があります。

$data = array();
while($row = mysql_fetch_row($messages)) $data[] = $row;
于 2013-02-10T00:02:07.197 に答える