1

学生が投稿しているフォーラムがあります。学生がメインの投稿に返信すると、postId は 0 に設定されます。学生が別の学生の投稿に返信すると、postId は学生の元の投稿の replyId に設定されます。

投稿 ID が返信 ID に設定されている場合を除き、基本的に各投稿に対して新しいテーブルを作成する PHP を作成しようとしています。そのテーブルに新しい行を作成します。

ここで見つけることができる SQLFiddle に配置された SQL があります。

http://sqlfiddle.com/#!2/611e2d/5

この例を使用して、私が探しているのは、新しい html テーブルに配置される replyid 1 であり、その下の新しい行に応答 ID 3 があります。次に、ReplyId 2 を使用して、新しい html テーブルを作成します。

これは、回答の基本的なスレッド形式のフォーラム ビューです。

ありがとうございました!

[コード]

    $i = 0;
    $aR = 0;
    $currentPost = '';

    if(mysql_num_rows($getResponses) > 0)
        {
        while($respData = mysql_fetch_array($getResponses))
            {

            if(($respData['postId'] != $currentPost)) 
                {
                if($i!=0)  
                    {  
                    echo '</table><br /><br />';            
                    } 


                echo '<table width = "875px" cellspacing = "0" cellpadding = "0" border = "0">';

                $i=0;
                }

        $currentPost = $respData['postId'];

        $color_A = 'class="altRow1"'; 
        $color_B = 'class="altRow2"';

        $altRowColor = ($aR % 2) ? $color_A : $color_B;

        $studentName = getStudents($respData['userId']);
        $studentName = explode(" ", $studentName);
        $studentFirstName = $studentName[0];

        echo '<tr ' . $altRowColor . '>
                <td align="center" width = "225px" class="forumTopic"><img src="images/'.getStudentPics($respData['userId']).'.png" /><br />Posted By ' . getStudents($respData['userId']) . '<br />on '.date("m/d/Y h:i a", strtotime($respData['responseDate'])) . '</td>
                <td width = "650px" class="forumTopic">' . $respData['replyText'] . '</td>
            </tr>
            <tr ' . $altRowColor . '>
                <td class="forumTopic" colspan = "2" align="center"><span class="topicLinkStyle"><a href="postResponse.php?postId='.$respData['replyId'].'&topic='.$topicId.'" class="iframe750x600">Reply to '.$studentFirstName .'</a></span></td>
            </tr>';


        $i++;
        $aR++;
        }

    echo '</table><br /><br />';
    }
4

2 に答える 2

2

これは非常に簡単な例です。独自の CSS を作成して HTML をフォーマットすることができます。例としてコメントに投稿したリンクを使用することもできます。

buildTree、後で簡単に使用できるようにツリー形式で適切に応答を並べ替え、printTree再帰的に出力します。

<?php    
// Your database info
$db_host = '';
$db_user = '';
$db_pass = '';
$db_name = '';

if (!isset($_GET['topic_id']))
{
    die('No topic id was given.');
}

$con = new PDO("mysql:host={$db_host};dbname={$db_name}", $db_user, $db_pass);
$con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$sql = "SELECT replyId,
               topicId,
               postId,
               replyText,
               responseDate,
               userId 
          FROM forumResponses 
         WHERE topicId = ? 
      ORDER BY replyId";
$result = $con->prepare($sql);
$result->bindParam(1, $_GET['topic_id'], PDO::PARAM_INT);
$result->execute();

if ($result->rowCount() == 0)
{
    die('No messages found...');
}

$threads = array();
while($row = $result->fetchALL(PDO::FETCH_ASSOC))
{
    $threads = $row;
}

$data = buildTree($threads);

$con = NULL;

function buildTree($ar, $pid = NULL) {
    $op = array();
    foreach($ar as $item)
    {
        if($item['postId'] == $pid)
        {
            $op[$item['replyId']] = array(
                'replyText' => $item['replyText'],
                'userId' => $item['userId'],
                'responseDate' => $item['responseDate'],
                'parentId' => $item['postId']
            );
            // using recursion
            $children =  buildTree($ar, $item['replyId']);
            if($children)
            {
                $op[$item['replyId']]['children'] = $children;
            }
        }
    }
    return $op;
}

function printTree($ar)
{
    foreach ($ar as $reply)
    {
?>
        <li>
          <div>
            <header><a href="javascript:void(0);">userId <?php echo $reply['userId']; ?></a> - <?php echo $reply['responseDate']; ?></header>
            <?php echo $reply['replyText']; ?>
          </div>
<?php
        if (isset($reply['children']) && count($reply['children']) > 0)
        {
             echo "     <ul>\n";
             printTree($reply['children']);
             echo "     </ul>\n";
        }
        echo "        </li>\n";
    }
}

?>
<!doctype html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  <title>Threaded Comments Block</title>
</head>

<body>
  <div>
    <h1>Reading Topic <?php echo $_GET['topic_id']; ?></h1>
    <div>
      <ul>
<?php
printTree($data);
?>
      </ul>
    </div>
  </div>
</body>
</html>

注: 上記のコードは、結果をスレッド化された方法で保存し、印刷する方法の例を示すだけのものです。この例から独自のものを作成する必要があります。

于 2013-09-03T05:12:56.073 に答える