将数据库列与变量进行比较时出现意外输出

时间:2010-07-20 02:04:34

标签: php

我有从MySQL数据库中检索玩家信息的代码。如果排名发生变化,我想对HTML输出应用特殊情况。我希望它看起来像这样:http://i27.tinypic.com/f406tz.png

但我不能让它像我想要的那样,而是在每一行打印等级:

$old_rank = '';
while ($g = mysql_fetch_object($q)) {

if ($g->rankname != $old_rank) {
    echo "<tr><td>$g->rankname</td>\n";
    $old_rank = "<tr><td>&nbsp;</td>\n";
}

echo " <td>$g->name</td></tr>\n";

}

我想要的是什么:

<tr>
<td>One</td>
<td>Kraven the Hunter</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>Kull the Conqueror</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>Zazi The Beast</td>
</tr>

<tr>
<td>Vice-leader</td>
<td>Igos du Ikana</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>Saint Sinner</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>Midvalley the Hornfreak</td>
</tr>.......................

我得到了什么:

<tr><td>One</td>
<td>Tester</td></tr>
<tr><td>One</td>
<td>Kraven the Hunter</td></tr>
<tr><td>One</td>

<td>Kull the Conqueror</td></tr>
<tr><td>One</td>
<td>Zazi The Beast</td></tr>
<tr><td>Vice-Leader</td>
<td>Midvalley the Hornfreak</td></tr>
<tr><td>Vice-Leader</td>
<td>Saint Sinner

</td></tr>
<tr><td>Vice-Leader</td>
<td>Igos du Ikana</td></tr>

3 个答案:

答案 0 :(得分:6)

$old_rank永远不等于$g->rankname,因为您设置$old_rank的方式,它将包含HTML标记,而您从数据库中获取的$g->rankname将永远不会有HTML标签。

尝试将if语句更改为以下内容:

if ($g->rankname != $old_rank) {
    echo "<tr><td>$g->rankname</td>\n";
    $old_rank = $g->rankname;
} else {
    echo "<tr><td>&nbsp;</td>\n";
}

它打印等级名称如果它是新的等级名称,其他则打印空白空间。

答案 1 :(得分:0)

我更喜欢把事情搞得一团糟。将事物分开使其更容易修改。这应该有用。

$old_rank = '';
while ($g = mysql_fetch_object($q)) {
    echo '<tr>' . "\n";
    echo '<td>';
    if ($g->rankname != $old_rank) {
        $old_rank = $g->rankname;
        echo $old_rank;
    } else {
        echo '&nbsp;';
    }
    echo '</td>';
    echo '<td>' . $g->name . '</td>' . "\n";
    echo '</tr>' . "\n";
}

答案 2 :(得分:0)

以下(尽管有拼写错误)将显示逻辑与数据库循环分开。这有以下优点: - 您无需依赖返回结果的顺序 - 你不需要保持狡猾的逻辑(比如'old_rank') - 你可以更好地显示它们(重复排名的行数

我相信总代码也更紧凑。

// fill ranks array
$ranks = array();
while ( $g = mysql_fetch_object($q) ) {
    if ( !in_array($g->rankname, $ranks) ) {
        $ranks[htmlentities($g->rankname)] = array();
    }
    $ranks[$g->rankname][] = htmlentities($g->name);
}

// do other program logic here

// end of program
?>

<!-- display the page -->
<table>
    <tr>
        <th>Rank</th><th>Users</th>
    </tr>

    <?php foreach($ranks as $rankName => $userList): ?>
        <tr>
            <td rowspan="<?php echo (string)sizeof($userList); ?>">
                <?php echo $rankName; ?>
            </td>
            <td> <?php echo implode('</td></tr><tr><td>', $userList); ?> </td>
        </tr>
    <?php endforeach; ?>
</table>