1

次の問題があります。メッセージ、コメント、ユーザーの 3 つのテーブルがあります。PHP で、MySQL データベースの次のフィールドのデータを Web ページのテーブルとして出力したいと考えています: message.subject、user.username、そしてコメント数。他のすべては正常に動作しますが、PHP にコメント数を出力させることができませんでした。

これは私がこれまでにやろうとしたことです:

<?php
 include("info.php");
 $connect;
 $sql="SELECT * FROM message, user
       WHERE message.userID = user.userID AND 
       ORDER BY message.messageID DESC";
 $result=mysql_query($sql) or die(mysql_error());

 $sql2="SELECT message.messageID, COUNT(*) as comments FROM comment 
        INNER JOIN
        message ON comment.messageID = message.messageID 
        GROUP BY comment.messageID";
 $result2=mysql_query($sql2) or die(mysql_error());

<table>
 <thead>
  <tr>
   <th>Subject</th>   
   <th>Sender</th>
   <th>Number of comments</th>
  </tr>
 </thead>
 <tbody>
  <?php
   while($rows=mysql_fetch_array($result)){
  ?>
  <tr>
   <td>
    <a href="php/message.php?id=<?php echo $rows['messageID']; ?>">
    <?php echo $rows['subject']; ?>
   </td>
   <td>
    <?php echo $rows['username']; ?>
   </td>                        
   <td>
    <?php while($rows2=mysql_fetch_array($result2)){ echo $rows2['comments'];}?>
   </td>
  </tr>
 <?php
 } mysql_close(); ?>
 </tbody>
</table>
4

5 に答える 5

2

1 回のクエリでこのすべての情報を取得できませんでしたか?

SELECT
    m.messageID,
    m.subject,
    u.username,
    c.numOfComments
FROM
    message m
    INNER JOIN user u ON m.userID = u.userID
    LEFT JOIN (SELECT COUNT(1) AS numOfComments, messageID FROM comments GROUP BY messageID) c ON m.messageID = c.messageID
ORDER BY
    m.messageID DESC

このスクリプトを試してください:

<?php
    include("info.php");
    connect();
    $sql = "
        SELECT
            m.messageID,
            m.subject,
            u.username,
            c.numOfComments
        FROM
            message m
            INNER JOIN user u ON m.userID = u.userID
            LEFT JOIN (SELECT COUNT(1) AS numOfComments, messageID FROM comments GROUP BY messageID) c ON m.messageID = c.messageID
        ORDER BY
            m.messageID DESC
    ";
    $result = mysql_query($sql) or die(mysql_error());

    echo "<table>
    <thead>
        <tr>
            <th>Subject</th>
            <th>Sender</th>
            <th>Number of comments</th>
        </tr>
    </thead>
    <tbody>\n";
    while ($row = mysql_fetch_assoc($result))
    {
        $row = array_map("htmlspecialchars", $row); // sanitize to prevent XSS

        echo "      <tr>
            <td><a href=\"php/message.php?id={$row["messageID"]}\">{$row["subject"]}</a></td>
            <td>{$row["username"]}</td>
            <td>{$row["numOfComments"]}</td>
        </tr>\n";
    }
    echo "  </tbody>
</table>";
?>

他にもいくつか修正があります。たとえば、リンクに終了</a>タグがなく、スクリプトが XSS 攻撃に対して脆弱である可能性があります。さらに、入れ子になった while ループがあり、不要な複雑さとバグを引き起こしていました。

于 2012-05-17T17:26:55.913 に答える
0

これはそれを行うための最良の方法です(私は思う):

$sql = "
SELECT message.*, user.*, commentsCounter.comments FROM message

INNER JOIN user
ON user.userID = message.userID

INNER JOIN ( SELECT COUNT( 1 ) as comments, comment.messageID FROM comment GROUP BY comment.messageID ) commentsCounter
ON commentsCounter.messageID = message.messageID

ORDER BY message.messageID DESC
";
于 2012-05-17T17:28:08.133 に答える
0

次のようなことをしてみませんか?

$query = "SELECT comment FROM message where userId = $userId";

$result = mysql_query($query);

$numberOfComments = mysql_num_rows($result);

echo "$numberOfComments";

少なくとも私はそれがあなたが探しているものだと思いますか?

マニュアルでは、mysql_num_rows()について次のように述べています。

mysql_num_rows — 結果の行数を取得する

于 2012-05-17T17:28:13.950 に答える
0

私が見る問題は、while ループをネストしていることです。参照してください: http://www.php.net/manual/en/control-structures.while.php#52733

1 つの SQL ステートメントを使用します。

于 2012-05-17T17:27:17.003 に答える
0

http://www.w3schools.com/sql/sql_func_count.asp

$result3=mysql_query("COUNT(*) FROM comment") or die(mysql_error());
$row=mysql_fetch_array($result3);
$numcomments = $row[0];
echo $numcomments;

私はこれを(別のテーブル名で)いくつかのサイトで使用しています。

答え 2

特定の投稿にコメントが必要だと仮定すると、次のようにしてみてください。

$result3=mysql_query("SELECT DISTINCT message.messageID FROM comment ") or die(mysql_error());
$row=mysql_fetch_array($result3);
$numcomments = count($row);
echo $numcomments;
于 2012-05-17T17:27:34.370 に答える