2010-07-20 3 views
0

J'ai un code qui récupère des informations sur les lecteurs d'une base de données MySQL. Je veux appliquer un cas particulier à la sortie HTML si leur classement change. Je veux qu'il ressemble à ceci: http://i27.tinypic.com/f406tz.pngSortie inattendue lors de la comparaison de la colonne de la base de données à la variable

Mais je ne peux pas obtenir ce soit comme je veux, au lieu qu'il imprime le rang tous les rangs:

$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"; 

} 

Ce que je veux:

<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>....................... 

ce que je reçois:

<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> 

Répondre

6

$old_rank est jamais égal à $g->rankname parce que la façon dont vous définissez $old_rank, il contiendra des balises HTML, et le $g->rankname que vous obtenez de la base de données n'aura jamais de balises HTML.

Essayez de changer votre instruction if à quelque chose comme ceci:

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

Il imprime le nom du rang si c'est un nouveau nom de rang, autre il imprime un espace vide.

0

Je préfère casser les choses un peu plus que ça. Garder les choses séparées rend plus facile à modifier. Cela devrait fonctionner.

$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"; 
} 
0

Les points suivants (malgré les fautes de frappe) séparent la logique d'affichage de la boucle de la base de données. Cela a les avantages: - Vous n'avez pas besoin de dépendre de l'ordre des résultats retournés - Vous n'avez pas besoin de maintenir une logique douteuse (comme 'old_rank') - Vous pouvez les afficher plus joliment (avec un rowspan pour les grades répétés

Je crois que le code total est trop compact.

// 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> 
Questions connexes